uatomic/x86: Remove redundant memory barriers master
authorOlivier Dion <odion@efficios.com>
Tue, 22 Aug 2023 20:23:17 +0000 (16:23 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 12 Apr 2024 20:12:02 +0000 (16:12 -0400)
When liburcu is configured to _not_ use atomic builtins, the
implementation of atomic operations is done using inline assembler for
each architecture.

Because we control the emitted assembler, we know whether specific
operations (e.g. lock; cmpxchg) already have an implicit memory barrier.
In those cases, emitting an explicit cmm_smp_mb() before/after the
operation is redundant and hurts performance.

Remove those redundant barriers on x86.

Change-Id: Ic1f6cfe9c2afe250946549cf6187f8fa88f5b009
Signed-off-by: Olivier Dion <odion@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
581 files changed:
.gitignore
.gitreview [new file with mode: 0644]
ChangeLog
CodingStyle [deleted file]
CodingStyle.md [new file with mode: 0644]
LICENSE [deleted file]
LICENSE.md [new file with mode: 0644]
LICENSES/Autoconf-exception-2.0.txt [new file with mode: 0644]
LICENSES/BSD-2-Clause.txt [new file with mode: 0644]
LICENSES/CC-BY-4.0.txt [new file with mode: 0644]
LICENSES/CC0-1.0.txt [new file with mode: 0644]
LICENSES/FSFAP.txt [new file with mode: 0644]
LICENSES/GPL-2.0-only.txt [new file with mode: 0644]
LICENSES/GPL-2.0-or-later.txt [new file with mode: 0644]
LICENSES/GPL-3.0-or-later.txt [new file with mode: 0644]
LICENSES/LGPL-2.1-only.txt [new file with mode: 0644]
LICENSES/LGPL-2.1-or-later.txt [new file with mode: 0644]
LICENSES/LicenseRef-Autoconf-exception-macro.txt [new file with mode: 0644]
LICENSES/LicenseRef-Boehm-GC.txt [new file with mode: 0644]
LICENSES/MIT.txt [new file with mode: 0644]
Makefile.am
README.md
bootstrap
config/tap-driver.sh [deleted file]
configure.ac
doc/Makefile.am
doc/cds-api.md
doc/examples/Makefile.am
doc/examples/Makefile.examples.template
doc/examples/dist-files/Makefile
doc/examples/hlist/Makefile
doc/examples/hlist/Makefile.cds_hlist_add_head_rcu
doc/examples/hlist/Makefile.cds_hlist_del_rcu
doc/examples/hlist/Makefile.cds_hlist_for_each_entry_rcu
doc/examples/hlist/Makefile.cds_hlist_for_each_rcu
doc/examples/hlist/cds_hlist_add_head_rcu.c
doc/examples/hlist/cds_hlist_del_rcu.c
doc/examples/hlist/cds_hlist_for_each_entry_rcu.c
doc/examples/hlist/cds_hlist_for_each_rcu.c
doc/examples/lfstack/Makefile
doc/examples/lfstack/Makefile.cds_lfs_pop_all_blocking
doc/examples/lfstack/Makefile.cds_lfs_pop_blocking
doc/examples/lfstack/Makefile.cds_lfs_push
doc/examples/lfstack/cds_lfs_pop_all_blocking.c
doc/examples/lfstack/cds_lfs_pop_blocking.c
doc/examples/lfstack/cds_lfs_push.c
doc/examples/list/Makefile
doc/examples/list/Makefile.cds_list_add_rcu
doc/examples/list/Makefile.cds_list_add_tail_rcu
doc/examples/list/Makefile.cds_list_del_rcu
doc/examples/list/Makefile.cds_list_for_each_entry_rcu
doc/examples/list/Makefile.cds_list_for_each_rcu
doc/examples/list/Makefile.cds_list_replace_rcu
doc/examples/list/cds_list_add_rcu.c
doc/examples/list/cds_list_add_tail_rcu.c
doc/examples/list/cds_list_del_rcu.c
doc/examples/list/cds_list_for_each_entry_rcu.c
doc/examples/list/cds_list_for_each_rcu.c
doc/examples/list/cds_list_replace_rcu.c
doc/examples/rculfhash/Makefile
doc/examples/rculfhash/Makefile.cds_lfht_add
doc/examples/rculfhash/Makefile.cds_lfht_add_replace
doc/examples/rculfhash/Makefile.cds_lfht_add_unique
doc/examples/rculfhash/Makefile.cds_lfht_del
doc/examples/rculfhash/Makefile.cds_lfht_destroy
doc/examples/rculfhash/Makefile.cds_lfht_for_each_entry_duplicate
doc/examples/rculfhash/Makefile.cds_lfht_lookup
doc/examples/rculfhash/cds_lfht_add.c
doc/examples/rculfhash/cds_lfht_add_replace.c
doc/examples/rculfhash/cds_lfht_add_unique.c
doc/examples/rculfhash/cds_lfht_del.c
doc/examples/rculfhash/cds_lfht_destroy.c
doc/examples/rculfhash/cds_lfht_for_each_entry_duplicate.c
doc/examples/rculfhash/cds_lfht_lookup.c
doc/examples/rculfhash/jhash.h
doc/examples/rculfqueue/Makefile
doc/examples/rculfqueue/Makefile.cds_lfq_dequeue
doc/examples/rculfqueue/Makefile.cds_lfq_enqueue
doc/examples/rculfqueue/cds_lfq_dequeue.c
doc/examples/rculfqueue/cds_lfq_enqueue.c
doc/examples/urcu-flavors/Makefile
doc/examples/urcu-flavors/Makefile.bp
doc/examples/urcu-flavors/Makefile.mb
doc/examples/urcu-flavors/Makefile.membarrier
doc/examples/urcu-flavors/Makefile.qsbr
doc/examples/urcu-flavors/Makefile.signal [deleted file]
doc/examples/urcu-flavors/bp.c
doc/examples/urcu-flavors/mb.c
doc/examples/urcu-flavors/membarrier.c
doc/examples/urcu-flavors/qsbr.c
doc/examples/urcu-flavors/signal.c [deleted file]
doc/examples/wfcqueue/Makefile
doc/examples/wfcqueue/Makefile.cds_wfcq_dequeue
doc/examples/wfcqueue/Makefile.cds_wfcq_enqueue
doc/examples/wfcqueue/Makefile.cds_wfcq_splice
doc/examples/wfcqueue/cds_wfcq_dequeue.c
doc/examples/wfcqueue/cds_wfcq_enqueue.c
doc/examples/wfcqueue/cds_wfcq_splice.c
doc/examples/wfstack/Makefile
doc/examples/wfstack/Makefile.cds_wfs_pop
doc/examples/wfstack/Makefile.cds_wfs_pop_all_blocking
doc/examples/wfstack/Makefile.cds_wfs_push
doc/examples/wfstack/cds_wfs_pop.c
doc/examples/wfstack/cds_wfs_pop_all_blocking.c
doc/examples/wfstack/cds_wfs_push.c
doc/rcu-api.md
doc/solaris-build.md
doc/uatomic-api.md
extras/Makefile.am [new file with mode: 0644]
extras/abi/0.10/x86_64-pc-linux-gnu/liburcu-bp.so.6.xml [new file with mode: 0644]
extras/abi/0.10/x86_64-pc-linux-gnu/liburcu-cds.so.6.xml [new file with mode: 0644]
extras/abi/0.10/x86_64-pc-linux-gnu/liburcu-common.so.6.xml [new file with mode: 0644]
extras/abi/0.10/x86_64-pc-linux-gnu/liburcu-mb.so.6.xml [new file with mode: 0644]
extras/abi/0.10/x86_64-pc-linux-gnu/liburcu-qsbr.so.6.xml [new file with mode: 0644]
extras/abi/0.10/x86_64-pc-linux-gnu/liburcu-signal.so.6.xml [new file with mode: 0644]
extras/abi/0.10/x86_64-pc-linux-gnu/liburcu.so.6.xml [new file with mode: 0644]
extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-bp.so.6.xml [new file with mode: 0644]
extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-cds.so.6.xml [new file with mode: 0644]
extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-common.so.6.xml [new file with mode: 0644]
extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-mb.so.6.xml [new file with mode: 0644]
extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-memb.so.6.xml [new file with mode: 0644]
extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-qsbr.so.6.xml [new file with mode: 0644]
extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-signal.so.6.xml [new file with mode: 0644]
extras/abi/0.11/x86_64-pc-linux-gnu/liburcu.so.6.xml [new file with mode: 0644]
extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-bp.so.6.xml [new file with mode: 0644]
extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-cds.so.6.xml [new file with mode: 0644]
extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-common.so.6.xml [new file with mode: 0644]
extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-mb.so.6.xml [new file with mode: 0644]
extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-memb.so.6.xml [new file with mode: 0644]
extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-qsbr.so.6.xml [new file with mode: 0644]
extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-signal.so.6.xml [new file with mode: 0644]
extras/abi/0.12/x86_64-pc-linux-gnu/liburcu.so.6.xml [new file with mode: 0644]
extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-bp.so.8.xml [new file with mode: 0644]
extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-cds.so.8.xml [new file with mode: 0644]
extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-common.so.8.xml [new file with mode: 0644]
extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-mb.so.8.xml [new file with mode: 0644]
extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-memb.so.8.xml [new file with mode: 0644]
extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-qsbr.so.8.xml [new file with mode: 0644]
extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-signal.so.8.xml [new file with mode: 0644]
extras/abi/0.13/x86_64-pc-linux-gnu/liburcu.so.8.xml [new file with mode: 0644]
extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-bp.so.8.xml [new file with mode: 0644]
extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-cds.so.8.xml [new file with mode: 0644]
extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-common.so.8.xml [new file with mode: 0644]
extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-mb.so.8.xml [new file with mode: 0644]
extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-memb.so.8.xml [new file with mode: 0644]
extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-qsbr.so.8.xml [new file with mode: 0644]
extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-signal.so.8.xml [new file with mode: 0644]
extras/abi/0.14/x86_64-pc-linux-gnu/liburcu.so.8.xml [new file with mode: 0644]
extras/abi/0.9/x86_64-pc-linux-gnu/liburcu-bp.so.4.xml [new file with mode: 0644]
extras/abi/0.9/x86_64-pc-linux-gnu/liburcu-cds.so.4.xml [new file with mode: 0644]
extras/abi/0.9/x86_64-pc-linux-gnu/liburcu-common.so.4.xml [new file with mode: 0644]
extras/abi/0.9/x86_64-pc-linux-gnu/liburcu-mb.so.4.xml [new file with mode: 0644]
extras/abi/0.9/x86_64-pc-linux-gnu/liburcu-qsbr.so.4.xml [new file with mode: 0644]
extras/abi/0.9/x86_64-pc-linux-gnu/liburcu-signal.so.4.xml [new file with mode: 0644]
extras/abi/0.9/x86_64-pc-linux-gnu/liburcu.so.4.xml [new file with mode: 0644]
extras/abi/README.md [new file with mode: 0644]
extras/abi/dump_abi.sh [new file with mode: 0755]
gpl-2.0.txt [deleted file]
include/Makefile.am
include/urcu-bp.h
include/urcu-call-rcu.h
include/urcu-defer.h
include/urcu-flavor.h
include/urcu-pointer.h
include/urcu-qsbr.h
include/urcu.h
include/urcu/annotate.h [new file with mode: 0644]
include/urcu/arch.h [new file with mode: 0644]
include/urcu/arch/aarch64.h
include/urcu/arch/alpha.h
include/urcu/arch/arm.h
include/urcu/arch/gcc.h
include/urcu/arch/generic.h
include/urcu/arch/hppa.h
include/urcu/arch/ia64.h
include/urcu/arch/loongarch.h [new file with mode: 0644]
include/urcu/arch/m68k.h
include/urcu/arch/mips.h
include/urcu/arch/nios2.h
include/urcu/arch/ppc.h
include/urcu/arch/riscv.h
include/urcu/arch/s390.h
include/urcu/arch/sparc64.h
include/urcu/arch/tile.h
include/urcu/arch/unknown.h [deleted file]
include/urcu/arch/x86.h
include/urcu/assert.h [new file with mode: 0644]
include/urcu/call-rcu.h
include/urcu/cds.h
include/urcu/compiler.h
include/urcu/config.h.in
include/urcu/debug.h
include/urcu/defer.h
include/urcu/flavor.h
include/urcu/futex.h
include/urcu/hlist.h
include/urcu/lfstack.h
include/urcu/list.h
include/urcu/map/clear.h
include/urcu/map/urcu-bp.h
include/urcu/map/urcu-mb.h
include/urcu/map/urcu-memb.h
include/urcu/map/urcu-qsbr.h
include/urcu/map/urcu-signal.h [deleted file]
include/urcu/map/urcu.h
include/urcu/pointer.h
include/urcu/rcuhlist.h
include/urcu/rculfhash.h
include/urcu/rculfqueue.h
include/urcu/rculfstack.h
include/urcu/rculist.h
include/urcu/ref.h
include/urcu/static/lfstack.h
include/urcu/static/pointer.h
include/urcu/static/rculfqueue.h
include/urcu/static/rculfstack.h
include/urcu/static/urcu-bp.h
include/urcu/static/urcu-common.h
include/urcu/static/urcu-mb.h
include/urcu/static/urcu-memb.h
include/urcu/static/urcu-qsbr.h
include/urcu/static/urcu-signal-nr.h [deleted file]
include/urcu/static/urcu-signal.h [deleted file]
include/urcu/static/urcu.h
include/urcu/static/wfcqueue.h
include/urcu/static/wfqueue.h
include/urcu/static/wfstack.h
include/urcu/syscall-compat.h
include/urcu/system.h
include/urcu/tls-compat.h
include/urcu/uatomic.h [new file with mode: 0644]
include/urcu/uatomic/aarch64.h
include/urcu/uatomic/alpha.h
include/urcu/uatomic/arm.h
include/urcu/uatomic/builtins-generic.h [new file with mode: 0644]
include/urcu/uatomic/builtins.h [new file with mode: 0644]
include/urcu/uatomic/gcc.h
include/urcu/uatomic/generic.h
include/urcu/uatomic/hppa.h
include/urcu/uatomic/ia64.h
include/urcu/uatomic/loongarch.h [new file with mode: 0644]
include/urcu/uatomic/m68k.h
include/urcu/uatomic/mips.h
include/urcu/uatomic/nios2.h
include/urcu/uatomic/ppc.h
include/urcu/uatomic/riscv.h
include/urcu/uatomic/s390.h
include/urcu/uatomic/sparc64.h
include/urcu/uatomic/tile.h
include/urcu/uatomic/unknown.h [deleted file]
include/urcu/uatomic/x86.h
include/urcu/uatomic_arch.h
include/urcu/urcu-bp.h
include/urcu/urcu-futex.h
include/urcu/urcu-mb.h
include/urcu/urcu-memb.h
include/urcu/urcu-poll.h [new file with mode: 0644]
include/urcu/urcu-qsbr.h
include/urcu/urcu-signal.h [deleted file]
include/urcu/urcu.h
include/urcu/urcu_ref.h
include/urcu/wfcqueue.h
include/urcu/wfqueue.h
include/urcu/wfstack.h
lgpl-2.1.txt [deleted file]
lgpl-relicensing.md [new file with mode: 0644]
lgpl-relicensing.txt [deleted file]
m4/ae_cc_atomic_builtins.m4 [new file with mode: 0644]
m4/ae_config_feature.m4 [new file with mode: 0644]
m4/ae_pprint.m4 [new file with mode: 0644]
m4/ax_append_compile_flags.m4 [new file with mode: 0644]
m4/ax_append_flag.m4 [new file with mode: 0644]
m4/ax_c___attribute__.m4
m4/ax_check_compile_flag.m4 [new file with mode: 0644]
m4/ax_cxx_compile_stdcxx.m4 [new file with mode: 0644]
m4/ax_pthread.m4
m4/ax_require_defined.m4 [new file with mode: 0644]
m4/ax_tls.m4 [deleted file]
m4/pprint.m4 [deleted file]
scripts/urcu-api-list.sh
src/Makefile.am
src/compat-getcpu.h
src/compat-rand.h [deleted file]
src/compat-smp.h [new file with mode: 0644]
src/compat_arch.c [new file with mode: 0644]
src/compat_arch_x86.c [deleted file]
src/compat_futex.c
src/lfstack.c
src/liburcu-bp.pc.in
src/liburcu-cds.pc.in
src/liburcu-mb.pc.in
src/liburcu-memb.pc.in [new file with mode: 0644]
src/liburcu-qsbr.pc.in
src/liburcu-signal.pc.in [deleted file]
src/liburcu.pc.in
src/rculfhash-internal.h
src/rculfhash-mm-chunk.c
src/rculfhash-mm-mmap.c
src/rculfhash-mm-order.c
src/rculfhash.c
src/rculfqueue.c
src/rculfstack.c
src/urcu-bp.c
src/urcu-call-rcu-impl.h
src/urcu-defer-impl.h
src/urcu-die.h
src/urcu-pointer.c
src/urcu-poll-impl.h [new file with mode: 0644]
src/urcu-qsbr.c
src/urcu-utils.h
src/urcu-wait.h
src/urcu.c
src/wfcqueue.c
src/wfqueue.c
src/wfstack.c
src/workqueue.c
src/workqueue.h
tests/Makefile.am
tests/benchmark/Makefile.am
tests/benchmark/common-states.c [new file with mode: 0644]
tests/benchmark/common-states.h [new file with mode: 0644]
tests/benchmark/common.sh [deleted file]
tests/benchmark/hashtable_1_seconds.tap
tests/benchmark/hashtable_30_seconds.tap
tests/benchmark/hashtable_3_seconds.tap
tests/benchmark/run-urcu-tests.sh
tests/benchmark/runhash.sh
tests/benchmark/runpaul-phase1.sh
tests/benchmark/runpaul-phase2.sh
tests/benchmark/runpaul-phase3.sh
tests/benchmark/runpaul-phase4.sh
tests/benchmark/runpaul-phase5.sh
tests/benchmark/runpaul-phase6.sh
tests/benchmark/runpaul-phase7.sh
tests/benchmark/runtests-batch.sh
tests/benchmark/runtests.sh
tests/benchmark/subphase4.sh
tests/benchmark/test_cycles_per_loop.c
tests/benchmark/test_looplen.c
tests/benchmark/test_mutex.c
tests/benchmark/test_perthreadlock.c
tests/benchmark/test_perthreadlock_timing.c
tests/benchmark/test_rwlock.c
tests/benchmark/test_rwlock_timing.c
tests/benchmark/test_urcu.c
tests/benchmark/test_urcu_assign.c
tests/benchmark/test_urcu_bp.c
tests/benchmark/test_urcu_defer.c
tests/benchmark/test_urcu_gc.c
tests/benchmark/test_urcu_hash.c
tests/benchmark/test_urcu_hash.h
tests/benchmark/test_urcu_hash_rw.c
tests/benchmark/test_urcu_hash_unique.c
tests/benchmark/test_urcu_lfq.c
tests/benchmark/test_urcu_lfs.c
tests/benchmark/test_urcu_lfs_rcu.c
tests/benchmark/test_urcu_qsbr.c
tests/benchmark/test_urcu_qsbr_gc.c
tests/benchmark/test_urcu_qsbr_timing.c
tests/benchmark/test_urcu_timing.c
tests/benchmark/test_urcu_wfcq.c
tests/benchmark/test_urcu_wfq.c
tests/benchmark/test_urcu_wfs.c
tests/benchmark/urcu_1_seconds.tap
tests/benchmark/urcu_30_seconds.tap
tests/benchmark/urcu_3_seconds.tap
tests/common/Makefile.am
tests/common/api.h
tests/common/compat-rand.h [new file with mode: 0644]
tests/common/cpuset.h [deleted file]
tests/common/debug-yield.c
tests/common/debug-yield.h
tests/common/thread-id.h
tests/regression/Makefile.am
tests/regression/rcutorture.h
tests/regression/rcutorture_urcu_bp_perf_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_bp_perf_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_bp_perf_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_bp_rperf_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_bp_rperf_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_bp_rperf_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_bp_stress_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_bp_stress_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_bp_stress_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_bp_uperf_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_bp_uperf_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_bp_uperf_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_mb_perf_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_mb_perf_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_mb_perf_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_mb_rperf_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_mb_rperf_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_mb_rperf_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_mb_stress_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_mb_stress_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_mb_stress_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_mb_uperf_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_mb_uperf_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_mb_uperf_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_membarrier_perf_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_membarrier_perf_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_membarrier_perf_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_membarrier_rperf_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_membarrier_rperf_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_membarrier_rperf_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_membarrier_stress_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_membarrier_stress_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_membarrier_stress_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_membarrier_uperf_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_membarrier_uperf_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_membarrier_uperf_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_qsbr_perf_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_qsbr_perf_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_qsbr_perf_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_qsbr_rperf_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_qsbr_rperf_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_qsbr_rperf_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_qsbr_stress_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_qsbr_stress_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_qsbr_stress_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_qsbr_uperf_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_qsbr_uperf_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_qsbr_uperf_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_signal_perf_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_signal_perf_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_signal_perf_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_signal_rperf_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_signal_rperf_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_signal_rperf_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_signal_stress_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_signal_stress_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_signal_stress_perthread.tap.in [deleted file]
tests/regression/rcutorture_urcu_signal_uperf_global.tap.in [deleted file]
tests/regression/rcutorture_urcu_signal_uperf_percpu.tap.in [deleted file]
tests/regression/rcutorture_urcu_signal_uperf_perthread.tap.in [deleted file]
tests/regression/test_rcutorture_urcu_bp_perf_global.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_perf_global_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_perf_percpu.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_perf_percpu_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_perf_perthread.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_perf_perthread_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_rperf_global.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_rperf_global_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_rperf_percpu.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_rperf_percpu_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_rperf_perthread.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_rperf_perthread_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_stress_global.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_stress_global_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_stress_percpu.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_stress_percpu_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_stress_perthread.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_stress_perthread_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_uperf_global.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_uperf_global_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_uperf_percpu.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_uperf_percpu_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_uperf_perthread.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_bp_uperf_perthread_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_perf_global.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_perf_global_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_perf_percpu.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_perf_percpu_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_perf_perthread.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_perf_perthread_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_rperf_global.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_rperf_global_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_rperf_percpu.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_rperf_percpu_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_rperf_perthread.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_rperf_perthread_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_stress_global.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_stress_global_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_stress_percpu.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_stress_percpu_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_stress_perthread.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_stress_perthread_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_uperf_global.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_uperf_global_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_uperf_percpu.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_uperf_percpu_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_uperf_perthread.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_mb_uperf_perthread_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_perf_global.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_perf_global_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_perf_percpu.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_perf_percpu_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_perf_perthread.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_perf_perthread_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_rperf_global.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_rperf_global_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_rperf_percpu.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_rperf_percpu_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_rperf_perthread.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_rperf_perthread_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_stress_global.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_stress_global_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_stress_percpu.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_stress_percpu_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_stress_perthread.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_stress_perthread_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_uperf_global.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_uperf_global_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_uperf_percpu.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_uperf_percpu_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_uperf_perthread.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_membarrier_uperf_perthread_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_perf_global.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_perf_global_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_perf_percpu.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_perf_percpu_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_perf_perthread.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_perf_perthread_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_rperf_global.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_rperf_global_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_rperf_percpu.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_rperf_percpu_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_rperf_perthread.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_rperf_perthread_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_stress_global.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_stress_global_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_stress_percpu.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_stress_percpu_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_stress_perthread.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_stress_perthread_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_uperf_global.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_uperf_global_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_uperf_percpu.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_uperf_percpu_cxx.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_uperf_perthread.tap [new file with mode: 0755]
tests/regression/test_rcutorture_urcu_qsbr_uperf_perthread_cxx.tap [new file with mode: 0755]
tests/regression/test_urcu_fork.c
tests/regression/test_urcu_fork_cxx.cpp [new file with mode: 0644]
tests/regression/urcutorture.c
tests/regression/urcutorture_cxx.cpp [new file with mode: 0644]
tests/unit/Makefile.am
tests/unit/get_cpu_mask_from_sysfs.c [new file with mode: 0644]
tests/unit/get_cpu_mask_from_sysfs_cxx.cpp [new file with mode: 0644]
tests/unit/get_max_cpuid_from_sysfs.c [new file with mode: 0644]
tests/unit/get_max_cpuid_from_sysfs_cxx.cpp [new file with mode: 0644]
tests/unit/test_arch.c [new file with mode: 0644]
tests/unit/test_arch_cxx.cpp [new file with mode: 0644]
tests/unit/test_build.c [new file with mode: 0644]
tests/unit/test_build_cxx.cpp [new file with mode: 0644]
tests/unit/test_get_cpu_mask_from_sysfs [new file with mode: 0755]
tests/unit/test_get_cpu_mask_from_sysfs_cxx [new file with mode: 0755]
tests/unit/test_get_max_cpuid_from_mask.c [new file with mode: 0644]
tests/unit/test_get_max_cpuid_from_mask_cxx.cpp [new file with mode: 0644]
tests/unit/test_get_max_cpuid_from_sysfs [new file with mode: 0755]
tests/unit/test_get_max_cpuid_from_sysfs_cxx [new file with mode: 0755]
tests/unit/test_get_possible_cpus_array_len.c [new file with mode: 0644]
tests/unit/test_get_possible_cpus_array_len_cxx.cpp [new file with mode: 0644]
tests/unit/test_lfstack.c [new file with mode: 0644]
tests/unit/test_uatomic.c
tests/unit/test_uatomic_cxx.cpp [new file with mode: 0644]
tests/unit/test_urcu_multiflavor-bp.c
tests/unit/test_urcu_multiflavor-bp_cxx.cpp [new file with mode: 0644]
tests/unit/test_urcu_multiflavor-mb.c
tests/unit/test_urcu_multiflavor-mb_cxx.cpp [new file with mode: 0644]
tests/unit/test_urcu_multiflavor-memb.c
tests/unit/test_urcu_multiflavor-memb_cxx.cpp [new file with mode: 0644]
tests/unit/test_urcu_multiflavor-qsbr.c
tests/unit/test_urcu_multiflavor-qsbr_cxx.cpp [new file with mode: 0644]
tests/unit/test_urcu_multiflavor-signal.c [deleted file]
tests/unit/test_urcu_multiflavor.c
tests/unit/test_urcu_multiflavor.h
tests/unit/test_urcu_multiflavor_cxx.cpp [new file with mode: 0644]
tests/unit/test_urcu_multiflavor_single_unit.c
tests/unit/test_urcu_multiflavor_single_unit_cxx.cpp [new file with mode: 0644]
tests/unit/test_wfcqueue.c [new file with mode: 0644]
tests/unit/test_wfqueue.c [new file with mode: 0644]
tests/unit/test_wfstack.c [new file with mode: 0644]
tests/unit/urcu-asm.c
tests/unit/urcu-asm_cxx.cpp [new file with mode: 0644]
tests/utils/Makefile.am
tests/utils/env.sh.in [new file with mode: 0644]
tests/utils/tap-driver.sh [new file with mode: 0755]
tests/utils/tap.c
tests/utils/tap.h
tests/utils/tap.sh
tests/utils/utils.sh [new file with mode: 0755]

index e54aefddaf6aa3b9fdd50c6be764186f21bfe163..8b3a2abaac85ae3c923689feb4caf886ef003c68 100644 (file)
@@ -1,24 +1,51 @@
-include/urcu/arch.h
-include/urcu/uatomic.h
+# SPDX-FileCopyrightText: 2009-2022 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
+
 tests/api.h
 
 
 tests/unit/urcu-asm.S
 tests/api.h
 
 
 tests/unit/urcu-asm.S
+tests/unit/test_arch
+tests/unit/test_arch_cxx
+tests/unit/test_build
+tests/unit/test_build_cxx
+tests/unit/test_build_dynlink
+tests/unit/test_build_dynlink_cxx
 tests/unit/test_uatomic
 tests/unit/test_uatomic
+tests/unit/test_uatomic_cxx
 tests/unit/test_urcu_multiflavor
 tests/unit/test_urcu_multiflavor
+tests/unit/test_urcu_multiflavor_cxx
 tests/unit/test_urcu_multiflavor_dynlink
 tests/unit/test_urcu_multiflavor_dynlink
+tests/unit/test_urcu_multiflavor_dynlink_cxx
 tests/unit/test_urcu_multiflavor_single_unit
 tests/unit/test_urcu_multiflavor_single_unit
+tests/unit/test_urcu_multiflavor_single_unit_cxx
 tests/unit/test_urcu_multiflavor_single_unit_dynlink
 tests/unit/test_urcu_multiflavor_single_unit_dynlink
+tests/unit/test_urcu_multiflavor_single_unit_dynlink_cxx
+tests/unit/get_cpu_mask_from_sysfs
+tests/unit/get_cpu_mask_from_sysfs_cxx
+tests/unit/get_max_cpuid_from_sysfs
+tests/unit/get_max_cpuid_from_sysfs_cxx
+tests/unit/test_get_max_cpuid_from_mask
+tests/unit/test_get_max_cpuid_from_mask_cxx
+tests/unit/test_get_possible_cpus_array_len
+tests/unit/test_get_possible_cpus_array_len_cxx
 
 tests/utils/libtap.a
 
 tests/utils/libtap.a
+tests/utils/env.sh
 
 
-tests/regression/rcutorture_urcu_membarrier
 tests/regression/rcutorture_urcu_bp
 tests/regression/rcutorture_urcu_bp
+tests/regression/rcutorture_urcu_bp_cxx
 tests/regression/rcutorture_urcu_mb
 tests/regression/rcutorture_urcu_mb
+tests/regression/rcutorture_urcu_mb_cxx
+tests/regression/rcutorture_urcu_membarrier
+tests/regression/rcutorture_urcu_membarrier_cxx
 tests/regression/rcutorture_urcu_qsbr
 tests/regression/rcutorture_urcu_qsbr
+tests/regression/rcutorture_urcu_qsbr_cxx
 tests/regression/rcutorture_urcu_signal
 tests/regression/rcutorture_urcu_signal
+tests/regression/rcutorture_urcu_signal_cxx
+tests/regression/test_urcu_fork_cxx.tap
 tests/regression/test_urcu_fork.tap
 tests/regression/test_urcu_fork.tap
-tests/regression/rcutorture*.tap
 
 tests/benchmark/test_rwlock_timing
 tests/benchmark/test_urcu
 
 tests/benchmark/test_rwlock_timing
 tests/benchmark/test_urcu
@@ -126,7 +153,6 @@ doc/examples/rculfhash/cds_lfht_for_each_entry_duplicate
 .deps/
 .libs/
 Makefile.in
 .deps/
 .libs/
 Makefile.in
-Makefile
 *.la
 *.bz2
 *.o
 *.la
 *.bz2
 *.o
@@ -162,4 +188,18 @@ liburcu-bp.pc
 liburcu-cds.pc
 liburcu-qsbr.pc
 liburcu-mb.pc
 liburcu-cds.pc
 liburcu-qsbr.pc
 liburcu-mb.pc
+liburcu-memb.pc
 liburcu-signal.pc
 liburcu-signal.pc
+
+/Makefile
+/doc/Makefile
+/doc/examples/Makefile
+/extras/Makefile
+/include/Makefile
+/src/Makefile
+/tests/Makefile
+/tests/benchmark/Makefile
+/tests/common/Makefile
+/tests/regression/Makefile
+/tests/unit/Makefile
+/tests/utils/Makefile
diff --git a/.gitreview b/.gitreview
new file mode 100644 (file)
index 0000000..c197662
--- /dev/null
@@ -0,0 +1,11 @@
+# SPDX-FileCopyrightText: 2020 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
+
+[gerrit]
+host=review.lttng.org
+port=29418
+project=userspace-rcu.git
+defaultbranch=master
+defaultremote=review
+defaultrebase=0
index 5605205baa3c171646638a66e3d14cd057c947db..a7fd3497dbf9d213876c1eed188a4b669ebe9dcc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,165 @@
+# SPDX-FileCopyrightText: 2011-2023 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+#
+# SPDX-License-Identifier: CC-BY-4.0
+
+2023-02-14 Userspace RCU 0.14.0
+       * Fix: urcu-bp: only teardown call-rcu worker in destructor
+       * Fix: rculfhash: urcu_die() takes positive error value
+       * Fix: call_rcu: teardown default call_rcu worker on application exit
+       * Fix: join worker thread in call_rcu_data_free
+       * Docs: clarify grace period polling API
+       * Document grace period polling in rcu-api.md
+       * Implement poll rcu stress test in rcutorture
+       * urcu-memb,mb,signal: Implement grace period polling
+       * Fix: auto-resize hash table destroy deadlock
+       * Fix building on MSYS2
+       * rculfhash: Include rculfhash-internal.h from local directory
+       * Remove "Darwin" from "should also work on list"
+       * Merge branch 'adah1972-improve-md'
+       * Add semicolons at the end of function prototypes
+       * Wrap a file name in backticks
+       * Wrap command-line options in backticks
+       * Fix a wrong format
+       * Wrap URLs in angle brackets
+       * Fix Markdown issues
+       * Fix: Always check pthread_create for failures
+       * Disable signals in URCU background threads
+       * Fix: futex.h: include headers outside extern C
+       * Fix: add missing unused attribute to _rcu_dereference
+       * Fix: change method used by _rcu_dereference to strip type constness
+       * Fix: remove type constness in URCU_FORCE_CAST's C++ version
+       * Move extern "C" down in include/urcu/urcu-bp.h
+       * fix: ifdef linux specific cpu count compat
+       * Add unit tests for possible_cpus_array_len
+       * fix: sysconf(_SC_NPROCESSORS_CONF) can be less than max cpu id
+       * Fix: revise obsolete command in README.md
+       * Fix: workqueue: remove unused variable "ret"
+       * Fix: urcu-qsbr: futex wait: handle spurious futex wakeups
+       * Fix: urcu: futex wait: handle spurious futex wakeups
+       * Fix: urcu-wait: futex wait: handle spurious futex wakeups
+       * Fix: defer_rcu: futex wait: handle spurious futex wakeups
+       * Fix: call_rcu: futex wait: handle spurious futex wakeups
+       * Fix: workqueue: futex wait: handle spurious futex wakeups
+       * Fix: Use %lu rather than %ld to print count
+       * Update ABI definition files
+       * Bump version current and age
+       * alpha: allocate membarrier system call number
+       * Bump version to 0.14.0-pre
+       * Improved test framework
+       * rculfhash: introduce cds_lfht_node_init_deleted
+       * Fix: changelog: v0.13.0 was released in 2021
+       * cleanup: i386 arch detection
+       * fix: properly detect 'cmpxchg' on x86-32
+       * fix: use urcu-tls compat with c++ compiler
+       * Fix typo
+       * fix: remove autoconf features default value in help message
+       * fix: add missing pkgconfig file for memb flavour lib
+       * Cleanup: Tests: Remove useless pre-C99 compatibility code from tap.h
+       * Document C99 and C++11 requirement in README.md
+       * Always use '__thread' for Thread local storage except on MSVC
+       * Fix: powerpc32: transparent unions alter calling convention
+       * fix: don't use C++ thread_local on MacOs
+       * wfcqueue API: implement overloaded wrappers with templates
+       * wfcqueue: combine C++ API cds_wfcq_head_cast with overloading
+       * wfstack C++ API: implement overloaded wrappers with templates
+       * lfstack C++ API: implement overloaded wrappers with templates
+       * wfstack: combine C++ API cds_wfs_stack_cast with overloading
+       * lfstack: combine C++ API cds_lfs_stack_cast with overloading
+       * fix: test_build tap plan
+       * Test C++ build of list head init
+       * Fix order of initializers in CDS_LIST_HEAD_INIT
+       * unit tests: test wfcqueue, wfstack, lfstack empty check functions in C++
+       * wfcqueue: implement C++ API based on function overloading
+       * wfstack: implement C++ API based on function overloading
+       * lfstack: implement C++ API based on function overloading
+       * Fix tap.h: remove extra semicolon in pass/fail macros
+       * Add C++ build tests
+       * Build and run regression and unit tests as C++ programs
+       * Add --enable-Werror configure switch
+       * Add `urcu_posix_assert()` as `assert()` replacement
+       * Rename `urcu_assert()` to `urcu_assert_debug()`
+       * cleanup: spelling fixes in comments
+       * Make temporary variable in _rcu_dereference non-const
+       * (tls-ie2) Fix: x86 and s390: uatomic __hp() macro C++ support
+       * Fix: x86 and s390: uatomic __hp() macro clang support
+       * Fix: x86 and s390 uatomic: __hp() macro warning with gcc 11
+
+2021-06-03 Userspace RCU 0.13.0
+       * Document known ABI issue in README.md
+       * Add serialized ABI definition files
+       * bump SONAME major to 8
+       * Remove all SONAME(6) ABI aliases
+       * .gitignore: list ignored Makefiles
+       * tests: Add a simple compile test for caa_get_cycles
+       * fix: clock_gettime on macOs
+       * Fix: rculist header: use parenthesis around macro parameters
+       * Fix: rcuhlist header: use parenthesis around macro parameters
+       * Fix: hlist header: use parenthesis around macro parameters
+       * Fix: list.h: use parenthesis around macro parameters, caa_container_of()
+       * Fix: hlist iteration relies on undefined behavior
+       * Fix: use __atomic_load() rather than atomic load explicit
+       * Fix: use atomic load memory_order_consume for rcu_dereference on C11/C++11
+       * fix: we used weak symbols not weak aliases
+       * fix: include 'sys/endian.h' on FreeBSD
+       * fix: warnings on non-Linux platforms
+       * fix: HAVE_SCHED_SETAFFINITY is not defined
+       * configure: enable extended compiler warnings
+       * cleanup: explicitly mark unused parameters (-Wunused-parameter)
+       * fix: shadowed local variable (-Wshadow)
+       * cleanup: all functions have declarations (-Wmissing-prototypes)
+       * Import libtap from babeltrace
+       * cleanup: add 'noreturn' attribute to '_uatomic_link_error'
+       * fix: add missing 'S' to AC_CHECK_PROGS
+       * README.md: Document supported Glibc version
+       * README: cleanup stale MacOS information
+       * Bump version to 0.13.0-pre
+       * configure: standardise include path
+       * Remove glibc < 2.4 compat code for sched_setaffinity
+       * configure: regroup automake conditionals
+       * Introduce AE_FEATURE to manage configure features
+       * configure: regroup library checks
+       * configure: regroup and expand C header and program checks
+       * configure: regroup and expand C compiler checks
+       * configure: host specific config
+       * tests: Move tap-driver.sh out of the autotools aux directory
+       * configure: Set autotools baseline
+       * configure: centralize version information
+       * fix: exclude clang from GCC version blacklists
+       * aarch64: blacklist gcc prior to 5.1
+       * Fix: configure: support Autoconf 2.70
+       * Don't force a target and optimization level on ARMv7
+       * Use DMB only on ARMv7
+       * Blacklist GCC 4.4.0, 4.4.1 and 4.4.2 on ARM
+       * Cleanup: Move ARM specific code to urcu/arch/arm.h
+       * fix: bump tests thread limit to 4096
+       * fix: reorder x86 arch detection
+       * fix: typo in futex syscall define check
+       * Compile time futex syscall detection
+       * Static arch and uatomic headers
+       * Add git-review config
+       * cleanup: Improve wording of CONFIG_RCU_DEBUG description
+       * fix: explicitly include urcu/config.h in files using CONFIG_RCU_ defines
+       * Fix typo in README.md
+       * fix: add -lurcu-common to pkg-config libs for each flavor
+       * call_rcu: Fix race between rcu_barrier() and call_rcu_data_free()
+       * Cleanup: tls-compat.h: add parentheses around expression (coding style)
+       * Fix: tls-compat.h exposes compiler-dependent public configuration
+       * Fix: tap array subscript has type char warning
+
+2020-04-09 Userspace RCU 0.12.0
+       * tls-compat.h: introduce DEFINE_URCU_TLS_INIT
+       * Use _umtx_op for futex on FreeBSD
+       * Add FreeBSD, DragonFly to syscall-compat.h
+       * urcu-bp: perform thread registration on urcu_bp_register_thread
+       * Require automake >= 1.12
+       * cds_lfht_is_node_deleted parameter can be marked const
+       * Fix: provide errno as argument to urcu_die()
+       * Fix: rculfhash worker needs to unblock to SIGRCU
+       * Cleanup: test_perthreadlock_timing: handle pthread mutex errors
+       * Fix: SONAME bump to 6.1.0
+       * Cleanup: remove unused variable from configure.ac check
+       * Fix: urcu/futex.h: users of struct timespec should include time.h
+
 2019-05-06 Userspace RCU 0.11.0
        * Bump library version to 6:0:1
        * Cleanup: update code layout to fix old gcc warning
 2019-05-06 Userspace RCU 0.11.0
        * Bump library version to 6:0:1
        * Cleanup: update code layout to fix old gcc warning
diff --git a/CodingStyle b/CodingStyle
deleted file mode 100644 (file)
index 5a33e8d..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-Userspace RCU Coding Style
-
-The coding style used for this project follows the Linux kernel
-guide lines. Please refer to:
-
-- Linux kernel Documentation/CodingStyle document for details,
-- Linux kernel scripts/checkpatch.pl for a script which verify the patch
-  coding style.
-
-Mathieu Desnoyers, May 30, 2012
diff --git a/CodingStyle.md b/CodingStyle.md
new file mode 100644 (file)
index 0000000..d2ad79a
--- /dev/null
@@ -0,0 +1,16 @@
+<!--
+SPDX-FileCopyrightText: 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+
+SPDX-License-Identifier: CC-BY-4.0
+-->
+
+# Userspace RCU Coding Style
+
+The coding style used for this project follows the Linux kernel
+guide lines. Please refer to:
+
+- Linux kernel Documentation/CodingStyle document for details,
+- Linux kernel scripts/checkpatch.pl for a script which verify the patch
+  coding style.
+
+Mathieu Desnoyers, May 30, 2012
diff --git a/LICENSE b/LICENSE
deleted file mode 100644 (file)
index a06fdcc..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,63 +0,0 @@
-Userspace RCU library licensing
-Mathieu Desnoyers
-September 3, 2012
-
-
-* LGPLv2.1
-
-The library part is distributed under LGPLv2.1 or later. See lgpl-2.1.txt for
-license details. Refer to the individual file headers for details.
-
-LGPL-compatible source code can statically use the library header using :
-
-#define _LGPL_SOURCE
-#include <urcu.h>
-
-Dynamic-only linking with the LGPL library is used if _LGPL_SOURCE is not
-defined. It permits relinking with newer versions of the library, which is
-required by the LGPL license.
-
-See lgpl-relicensing.txt for details.
-
-
-* MIT-style license :
-
-xchg() primitive has been rewritten from scratch starting from atomic_ops 1.2
-which has a MIT-style license that is intended to allow use in both free and
-proprietary software:
-       http://www.hpl.hp.com/research/linux/atomic_ops/LICENSING.txt
-       http://www.hpl.hp.com/personal/Hans_Boehm/gc/gc_source/
-
-This MIT-style license (BSD like) apply to:
-
-uatomic/gcc.h
-uatomic/unknown.h
-uatomic/generic.h
-uatomic/sparc64.h
-uatomic/arm.h
-uatomic/ppc.h
-uatomic/x86.h
-uatomic.h
-
-MIT/X11 (BSD like) license apply to:
-
-compiler.h
-arch/s390.h
-uatomic/alpha.h
-uatomic/mips.h
-uatomic/nios2.h
-uatomic/s390.h
-system.h
-
-
-* GPLv2
-
-Library test code is distributed under the GPLv2 license. See gpl-2.0.txt for
-license details. See headers of individual files under tests/ for details.
-
-
-* GPLv3 (or later)
-
-The following build-related macro is under GPLv3 (or later):
-
-m4/ax_tls.m4
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644 (file)
index 0000000..6a5d204
--- /dev/null
@@ -0,0 +1,64 @@
+# Userspace RCU library licensing
+
+This project is compliant with the [REUSE](https://reuse.software/spec/)
+specification, each file contains [SPDX](https://spdx.org/specifications) tags,
+the full licenses can be found in the `LICENSES/` directory.
+
+
+## Library code
+
+The library part is distributed under `LGPL-2.1-or-later`. See
+`LICENSES/LGPL-2.1-or-later.txt` for license details. Refer to the individual
+file headers for details.
+
+LGPL-compatible source code can statically use the library header using :
+
+````
+#define _LGPL_SOURCE
+#include <urcu.h>
+````
+
+Dynamic-only linking with the LGPL library is used if `_LGPL_SOURCE` is not
+defined. It permits relinking with newer versions of the library, which is
+required by the LGPL license.
+
+See `lgpl-relicensing.md` for details.
+
+
+## Headers
+
+Most headers are also distributed under `LGPL-2.1-or-later`, some include code
+from `atomic_ops` and are distributed under `Boehm-GC` and some others are
+distributed under `MIT`. Refer to the individual file headers for details.
+
+xchg() primitive has been rewritten from scratch starting from `atomic_ops 1.2`
+which has a MIT-style license that is intended to allow use in both free and
+proprietary software:
+
+````
+http://www.hpl.hp.com/research/linux/atomic_ops/LICENSING.txt
+http://www.hpl.hp.com/personal/Hans_Boehm/gc/gc_source/
+````
+
+
+## Tests
+
+Library test code is distributed under the `GPL-2.0-only` license. See
+`LICENSES/GPL-2.0-only.txt` for license details. See headers of individual
+files under `tests/` for details.
+
+
+## Documentation
+
+The documentation is distributed under the `CC-BY-4.0` license.
+
+
+## Build system
+
+Build system related files are mostly distributed under the `MIT` license. See
+headers of individual files for details.
+
+
+## Generated data files
+
+Generated data files are distributed under the `CC-1.0` license.
diff --git a/LICENSES/Autoconf-exception-2.0.txt b/LICENSES/Autoconf-exception-2.0.txt
new file mode 100644 (file)
index 0000000..00cddeb
--- /dev/null
@@ -0,0 +1,5 @@
+As a special exception, the Free Software Foundation gives unlimited permission to copy, distribute and modify the configure scripts that are the output of Autoconf. You need not follow the terms of the GNU General Public License when using or distributing such scripts, even though portions of the text of Autoconf appear in them. The GNU General Public License (GPL) does govern all other use of the material that constitutes the Autoconf program.
+
+Certain portions of the Autoconf source text are designed to be copied (in certain cases, depending on the input) into the output of Autoconf. We call these the "data" portions. The rest of the Autoconf source text consists of comments plus executable code that decides which of the data portions to output in any given case. We call these comments and executable code the "non-data" portions. Autoconf never copies any of the non-data portions into its output.
+
+This special exception to the GPL applies to versions of Autoconf released by the Free Software Foundation. When you make and distribute a modified version of Autoconf, you may extend this special exception to the GPL to apply to your modified version as well, *unless* your modified version has the potential to copy into its output some of the text that was the non-data portion of the version that you started with. (In other words, unless your change moves or copies text from the non-data portions to the data portions.) If your modification has such potential, you must delete any notice of this special exception to the GPL from your modified version.
diff --git a/LICENSES/BSD-2-Clause.txt b/LICENSES/BSD-2-Clause.txt
new file mode 100644 (file)
index 0000000..5f662b3
--- /dev/null
@@ -0,0 +1,9 @@
+Copyright (c) <year> <owner> 
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/LICENSES/CC-BY-4.0.txt b/LICENSES/CC-BY-4.0.txt
new file mode 100644 (file)
index 0000000..13ca539
--- /dev/null
@@ -0,0 +1,156 @@
+Creative Commons Attribution 4.0 International
+
+ Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible.
+
+Using Creative Commons Public Licenses
+
+Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses.
+
+Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors.
+
+Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public.
+
+Creative Commons Attribution 4.0 International Public License
+
+By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.
+
+Section 1 – Definitions.
+
+     a.        Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.
+
+     b.        Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.
+
+     c.        Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
+
+     d.        Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.
+
+     e.        Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.
+
+     f.        Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.
+
+     g.        Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.
+
+     h.        Licensor means the individual(s) or entity(ies) granting rights under this Public License.
+
+     i.        Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.
+
+     j.        Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.
+
+     k.        You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.
+
+Section 2 – Scope.
+
+     a.        License grant.
+
+          1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:
+
+               A. reproduce and Share the Licensed Material, in whole or in part; and
+
+               B. produce, reproduce, and Share Adapted Material.
+
+          2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.
+
+          3. Term. The term of this Public License is specified in Section 6(a).
+
+          4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.
+
+          5. Downstream recipients.
+
+               A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.
+
+               B. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.
+
+          6.  No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).
+
+b. Other rights.
+
+          1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.
+
+          2. Patent and trademark rights are not licensed under this Public License.
+
+          3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties.
+
+Section 3 – License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the following conditions.
+
+     a.        Attribution.
+
+          1. If You Share the Licensed Material (including in modified form), You must:
+
+               A. retain the following if it is supplied by the Licensor with the Licensed Material:
+
+                    i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);
+
+                    ii. a copyright notice;
+
+                    iii. a notice that refers to this Public License;
+
+                    iv.        a notice that refers to the disclaimer of warranties;
+
+                    v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable;
+
+               B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and
+
+               C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.
+
+          2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.
+
+          3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.
+
+          4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License.
+
+Section 4 – Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:
+
+     a.        for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database;
+
+     b.        if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and
+
+     c.        You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.
+For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.
+
+Section 5 – Disclaimer of Warranties and Limitation of Liability.
+
+     a.        Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.
+
+     b.        To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.
+
+     c.        The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.
+
+Section 6 – Term and Termination.
+
+     a.        This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.
+
+     b.        Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:
+
+          1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or
+
+          2. upon express reinstatement by the Licensor.
+
+     c.        For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.
+
+     d.        For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.
+
+     e.        Sections 1, 5, 6, 7, and 8 survive termination of this Public License.
+
+Section 7 – Other Terms and Conditions.
+
+     a.        The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.
+
+     b.        Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.
+
+Section 8 – Interpretation.
+
+     a.        For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.
+
+     b.        To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.
+
+     c.        No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.
+
+     d.        Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.
+
+Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.
+
+Creative Commons may be contacted at creativecommons.org.
diff --git a/LICENSES/CC0-1.0.txt b/LICENSES/CC0-1.0.txt
new file mode 100644 (file)
index 0000000..0e259d4
--- /dev/null
@@ -0,0 +1,121 @@
+Creative Commons Legal Code
+
+CC0 1.0 Universal
+
+    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+    LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+    ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+    INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+    REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+    PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+    THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+    HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without fear
+of later claims of infringement build upon, modify, incorporate in other
+works, reuse and redistribute as freely as possible in any form whatsoever
+and for any purposes, including without limitation commercial purposes.
+These owners may contribute to the Commons to promote the ideal of a free
+culture and the further production of creative, cultural and scientific
+works, or to gain reputation or greater distribution for their Work in
+part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or she
+is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under its
+terms, with knowledge of his or her Copyright and Related Rights in the
+Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+  i. the right to reproduce, adapt, distribute, perform, display,
+     communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or performer(s);
+iii. publicity and privacy rights pertaining to a person's image or
+     likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a Work,
+     subject to the limitations in paragraph 4(a), below;
+  v. rights protecting the extraction, dissemination, use and reuse of data
+     in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+     European Parliament and of the Council of 11 March 1996 on the legal
+     protection of databases, and under any national implementation
+     thereof, including any amended or successor version of such
+     directive); and
+vii. other similar, equivalent or corresponding rights throughout the
+     world based on applicable law or treaty, and any national
+     implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention
+of, applicable law, Affirmer hereby overtly, fully, permanently,
+irrevocably and unconditionally waives, abandons, and surrenders all of
+Affirmer's Copyright and Related Rights and associated claims and causes
+of action, whether now known or unknown (including existing as well as
+future claims and causes of action), in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or future
+medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional
+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
+member of the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non exclusive,
+irrevocable and unconditional license to exercise Affirmer's Copyright and
+Related Rights in the Work (i) in all territories worldwide, (ii) for the
+maximum duration provided by applicable law or treaty (including future
+time extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"License"). The License shall be deemed effective as of the date CC0 was
+applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder
+of the License, and in such case Affirmer hereby affirms that he or she
+will not (i) exercise any of his or her remaining Copyright and Related
+Rights in the Work or (ii) assert any associated claims and causes of
+action with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+    surrendered, licensed or otherwise affected by this document.
+ b. Affirmer offers the Work as-is and makes no representations or
+    warranties of any kind concerning the Work, express, implied,
+    statutory or otherwise, including without limitation warranties of
+    title, merchantability, fitness for a particular purpose, non
+    infringement, or the absence of latent or other defects, accuracy, or
+    the present or absence of errors, whether or not discoverable, all to
+    the greatest extent permissible under applicable law.
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+    that may apply to the Work or any use thereof, including without
+    limitation any person's Copyright and Related Rights in the Work.
+    Further, Affirmer disclaims responsibility for obtaining any necessary
+    consents, permissions or other rights required for any use of the
+    Work.
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+    party to this document and has no duty or obligation with respect to
+    this CC0 or use of the Work.
diff --git a/LICENSES/FSFAP.txt b/LICENSES/FSFAP.txt
new file mode 100644 (file)
index 0000000..32bc8a8
--- /dev/null
@@ -0,0 +1 @@
+Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved.  This file is offered as-is, without any warranty.
diff --git a/LICENSES/GPL-2.0-only.txt b/LICENSES/GPL-2.0-only.txt
new file mode 100644 (file)
index 0000000..17cb286
--- /dev/null
@@ -0,0 +1,117 @@
+GNU GENERAL PUBLIC LICENSE
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+
+     a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
+
+     b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
+
+     c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+
+3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
+
+     a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+
+     b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+
+     c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
+
+     one line to give the program's name and an idea of what it does. Copyright (C) yyyy name of author
+
+     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. Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
+
+     Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
+
+     Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice
diff --git a/LICENSES/GPL-2.0-or-later.txt b/LICENSES/GPL-2.0-or-later.txt
new file mode 100644 (file)
index 0000000..17cb286
--- /dev/null
@@ -0,0 +1,117 @@
+GNU GENERAL PUBLIC LICENSE
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+
+     a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
+
+     b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
+
+     c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+
+3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
+
+     a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+
+     b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+
+     c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
+
+     one line to give the program's name and an idea of what it does. Copyright (C) yyyy name of author
+
+     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. Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
+
+     Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
+
+     Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice
diff --git a/LICENSES/GPL-3.0-or-later.txt b/LICENSES/GPL-3.0-or-later.txt
new file mode 100644 (file)
index 0000000..f6cdd22
--- /dev/null
@@ -0,0 +1,232 @@
+GNU GENERAL PUBLIC LICENSE
+Version 3, 29 June 2007
+
+Copyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>
+
+Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+
+Preamble
+
+The GNU General Public License is a free, copyleft license for software and other kinds of works.
+
+The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
+
+To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.
+
+For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
+
+Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.
+
+For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.
+
+Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.
+
+Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.
+
+The precise terms and conditions for copying, distribution and modification follow.
+
+TERMS AND CONDITIONS
+
+0. Definitions.
+
+“This License” refers to version 3 of the GNU General Public License.
+
+“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
+
+“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.
+
+To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.
+
+A “covered work” means either the unmodified Program or a work based on the Program.
+
+To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
+
+To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
+
+An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
+
+1. Source Code.
+The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.
+
+A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
+
+The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
+
+The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
+
+The Corresponding Source for a work in source code form is that same work.
+
+2. Basic Permissions.
+All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
+
+You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
+
+3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
+
+When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
+
+4. Conveying Verbatim Copies.
+You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
+
+5. Conveying Modified Source Versions.
+You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
+
+     a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
+
+     b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
+
+     c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
+
+     d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
+
+A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
+
+6. Conveying Non-Source Forms.
+You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
+
+     a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
+
+     b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
+
+     c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
+
+     d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
+
+     e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
+
+A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
+
+A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
+
+“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
+
+If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
+
+The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
+
+Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
+
+7. Additional Terms.
+“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
+
+Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
+
+     a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
+
+     b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
+
+     c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
+
+     d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
+
+     e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
+
+     f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
+
+All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
+
+8. Termination.
+You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
+
+However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
+
+Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
+
+9. Acceptance Not Required for Having Copies.
+You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
+
+10. Automatic Licensing of Downstream Recipients.
+Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
+
+An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
+
+11. Patents.
+A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.
+
+A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
+
+In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
+
+A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
+
+12. No Surrender of Others' Freedom.
+If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
+
+13. Use with the GNU Affero General Public License.
+Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.
+
+14. Revised Versions of this License.
+The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.
+
+If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
+
+Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
+
+15. Disclaimer of Warranty.
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+16. Limitation of Liability.
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+17. Interpretation of Sections 15 and 16.
+If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.
+
+     <one line to give the program's name and a brief idea of what it does.>
+     Copyright (C) <year>  <name of author>
+
+     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 3 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, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:
+
+     <program>  Copyright (C) <year>  <name of author>
+     This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+     This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”.
+
+You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <https://www.gnu.org/licenses/>.
+
+The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <https://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/LICENSES/LGPL-2.1-only.txt b/LICENSES/LGPL-2.1-only.txt
new file mode 100644 (file)
index 0000000..c9aa530
--- /dev/null
@@ -0,0 +1,175 @@
+GNU LESSER GENERAL PUBLIC LICENSE
+
+Version 2.1, February 1999
+
+Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.]
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
+
+This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
+
+When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
+
+To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
+
+For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
+
+We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
+
+To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
+
+Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
+
+Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
+
+When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
+
+We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
+
+For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
+
+In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
+
+Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
+
+The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
+
+A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
+
+The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
+
+"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
+
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
+
+1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
+
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+
+     a) The modified work must itself be a software library.
+
+     b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
+
+     c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
+
+     d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
+
+(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+
+3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
+
+Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
+
+This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
+
+4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
+
+If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
+
+5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
+
+However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
+
+When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
+
+If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
+
+Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
+
+6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
+
+You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
+
+     a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
+
+     b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
+
+     c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
+
+     d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
+
+     e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
+
+For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+
+It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
+
+7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
+
+     a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
+
+     b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
+
+8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+
+9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
+
+10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
+
+11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+
+12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+
+13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
+
+14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Libraries
+
+If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
+
+To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
+
+     one line to give the library's name and an idea of what it does.
+     Copyright (C) year  name of author
+
+     This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
+
+     This library 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 Lesser General Public License for more details.
+
+     You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
+
+Yoyodyne, Inc., hereby disclaims all copyright interest in
+the library `Frob' (a library for tweaking knobs) written
+by James Random Hacker.
+
+signature of Ty Coon, 1 April 1990
+Ty Coon, President of Vice
+That's all there is to it!
diff --git a/LICENSES/LGPL-2.1-or-later.txt b/LICENSES/LGPL-2.1-or-later.txt
new file mode 100644 (file)
index 0000000..c9aa530
--- /dev/null
@@ -0,0 +1,175 @@
+GNU LESSER GENERAL PUBLIC LICENSE
+
+Version 2.1, February 1999
+
+Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.]
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
+
+This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
+
+When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
+
+To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
+
+For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
+
+We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
+
+To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
+
+Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
+
+Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
+
+When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
+
+We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
+
+For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
+
+In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
+
+Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
+
+The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
+
+A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
+
+The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
+
+"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
+
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
+
+1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
+
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+
+     a) The modified work must itself be a software library.
+
+     b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
+
+     c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
+
+     d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
+
+(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+
+3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
+
+Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
+
+This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
+
+4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
+
+If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
+
+5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
+
+However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
+
+When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
+
+If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
+
+Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
+
+6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
+
+You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
+
+     a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
+
+     b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
+
+     c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
+
+     d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
+
+     e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
+
+For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+
+It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
+
+7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
+
+     a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
+
+     b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
+
+8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+
+9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
+
+10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
+
+11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+
+12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+
+13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
+
+14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Libraries
+
+If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
+
+To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
+
+     one line to give the library's name and an idea of what it does.
+     Copyright (C) year  name of author
+
+     This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
+
+     This library 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 Lesser General Public License for more details.
+
+     You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
+
+Yoyodyne, Inc., hereby disclaims all copyright interest in
+the library `Frob' (a library for tweaking knobs) written
+by James Random Hacker.
+
+signature of Ty Coon, 1 April 1990
+Ty Coon, President of Vice
+That's all there is to it!
diff --git a/LICENSES/LicenseRef-Autoconf-exception-macro.txt b/LICENSES/LicenseRef-Autoconf-exception-macro.txt
new file mode 100644 (file)
index 0000000..8b5b467
--- /dev/null
@@ -0,0 +1,12 @@
+As a special exception, the respective Autoconf Macro's copyright owner
+gives unlimited permission to copy, distribute and modify the configure
+scripts that are the output of Autoconf when processing the Macro. You
+need not follow the terms of the GNU General Public License when using
+or distributing such scripts, even though portions of the text of the
+Macro appear in them. The GNU General Public License (GPL) does govern
+all other use of the material that constitutes the Autoconf Macro.
+
+This special exception to the GPL applies to versions of the Autoconf
+Macro released by the Autoconf Archive. When you make and distribute a
+modified version of the Autoconf Macro, you may extend this special
+exception to the GPL to apply to your modified version as well.
diff --git a/LICENSES/LicenseRef-Boehm-GC.txt b/LICENSES/LicenseRef-Boehm-GC.txt
new file mode 100644 (file)
index 0000000..95427c0
--- /dev/null
@@ -0,0 +1,12 @@
+Copyright (c) ...
+
+THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+Permission is hereby granted to use or copy this program
+for any purpose,  provided the above notices are retained on all copies.
+Permission to modify the code and to distribute modified code is granted,
+provided the above notices are retained, and a notice that the code was
+modified is included with the above copyright notice.
+
+A few files have other copyright holders.
diff --git a/LICENSES/MIT.txt b/LICENSES/MIT.txt
new file mode 100644 (file)
index 0000000..2071b23
--- /dev/null
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) <year> <copyright holders>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
index 4b28966e1577d054714a8671c58e039bd75cf1a8..539a2ca3ad34c2aa7ddc84b075ce7666d4a6d550 100644 (file)
@@ -1,15 +1,30 @@
-ACLOCAL_AMFLAGS=-I m4
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
 
 
-SUBDIRS = include src doc tests
+ACLOCAL_AMFLAGS=-I m4
 
 
-dist_doc_DATA = LICENSE \
-               README.md
+SUBDIRS = include src doc tests extras
 
 
-dist_noinst_DATA = CodingStyle
+dist_doc_DATA = \
+       LICENSE.md \
+       README.md
 
 
-EXTRA_DIST = gpl-2.0.txt \
-       lgpl-2.1.txt \
-       lgpl-relicensing.txt
+EXTRA_DIST = \
+       CodingStyle.md \
+       lgpl-relicensing.md \
+       LICENSES/Autoconf-exception-2.0.txt \
+       LICENSES/BSD-2-Clause.txt \
+       LICENSES/CC0-1.0.txt \
+       LICENSES/CC-BY-4.0.txt \
+       LICENSES/FSFAP.txt \
+       LICENSES/GPL-2.0-only.txt \
+       LICENSES/GPL-2.0-or-later.txt \
+       LICENSES/LGPL-2.1-only.txt \
+       LICENSES/LGPL-2.1-or-later.txt \
+       LICENSES/LicenseRef-Autoconf-exception-macro.txt \
+       LICENSES/LicenseRef-Boehm-GC.txt \
+       LICENSES/MIT.txt
 
 .PHONY: short_bench long_bench regtest check-loop
 short_bench:
 
 .PHONY: short_bench long_bench regtest check-loop
 short_bench:
index 601703bdf6209af39c9e27e47a9d0c9d3e2d6b13..d868ac491c50152662c25c4ffe48723f32f15cf7 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,3 +1,9 @@
+<!--
+SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+
+SPDX-License-Identifier: CC-BY-4.0
+-->
+
 Userspace RCU Implementation
 ============================
 
 Userspace RCU Implementation
 ============================
 
@@ -38,7 +44,7 @@ Architectures supported
 Currently, the following architectures are supported:
 
   - x86 (i386, i486, i586, i686)
 Currently, the following architectures are supported:
 
   - x86 (i386, i486, i586, i686)
-  - amd64 / x86_64
+  - amd64 / x86\_64
   - PowerPC 32/64
   - S390, S390x
   - ARM 32/64
   - PowerPC 32/64
   - S390, S390x
   - ARM 32/64
@@ -51,54 +57,56 @@ Currently, the following architectures are supported:
   - hppa/PA-RISC
   - m68k
   - RISC-V
   - hppa/PA-RISC
   - m68k
   - RISC-V
+  - LoongArch
 
 Tested on:
 
   - Linux all architectures
 
 Tested on:
 
   - Linux all architectures
-  - FreeBSD 8.2/8.3/9.0/9.1/10.0 i386/amd64
-  - Solaris 10/11 i386
+  - FreeBSD 13 i386/amd64
   - Cygwin i386/amd64
   - Cygwin i386/amd64
-  - MacOSX amd64
+  - MacOS amd64/arm64
 
 Should also work on:
 
   - Android
   - NetBSD 5
   - OpenBSD
 
 Should also work on:
 
   - Android
   - NetBSD 5
   - OpenBSD
-  - Darwin
+  - Solaris
 
 (more testing needed before claiming support for these OS).
 
 
 (more testing needed before claiming support for these OS).
 
-Linux ARM depends on running a Linux kernel 2.6.15 or better, GCC 4.4 or
-better.
 
 
-The GCC compiler versions 3.3, 3.4, 4.0, 4.1, 4.2, 4.3, 4.4 and 4.5 are
-supported, with the following exceptions:
+Toolchain support
+-----------------
+
+The C compiler used needs to support at least C99. The C++ compiler used needs
+to support at least C++11. The oldest GCC version officialy supported and
+tested is 4.8.
+
+Older GCC versions might still work with the following exceptions:
 
   - GCC 3.3 and 3.4 have a bug that prevents them from generating volatile
     accesses to offsets in a TLS structure on 32-bit x86. These versions are
     therefore not compatible with `liburcu` on x86 32-bit
     (i386, i486, i586, i686).
     The problem has been reported to the GCC community:
 
   - GCC 3.3 and 3.4 have a bug that prevents them from generating volatile
     accesses to offsets in a TLS structure on 32-bit x86. These versions are
     therefore not compatible with `liburcu` on x86 32-bit
     (i386, i486, i586, i686).
     The problem has been reported to the GCC community:
-    http://www.mail-archive.com/gcc-bugs@gcc.gnu.org/msg281255.html
+    <http://www.mail-archive.com/gcc-bugs@gcc.gnu.org/msg281255.html>
   - GCC 3.3 cannot match the "xchg" instruction on 32-bit x86 build.
   - GCC 3.3 cannot match the "xchg" instruction on 32-bit x86 build.
-    See http://kerneltrap.org/node/7507
+    See <http://kerneltrap.org/node/7507>
   - Alpha, ia64 and ARM architectures depend on GCC 4.x with atomic builtins
     support. For ARM this was introduced with GCC 4.4:
   - Alpha, ia64 and ARM architectures depend on GCC 4.x with atomic builtins
     support. For ARM this was introduced with GCC 4.4:
-    http://gcc.gnu.org/gcc-4.4/changes.html.
+    <http://gcc.gnu.org/gcc-4.4/changes.html>.
+  - Linux aarch64 depends on GCC 5.1 or better because prior versions
+    perform unsafe access to deallocated stack.
 
 Clang version 3.0 (based on LLVM 3.0) is supported.
 
 
 Clang version 3.0 (based on LLVM 3.0) is supported.
 
-Building on MacOS X (Darwin) requires a work-around for processor
-detection:
+Glibc >= 2.4 should work but the older version we test against is
+currently 2.17.
 
 
-  - 32-bit:
 
 
-        ./configure --build=i686-apple-darwin11
-
-  - 64-bit:
-
-        ./configure --build=x86_64-apple-darwin11
+Build system
+------------
 
 For developers using the Git tree:
 
 
 For developers using the Git tree:
 
@@ -106,10 +114,10 @@ This source tree is based on the autotools suite from GNU to simplify
 portability. Here are some things you should have on your system in order to
 compile the git repository tree :
 
 portability. Here are some things you should have on your system in order to
 compile the git repository tree :
 
-  - GNU autotools (automake >=1.10, autoconf >=2.50, autoheader >=2.50)
+  - GNU autotools (automake >=1.12, autoconf >=2.69)
     (make sure your system wide `automake` points to a recent version!)
   - GNU Libtool >=2.2
     (make sure your system wide `automake` points to a recent version!)
   - GNU Libtool >=2.2
-    (for more information, go to http://www.gnu.org/software/autoconf/)
+    (for more information, go to <http://www.gnu.org/software/autoconf/>)
 
 If you get the tree from the repository, you will need to use the `bootstrap`
 script in the root of the tree. It calls all the GNU tools needed to prepare
 
 If you get the tree from the repository, you will need to use the `bootstrap`
 script in the root of the tree. It calls all the GNU tools needed to prepare
@@ -163,11 +171,10 @@ There are multiple flavors of liburcu available:
   - `memb`,
   - `qsbr`,
   - `mb`,
   - `memb`,
   - `qsbr`,
   - `mb`,
-  - `signal`,
   - `bp`.
 
   - `bp`.
 
-The API members start with the prefix "urcu_<flavor>_", where
-<flavor> is the chosen flavor name.
+The API members start with the prefix `urcu_<flavor>_`, where
+`<flavor>` is the chosen flavor name.
 
 
 ### Usage of `liburcu-memb`
 
 
 ### Usage of `liburcu-memb`
@@ -179,7 +186,7 @@ This is the preferred version of the library, in terms of
 grace-period detection speed, read-side speed and flexibility.
 Dynamically detects kernel support for `sys_membarrier()`. Falls back
 on `urcu-mb` scheme if support is not present, which has slower
 grace-period detection speed, read-side speed and flexibility.
 Dynamically detects kernel support for `sys_membarrier()`. Falls back
 on `urcu-mb` scheme if support is not present, which has slower
-read-side. Use the --disable-sys-membarrier-fallback configure option
+read-side. Use the `--disable-sys-membarrier-fallback` configure option
 to disable the fall back, thus requiring `sys_membarrier()` to be
 available. This gives a small speedup when `sys_membarrier()` is
 supported by the kernel, and aborts in the library constructor if not
 to disable the fall back, thus requiring `sys_membarrier()` to be
 available. This gives a small speedup when `sys_membarrier()` is
 supported by the kernel, and aborts in the library constructor if not
@@ -208,15 +215,6 @@ and reader sides. This results in faster grace-period detection, but
 results in slower reads.
 
 
 results in slower reads.
 
 
-### Usage of `liburcu-signal`
-
-  1. `#include <urcu/urcu-signal.h>`
-  2. Link the application with `-lurcu-signal`
-
-Version of the library that requires a signal, typically `SIGUSR1`. Can
-be overridden with `-DSIGRCU` by modifying `Makefile.build.inc`.
-
-
 ### Usage of `liburcu-bp`
 
   1. `#include <urcu/urcu-bp.h>`
 ### Usage of `liburcu-bp`
 
   1. `#include <urcu/urcu-bp.h>`
@@ -224,10 +222,11 @@ be overridden with `-DSIGRCU` by modifying `Makefile.build.inc`.
 
 The BP library flavor stands for "bulletproof". It is specifically
 designed to help tracing library to hook on applications without
 
 The BP library flavor stands for "bulletproof". It is specifically
 designed to help tracing library to hook on applications without
-requiring to modify these applications. `urcu_bp_init()`,
-`urcu_bp_register_thread()` and `urcu_bp_unregister_thread()` all become
-nops. The state is dealt with by the library internally at the expense
-of read-side and write-side performance.
+requiring to modify these applications. `urcu_bp_init()`, and
+`urcu_bp_unregister_thread()` all become nops, whereas calling
+`urcu_bp_register_thread()` becomes optional. The state is dealt with by
+the library internally at the expense of read-side and write-side
+performance.
 
 
 ### Initialization
 
 
 ### Initialization
@@ -253,11 +252,19 @@ protected pointer.
 After, `urcu_<flavor>_synchronize_rcu()` must be called. When it
 returns, the old values are not in usage anymore.
 
 After, `urcu_<flavor>_synchronize_rcu()` must be called. When it
 returns, the old values are not in usage anymore.
 
+As an alternative to `urcu_<flavor>_synchronize_rcu()`,
+it is also possible to use the urcu polling mechanism to wait for a
+grace period to elapse. This can be done by using
+`urcu_<flavor>_start_poll_synchronize_rcu()`
+to start the grace period polling, and then invoke
+`urcu_<flavor>_poll_state_synchronize_rcu()`, which returns true if
+the grace period has completed, false otherwise.
+
 
 ### Usage of `liburcu-defer`
 
   - Follow instructions for either `liburcu-memb`, `liburcu-qsbr`,
 
 ### Usage of `liburcu-defer`
 
   - Follow instructions for either `liburcu-memb`, `liburcu-qsbr`,
-    `liburcu-mb`, `liburcu-signal`, or `liburcu-bp` above.
+    `liburcu-mb`, or `liburcu-bp` above.
     The `liburcu-defer` functionality is pulled into each of
     those library modules.
   - Provides `urcu_<flavor>_defer_rcu()` primitive to enqueue delayed
     The `liburcu-defer` functionality is pulled into each of
     those library modules.
   - Provides `urcu_<flavor>_defer_rcu()` primitive to enqueue delayed
@@ -276,7 +283,7 @@ Its API is currently experimental. It may change in future library releases.
 ### Usage of `urcu-call-rcu`
 
   - Follow instructions for either `liburcu-memb`, `liburcu-qsbr`,
 ### Usage of `urcu-call-rcu`
 
   - Follow instructions for either `liburcu-memb`, `liburcu-qsbr`,
-    `liburcu-mb`, `liburcu-signal`, or `liburcu-bp` above.
+    `liburcu-mb`, or `liburcu-bp` above.
     The `urcu-call-rcu` functionality is pulled into each of
     those library modules.
   - Provides the `urcu_<flavor>_call_rcu()` primitive to enqueue delayed
     The `urcu-call-rcu` functionality is pulled into each of
     those library modules.
   - Provides the `urcu_<flavor>_call_rcu()` primitive to enqueue delayed
@@ -294,13 +301,6 @@ Its API is currently experimental. It may change in future library releases.
 
 ### Being careful with signals
 
 
 ### Being careful with signals
 
-The `liburcu-signal` library uses signals internally. The signal handler is
-registered with the `SA_RESTART` flag. However, these signals may cause
-some non-restartable system calls to fail with `errno = EINTR`. Care
-should be taken to restart system calls manually if they fail with this
-error. A list of non-restartable system calls may be found in
-`signal(7)`.
-
 Read-side critical sections are allowed in a signal handler,
 except those setup with `sigaltstack(2)`, with `liburcu-memb` and
 `liburcu-mb`. Be careful, however, to disable these signals
 Read-side critical sections are allowed in a signal handler,
 except those setup with `sigaltstack(2)`, with `liburcu-memb` and
 `liburcu-mb`. Be careful, however, to disable these signals
@@ -384,11 +384,12 @@ By default the library is configured with internal debugging
 self-checks disabled.
 
 For always-on debugging self-checks:
 self-checks disabled.
 
 For always-on debugging self-checks:
-       ./configure --enable-rcu-debug
+
+    ./configure --enable-rcu-debug
 
 For fine grained enabling of debugging self-checks, build
 
 For fine grained enabling of debugging self-checks, build
-urserspace-rcu with DEBUG_RCU defined and compile dependent
-applications with DEBUG_RCU defined when necessary.
+userspace-rcu with `DEBUG_RCU` defined and compile dependent
+applications with `DEBUG_RCU` defined when necessary.
 
 Warning: Enabling this feature result in a performance penalty.
 
 
 Warning: Enabling this feature result in a performance penalty.
 
@@ -415,7 +416,7 @@ theoretically yielding slightly better performance.
 By default the library is configured with extra debugging checks for
 lock-free hash table iterator traversal disabled.
 
 By default the library is configured with extra debugging checks for
 lock-free hash table iterator traversal disabled.
 
-Building liburcu with --enable-cds-lfht-iter-debug and rebuilding
+Building liburcu with `--enable-cds-lfht-iter-debug` and rebuilding
 application to match the ABI change allows finding cases where the hash
 table iterator is re-purposed to be used on a different hash table while
 still being used to iterate on a hash table.
 application to match the ABI change allows finding cases where the hash
 table iterator is re-purposed to be used on a different hash table while
 still being used to iterate on a hash table.
@@ -423,19 +424,51 @@ still being used to iterate on a hash table.
 This option alters the rculfhash ABI. Make sure to compile both library
 and application with matching configuration.
 
 This option alters the rculfhash ABI. Make sure to compile both library
 and application with matching configuration.
 
+### Usage of `--enable-compiler-atomic-builtins`
+
+Building liburcu with `--enable-compiler-atomic-builtins` implements the uatomic
+API with the compiler atomic builtins if supported.
 
 Make targets
 ------------
 
 In addition to the usual `make check` target, Userspace RCU features
 
 Make targets
 ------------
 
 In addition to the usual `make check` target, Userspace RCU features
-`make regtest` and `make bench` targets:
+`make regtest`, `make short_bench` and `make long_bench` targets:
 
   - `make check`: short tests, meant to be run when rebuilding or
     porting Userspace RCU.
   - `make regtest`: long (many hours) test, meant to be run when
     modifying Userspace RCU or porting it to a new architecture or
     operating system.
 
   - `make check`: short tests, meant to be run when rebuilding or
     porting Userspace RCU.
   - `make regtest`: long (many hours) test, meant to be run when
     modifying Userspace RCU or porting it to a new architecture or
     operating system.
-  - `make bench`: long (many hours) benchmarks.
+  - `make short_bench`: short benchmarks, 3 seconds per test.
+  - `make long_bench`: long (many hours) benchmarks, 30 seconds per test.
+
+
+Known issues
+------------
+
+There is an application vs library compatibility issue between
+applications built using Userspace RCU 0.10 headers linked against
+Userspace RCU 0.11 or 0.12 shared objects. The problem occurs as
+follows:
+
+  - An application executable is built with `_LGPL_SOURCE` defined, includes
+    any of the Userspace RCU 0.10 urcu flavor headers, and is built
+    without the `-fpic` compiler option.
+
+  - The Userspace RCU 0.10 library shared objects are updated to 0.11
+    or 0.12 without rebuilding the application.
+
+  - The application will hang, typically when RCU grace period
+    (synchronize_rcu) is invoked.
+
+Some possible work-arounds for this are:
+
+  - Rebuild the application against Userspace RCU 0.11+.
+
+  - Rebuild the application with `-fpic`.
+
+  - Upgrade Userspace RCU to 0.13+ without installing 0.11 nor 0.12.
 
 
 Contacts
 
 
 Contacts
@@ -443,3 +476,18 @@ Contacts
 
 You can contact the maintainers on the following mailing list:
 `lttng-dev@lists.lttng.org`.
 
 You can contact the maintainers on the following mailing list:
 `lttng-dev@lists.lttng.org`.
+
+IRC channel: [#lttng](irc://irc.oftc.net/lttng) on the OFTC network
+
+Bug tracker: [Userspace RCU bug tracker](https://bugs.lttng.org/projects/urcu)
+
+Code review: [_userspace-rcu_ project](https://review.lttng.org/q/project:userspace-rcu) on LTTng Review
+
+Continuous integration: [Userspace RCU](https://ci.lttng.org/view/Liburcu/) on LTTng's CI
+
+GitHub mirror: [urcu/userspace-rcu](https://github.com/urcu/userspace-rcu)
+
+Patches are principally submitted and reviewed on [LTTng Review](https://review.lttng.org),
+but may also be submitted to the [mailing list](mailto:lttng-dev@lists.lttng.org)
+with the subject prefix `PATCH urcu` or by pull request on the
+[GitHub mirror](https://github.com/urcu/userspace-rcu).
index 2bec3713512d2c4fab2371a3a66a5367bcb18c4a..47a85ff608d48cc8549d32c6e3b8c4416862b85f 100755 (executable)
--- a/bootstrap
+++ b/bootstrap
@@ -1,8 +1,12 @@
 #!/bin/sh
 
 #!/bin/sh
 
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
+
 set -x
 if [ ! -d "config" ]; then
        mkdir config
 fi
 
 set -x
 if [ ! -d "config" ]; then
        mkdir config
 fi
 
-autoreconf -vi
+autoreconf -vi -W all,error
diff --git a/config/tap-driver.sh b/config/tap-driver.sh
deleted file mode 100755 (executable)
index 12742ca..0000000
+++ /dev/null
@@ -1,654 +0,0 @@
-#! /bin/sh
-# Copyright (C) 2011-2014 Free Software Foundation, Inc.
-#
-# 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, 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, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# This file is maintained in Automake, please report
-# bugs to <bug-automake@gnu.org> or send patches to
-# <automake-patches@gnu.org>.
-
-scriptversion=2013-12-23.17; # UTC
-
-# Make unconditional expansion of undefined variables an error.  This
-# helps a lot in preventing typo-related bugs.
-set -u
-
-me=tap-driver.sh
-
-fatal ()
-{
-  echo "$me: fatal: $*" >&2
-  exit 1
-}
-
-usage_error ()
-{
-  echo "$me: $*" >&2
-  print_usage >&2
-  exit 2
-}
-
-print_usage ()
-{
-  cat <<END
-Usage:
-  tap-driver.sh --test-name=NAME --log-file=PATH --trs-file=PATH
-                [--expect-failure={yes|no}] [--color-tests={yes|no}]
-                [--enable-hard-errors={yes|no}] [--ignore-exit]
-                [--diagnostic-string=STRING] [--merge|--no-merge]
-                [--comments|--no-comments] [--] TEST-COMMAND
-The '--test-name', '-log-file' and '--trs-file' options are mandatory.
-END
-}
-
-# TODO: better error handling in option parsing (in particular, ensure
-# TODO: $log_file, $trs_file and $test_name are defined).
-test_name= # Used for reporting.
-log_file=  # Where to save the result and output of the test script.
-trs_file=  # Where to save the metadata of the test run.
-expect_failure=0
-color_tests=0
-merge=0
-ignore_exit=0
-comments=0
-diag_string='#'
-while test $# -gt 0; do
-  case $1 in
-  --help) print_usage; exit $?;;
-  --version) echo "$me $scriptversion"; exit $?;;
-  --test-name) test_name=$2; shift;;
-  --log-file) log_file=$2; shift;;
-  --trs-file) trs_file=$2; shift;;
-  --color-tests) color_tests=$2; shift;;
-  --expect-failure) expect_failure=$2; shift;;
-  --enable-hard-errors) shift;; # No-op.
-  --merge) merge=1;;
-  --no-merge) merge=0;;
-  --ignore-exit) ignore_exit=1;;
-  --comments) comments=1;;
-  --no-comments) comments=0;;
-  --diagnostic-string) diag_string=$2; shift;;
-  --) shift; break;;
-  -*) usage_error "invalid option: '$1'";;
-  esac
-  shift
-done
-
-test $# -gt 0 || usage_error "missing test command"
-
-case $expect_failure in
-  yes) expect_failure=1;;
-    *) expect_failure=0;;
-esac
-
-if test $color_tests = yes; then
-  init_colors='
-    color_map["red"]="\e[0;31m" # Red.
-    color_map["grn"]="\e[0;32m" # Green.
-    color_map["lgn"]="\e[1;32m" # Light green.
-    color_map["blu"]="\e[1;34m" # Blue.
-    color_map["mgn"]="\e[0;35m" # Magenta.
-    color_map["std"]="\e[m"     # No color.
-    color_for_result["ERROR"] = "mgn"
-    color_for_result["PASS"]  = "grn"
-    color_for_result["XPASS"] = "red"
-    color_for_result["FAIL"]  = "red"
-    color_for_result["XFAIL"] = "lgn"
-    color_for_result["SKIP"]  = "blu"'
-else
-  init_colors=''
-fi
-
-# :; is there to work around a bug in bash 3.2 (and earlier) which
-# does not always set '$?' properly on redirection failure.
-# See the Autoconf manual for more details.
-:;{
-  (
-    # Ignore common signals (in this subshell only!), to avoid potential
-    # problems with Korn shells.  Some Korn shells are known to propagate
-    # to themselves signals that have killed a child process they were
-    # waiting for; this is done at least for SIGINT (and usually only for
-    # it, in truth).  Without the `trap' below, such a behaviour could
-    # cause a premature exit in the current subshell, e.g., in case the
-    # test command it runs gets terminated by a SIGINT.  Thus, the awk
-    # script we are piping into would never seen the exit status it
-    # expects on its last input line (which is displayed below by the
-    # last `echo $?' statement), and would thus die reporting an internal
-    # error.
-    # For more information, see the Autoconf manual and the threads:
-    # <http://lists.gnu.org/archive/html/bug-autoconf/2011-09/msg00004.html>
-    # <http://mail.opensolaris.org/pipermail/ksh93-integration-discuss/2009-February/004121.html>
-    trap : 1 3 2 13 15
-    if test $merge -gt 0; then
-      exec 2>&1
-    else
-      exec 2>&3
-    fi
-    "$@"
-    echo $?
-  ) | LC_ALL=C ${AM_TAP_AWK-awk} \
-        -v me="$me" \
-        -v test_script_name="$test_name" \
-        -v log_file="$log_file" \
-        -v trs_file="$trs_file" \
-        -v expect_failure="$expect_failure" \
-        -v merge="$merge" \
-        -v ignore_exit="$ignore_exit" \
-        -v comments="$comments" \
-        -v diag_string="$diag_string" \
-'
-# TODO: the usages of "cat >&3" below could be optimized when using
-#       GNU awk, and/on on systems that supports /dev/fd/.
-
-# Implementation note: in what follows, `result_obj` will be an
-# associative array that (partly) simulates a TAP result object
-# from the `TAP::Parser` perl module.
-
-## ----------- ##
-##  FUNCTIONS  ##
-## ----------- ##
-
-function fatal(msg)
-{
-  print me ": " msg | "cat >&2"
-  exit 1
-}
-
-function abort(where)
-{
-  fatal("internal error " where)
-}
-
-# Convert a boolean to a "yes"/"no" string.
-function yn(bool)
-{
-  return bool ? "yes" : "no";
-}
-
-function add_test_result(result)
-{
-  if (!test_results_index)
-    test_results_index = 0
-  test_results_list[test_results_index] = result
-  test_results_index += 1
-  test_results_seen[result] = 1;
-}
-
-# Whether the test script should be re-run by "make recheck".
-function must_recheck()
-{
-  for (k in test_results_seen)
-    if (k != "XFAIL" && k != "PASS" && k != "SKIP")
-      return 1
-  return 0
-}
-
-# Whether the content of the log file associated to this test should
-# be copied into the "global" test-suite.log.
-function copy_in_global_log()
-{
-  for (k in test_results_seen)
-    if (k != "PASS")
-      return 1
-  return 0
-}
-
-function get_global_test_result()
-{
-    if ("ERROR" in test_results_seen)
-      return "ERROR"
-    if ("FAIL" in test_results_seen || "XPASS" in test_results_seen)
-      return "FAIL"
-    all_skipped = 1
-    for (k in test_results_seen)
-      if (k != "SKIP")
-        all_skipped = 0
-    if (all_skipped)
-      return "SKIP"
-    return "PASS";
-}
-
-function stringify_result_obj(result_obj)
-{
-  if (result_obj["is_unplanned"] || result_obj["number"] != testno)
-    return "ERROR"
-
-  if (plan_seen == LATE_PLAN)
-    return "ERROR"
-
-  if (result_obj["directive"] == "TODO")
-    return result_obj["is_ok"] ? "XPASS" : "XFAIL"
-
-  if (result_obj["directive"] == "SKIP")
-    return result_obj["is_ok"] ? "SKIP" : COOKED_FAIL;
-
-  if (length(result_obj["directive"]))
-      abort("in function stringify_result_obj()")
-
-  return result_obj["is_ok"] ? COOKED_PASS : COOKED_FAIL
-}
-
-function decorate_result(result)
-{
-  color_name = color_for_result[result]
-  if (color_name)
-    return color_map[color_name] "" result "" color_map["std"]
-  # If we are not using colorized output, or if we do not know how
-  # to colorize the given result, we should return it unchanged.
-  return result
-}
-
-function report(result, details)
-{
-  if (result ~ /^(X?(PASS|FAIL)|SKIP|ERROR)/)
-    {
-      msg = ": " test_script_name
-      add_test_result(result)
-    }
-  else if (result == "#")
-    {
-      msg = " " test_script_name ":"
-    }
-  else
-    {
-      abort("in function report()")
-    }
-  if (length(details))
-    msg = msg " " details
-  # Output on console might be colorized.
-  print decorate_result(result) msg
-  # Flush stdout after each test result, this is useful when stdout
-  # is buffered, for example in a CI system.
-  fflush()
-  # Log the result in the log file too, to help debugging (this is
-  # especially true when said result is a TAP error or "Bail out!").
-  print result msg | "cat >&3";
-}
-
-function testsuite_error(error_message)
-{
-  report("ERROR", "- " error_message)
-}
-
-function handle_tap_result()
-{
-  details = result_obj["number"];
-  if (length(result_obj["description"]))
-    details = details " " result_obj["description"]
-
-  if (plan_seen == LATE_PLAN)
-    {
-      details = details " # AFTER LATE PLAN";
-    }
-  else if (result_obj["is_unplanned"])
-    {
-       details = details " # UNPLANNED";
-    }
-  else if (result_obj["number"] != testno)
-    {
-       details = sprintf("%s # OUT-OF-ORDER (expecting %d)",
-                         details, testno);
-    }
-  else if (result_obj["directive"])
-    {
-      details = details " # " result_obj["directive"];
-      if (length(result_obj["explanation"]))
-        details = details " " result_obj["explanation"]
-    }
-
-  report(stringify_result_obj(result_obj), details)
-}
-
-# `skip_reason` should be empty whenever planned > 0.
-function handle_tap_plan(planned, skip_reason)
-{
-  planned += 0 # Avoid getting confused if, say, `planned` is "00"
-  if (length(skip_reason) && planned > 0)
-    abort("in function handle_tap_plan()")
-  if (plan_seen)
-    {
-      # Error, only one plan per stream is acceptable.
-      testsuite_error("multiple test plans")
-      return;
-    }
-  planned_tests = planned
-  # The TAP plan can come before or after *all* the TAP results; we speak
-  # respectively of an "early" or a "late" plan.  If we see the plan line
-  # after at least one TAP result has been seen, assume we have a late
-  # plan; in this case, any further test result seen after the plan will
-  # be flagged as an error.
-  plan_seen = (testno >= 1 ? LATE_PLAN : EARLY_PLAN)
-  # If testno > 0, we have an error ("too many tests run") that will be
-  # automatically dealt with later, so do not worry about it here.  If
-  # $plan_seen is true, we have an error due to a repeated plan, and that
-  # has already been dealt with above.  Otherwise, we have a valid "plan
-  # with SKIP" specification, and should report it as a particular kind
-  # of SKIP result.
-  if (planned == 0 && testno == 0)
-    {
-      if (length(skip_reason))
-        skip_reason = "- "  skip_reason;
-      report("SKIP", skip_reason);
-    }
-}
-
-function extract_tap_comment(line)
-{
-  if (index(line, diag_string) == 1)
-    {
-      # Strip leading `diag_string` from `line`.
-      line = substr(line, length(diag_string) + 1)
-      # And strip any leading and trailing whitespace left.
-      sub("^[ \t]*", "", line)
-      sub("[ \t]*$", "", line)
-      # Return what is left (if any).
-      return line;
-    }
-  return "";
-}
-
-# When this function is called, we know that line is a TAP result line,
-# so that it matches the (perl) RE "^(not )?ok\b".
-function setup_result_obj(line)
-{
-  # Get the result, and remove it from the line.
-  result_obj["is_ok"] = (substr(line, 1, 2) == "ok" ? 1 : 0)
-  sub("^(not )?ok[ \t]*", "", line)
-
-  # If the result has an explicit number, get it and strip it; otherwise,
-  # automatically assing the next progresive number to it.
-  if (line ~ /^[0-9]+$/ || line ~ /^[0-9]+[^a-zA-Z0-9_]/)
-    {
-      match(line, "^[0-9]+")
-      # The final `+ 0` is to normalize numbers with leading zeros.
-      result_obj["number"] = substr(line, 1, RLENGTH) + 0
-      line = substr(line, RLENGTH + 1)
-    }
-  else
-    {
-      result_obj["number"] = testno
-    }
-
-  if (plan_seen == LATE_PLAN)
-    # No further test results are acceptable after a "late" TAP plan
-    # has been seen.
-    result_obj["is_unplanned"] = 1
-  else if (plan_seen && testno > planned_tests)
-    result_obj["is_unplanned"] = 1
-  else
-    result_obj["is_unplanned"] = 0
-
-  # Strip trailing and leading whitespace.
-  sub("^[ \t]*", "", line)
-  sub("[ \t]*$", "", line)
-
-  # This will have to be corrected if we have a "TODO"/"SKIP" directive.
-  result_obj["description"] = line
-  result_obj["directive"] = ""
-  result_obj["explanation"] = ""
-
-  if (index(line, "#") == 0)
-    return # No possible directive, nothing more to do.
-
-  # Directives are case-insensitive.
-  rx = "[ \t]*#[ \t]*([tT][oO][dD][oO]|[sS][kK][iI][pP])[ \t]*"
-
-  # See whether we have the directive, and if yes, where.
-  pos = match(line, rx "$")
-  if (!pos)
-    pos = match(line, rx "[^a-zA-Z0-9_]")
-
-  # If there was no TAP directive, we have nothing more to do.
-  if (!pos)
-    return
-
-  # Let`s now see if the TAP directive has been escaped.  For example:
-  #  escaped:     ok \# SKIP
-  #  not escaped: ok \\# SKIP
-  #  escaped:     ok \\\\\# SKIP
-  #  not escaped: ok \ # SKIP
-  if (substr(line, pos, 1) == "#")
-    {
-      bslash_count = 0
-      for (i = pos; i > 1 && substr(line, i - 1, 1) == "\\"; i--)
-        bslash_count += 1
-      if (bslash_count % 2)
-        return # Directive was escaped.
-    }
-
-  # Strip the directive and its explanation (if any) from the test
-  # description.
-  result_obj["description"] = substr(line, 1, pos - 1)
-  # Now remove the test description from the line, that has been dealt
-  # with already.
-  line = substr(line, pos)
-  # Strip the directive, and save its value (normalized to upper case).
-  sub("^[ \t]*#[ \t]*", "", line)
-  result_obj["directive"] = toupper(substr(line, 1, 4))
-  line = substr(line, 5)
-  # Now get the explanation for the directive (if any), with leading
-  # and trailing whitespace removed.
-  sub("^[ \t]*", "", line)
-  sub("[ \t]*$", "", line)
-  result_obj["explanation"] = line
-}
-
-function get_test_exit_message(status)
-{
-  if (status == 0)
-    return ""
-  if (status !~ /^[1-9][0-9]*$/)
-    abort("getting exit status")
-  if (status < 127)
-    exit_details = ""
-  else if (status == 127)
-    exit_details = " (command not found?)"
-  else if (status >= 128 && status <= 255)
-    exit_details = sprintf(" (terminated by signal %d?)", status - 128)
-  else if (status > 256 && status <= 384)
-    # We used to report an "abnormal termination" here, but some Korn
-    # shells, when a child process die due to signal number n, can leave
-    # in $? an exit status of 256+n instead of the more standard 128+n.
-    # Apparently, both behaviours are allowed by POSIX (2008), so be
-    # prepared to handle them both.  See also Austing Group report ID
-    # 0000051 <http://www.austingroupbugs.net/view.php?id=51>
-    exit_details = sprintf(" (terminated by signal %d?)", status - 256)
-  else
-    # Never seen in practice.
-    exit_details = " (abnormal termination)"
-  return sprintf("exited with status %d%s", status, exit_details)
-}
-
-function write_test_results()
-{
-  print ":global-test-result: " get_global_test_result() > trs_file
-  print ":recheck: "  yn(must_recheck()) > trs_file
-  print ":copy-in-global-log: " yn(copy_in_global_log()) > trs_file
-  for (i = 0; i < test_results_index; i += 1)
-    print ":test-result: " test_results_list[i] > trs_file
-  close(trs_file);
-}
-
-BEGIN {
-
-## ------- ##
-##  SETUP  ##
-## ------- ##
-
-'"$init_colors"'
-
-# Properly initialized once the TAP plan is seen.
-planned_tests = 0
-
-COOKED_PASS = expect_failure ? "XPASS": "PASS";
-COOKED_FAIL = expect_failure ? "XFAIL": "FAIL";
-
-# Enumeration-like constants to remember which kind of plan (if any)
-# has been seen.  It is important that NO_PLAN evaluates "false" as
-# a boolean.
-NO_PLAN = 0
-EARLY_PLAN = 1
-LATE_PLAN = 2
-
-testno = 0     # Number of test results seen so far.
-bailed_out = 0 # Whether a "Bail out!" directive has been seen.
-
-# Whether the TAP plan has been seen or not, and if yes, which kind
-# it is ("early" is seen before any test result, "late" otherwise).
-plan_seen = NO_PLAN
-
-## --------- ##
-##  PARSING  ##
-## --------- ##
-
-is_first_read = 1
-
-while (1)
-  {
-    # Involutions required so that we are able to read the exit status
-    # from the last input line.
-    st = getline
-    if (st < 0) # I/O error.
-      fatal("I/O error while reading from input stream")
-    else if (st == 0) # End-of-input
-      {
-        if (is_first_read)
-          abort("in input loop: only one input line")
-        break
-      }
-    if (is_first_read)
-      {
-        is_first_read = 0
-        nextline = $0
-        continue
-      }
-    else
-      {
-        curline = nextline
-        nextline = $0
-        $0 = curline
-      }
-    # Copy any input line verbatim into the log file.
-    print | "cat >&3"
-    # Parsing of TAP input should stop after a "Bail out!" directive.
-    if (bailed_out)
-      continue
-
-    # TAP test result.
-    if ($0 ~ /^(not )?ok$/ || $0 ~ /^(not )?ok[^a-zA-Z0-9_]/)
-      {
-        testno += 1
-        setup_result_obj($0)
-        handle_tap_result()
-      }
-    # TAP plan (normal or "SKIP" without explanation).
-    else if ($0 ~ /^1\.\.[0-9]+[ \t]*$/)
-      {
-        # The next two lines will put the number of planned tests in $0.
-        sub("^1\\.\\.", "")
-        sub("[^0-9]*$", "")
-        handle_tap_plan($0, "")
-        continue
-      }
-    # TAP "SKIP" plan, with an explanation.
-    else if ($0 ~ /^1\.\.0+[ \t]*#/)
-      {
-        # The next lines will put the skip explanation in $0, stripping
-        # any leading and trailing whitespace.  This is a little more
-        # tricky in truth, since we want to also strip a potential leading
-        # "SKIP" string from the message.
-        sub("^[^#]*#[ \t]*(SKIP[: \t][ \t]*)?", "")
-        sub("[ \t]*$", "");
-        handle_tap_plan(0, $0)
-      }
-    # "Bail out!" magic.
-    # Older versions of prove and TAP::Harness (e.g., 3.17) did not
-    # recognize a "Bail out!" directive when preceded by leading
-    # whitespace, but more modern versions (e.g., 3.23) do.  So we
-    # emulate the latter, "more modern" behaviour.
-    else if ($0 ~ /^[ \t]*Bail out!/)
-      {
-        bailed_out = 1
-        # Get the bailout message (if any), with leading and trailing
-        # whitespace stripped.  The message remains stored in `$0`.
-        sub("^[ \t]*Bail out![ \t]*", "");
-        sub("[ \t]*$", "");
-        # Format the error message for the
-        bailout_message = "Bail out!"
-        if (length($0))
-          bailout_message = bailout_message " " $0
-        testsuite_error(bailout_message)
-      }
-    # Maybe we have too look for dianogtic comments too.
-    else if (comments != 0)
-      {
-        comment = extract_tap_comment($0);
-        if (length(comment))
-          report("#", comment);
-      }
-  }
-
-## -------- ##
-##  FINISH  ##
-## -------- ##
-
-# A "Bail out!" directive should cause us to ignore any following TAP
-# error, as well as a non-zero exit status from the TAP producer.
-if (!bailed_out)
-  {
-    if (!plan_seen)
-      {
-        testsuite_error("missing test plan")
-      }
-    else if (planned_tests != testno)
-      {
-        bad_amount = testno > planned_tests ? "many" : "few"
-        testsuite_error(sprintf("too %s tests run (expected %d, got %d)",
-                                bad_amount, planned_tests, testno))
-      }
-    if (!ignore_exit)
-      {
-        # Fetch exit status from the last line.
-        exit_message = get_test_exit_message(nextline)
-        if (exit_message)
-          testsuite_error(exit_message)
-      }
-  }
-
-write_test_results()
-
-exit 0
-
-} # End of "BEGIN" block.
-'
-
-# TODO: document that we consume the file descriptor 3 :-(
-} 3>"$log_file"
-
-test $? -eq 0 || fatal "I/O or internal error"
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
index 1d13ea38b0dee4c01052367205a1eae71dfec9a9..2807932258549ab93b012862a8063785748a16fa 100644 (file)
@@ -1,9 +1,31 @@
-AC_PREREQ(2.59)
-AC_INIT([userspace-rcu],[0.11.0],[mathieu dot desnoyers at efficios dot com], [], [http://liburcu.org/])
-
+dnl SPDX-License-Identifier: LGPL-2.1-only
+dnl
+dnl Copyright (C) 2021 EfficiOS, Inc.
+dnl
+dnl Process this file with autoconf to produce a configure script.
+
+# Project version information
+m4_define([urcu_version_major], [0])
+m4_define([urcu_version_minor], [15])
+m4_define([urcu_version_patch], [0])
+m4_define([urcu_version_dev_stage], [-pre])
+m4_define([urcu_version], urcu_version_major[.]urcu_version_minor[.]urcu_version_patch[]urcu_version_dev_stage)
+
+# Library version information of "liburcu"
 # Following the numbering scheme proposed by libtool for the library version
 # http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
 # Following the numbering scheme proposed by libtool for the library version
 # http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
-AC_SUBST([URCU_LIBRARY_VERSION], [7:0:1])
+m4_define([urcu_lib_version_current], [9])
+m4_define([urcu_lib_version_revision], [0])
+m4_define([urcu_lib_version_age], [1])
+m4_define([urcu_lib_version], urcu_lib_version_current[:]urcu_lib_version_revision[:]urcu_lib_version_age)
+
+
+##                     ##
+## Autoconf base setup ##
+##                     ##
+
+AC_PREREQ([2.69])
+AC_INIT([userspace-rcu],[urcu_version],[mathieu dot desnoyers at efficios dot com],[],[http://liburcu.org/])
 
 AC_CONFIG_HEADERS([include/config.h include/urcu/config.h])
 AC_CONFIG_AUX_DIR([config])
 
 AC_CONFIG_HEADERS([include/config.h include/urcu/config.h])
 AC_CONFIG_AUX_DIR([config])
@@ -12,88 +34,146 @@ AC_CONFIG_MACRO_DIR([m4])
 AC_CANONICAL_TARGET
 AC_CANONICAL_HOST
 
 AC_CANONICAL_TARGET
 AC_CANONICAL_HOST
 
-AM_INIT_AUTOMAKE([foreign dist-bzip2 no-dist-gzip nostdinc])
+
+##                     ##
+## Automake base setup ##
+##                     ##
+
+AM_INIT_AUTOMAKE([1.12 foreign dist-bzip2 no-dist-gzip nostdinc -Wall -Wno-portability -Werror])
 AM_MAINTAINER_MODE([enable])
 
 AM_MAINTAINER_MODE([enable])
 
-# Enable silent rules if available (Introduced in AM 1.11)
-m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
-
-AC_REQUIRE_AUX_FILE([tap-driver.sh])
-
-AH_TEMPLATE([CONFIG_RCU_SMP], [Enable SMP support. With SMP support enabled, uniprocessors are also supported. With SMP support disabled, UP systems work fine, but the behavior of SMP systems is undefined.])
-AH_TEMPLATE([CONFIG_RCU_HAVE_FENCE], [Defined when on a system that has memory fence instructions.])
-AH_TEMPLATE([CONFIG_RCU_HAVE_FUTEX], [Defined when on a system with futex support.])
-AH_TEMPLATE([CONFIG_RCU_COMPAT_ARCH], [Compatibility mode for i386 which lacks cmpxchg instruction.])
-AH_TEMPLATE([CONFIG_RCU_ARM_HAVE_DMB], [Use the dmb instruction if available for use on ARM.])
-AH_TEMPLATE([CONFIG_RCU_TLS], [TLS provided by the compiler.])
-AH_TEMPLATE([CONFIG_RCU_HAVE_CLOCK_GETTIME], [clock_gettime() is detected.])
-AH_TEMPLATE([CONFIG_RCU_FORCE_SYS_MEMBARRIER], [Require the operating system to support the membarrier system call for default and bulletproof flavors.])
-AH_TEMPLATE([CONFIG_RCU_DEBUG], [Enable internal debugging self-checks. Introduce performance penalty.])
-AH_TEMPLATE([CONFIG_CDS_LFHT_ITER_DEBUG], [Enable extra debugging checks for lock-free hash table iterator traversal. Alters the rculfhash ABI. Make sure to compile both library and application with matching configuration.])
-
-# Allow requiring the operating system to support the membarrier system
-# call. Applies to default and bulletproof flavors.
-AC_ARG_ENABLE([sys-membarrier-fallback],
-       AS_HELP_STRING([--disable-sys-membarrier-fallback], [Abort if sys-membarrier is needed but not available rather than using a fallback.]),
-       [def_sys_membarrier_fallback=$enableval],
-       [def_sys_membarrier_fallback="yes"])
-AS_IF([test "x$def_sys_membarrier_fallback" != "xyes"], [AC_DEFINE([CONFIG_RCU_FORCE_SYS_MEMBARRIER], [1])])
-
-# Allow overriding storage used for TLS variables.
-AC_ARG_ENABLE([compiler-tls],
-       AS_HELP_STRING([--disable-compiler-tls], [Use pthread_getspecific() to emulate Thread Local Storage (TLS) variables.]),
-       [def_compiler_tls=$enableval],
-       [def_compiler_tls="yes"])
-
-# Checks for C compiler
-AC_USE_SYSTEM_EXTENSIONS
-AC_PROG_CC
-AC_PROG_CC_STDC
+# Enable silent rules by default
+AM_SILENT_RULES([yes])
 
 
-# If not overridden, use ax_tls.m4 to check if TLS is available.
-AS_IF([test "x$def_compiler_tls" = "xyes"],
-       [AX_TLS([def_tls_detect=$ac_cv_tls], [:])],
-       [:])
 
 
-AS_IF([test "x$def_tls_detect" = "x"],
-       [:],
-       [AC_DEFINE_UNQUOTED([CONFIG_RCU_TLS], $def_tls_detect)])
+##                               ##
+## OS and Arch specific defaults ##
+##                               ##
 
 
-# Checks for programs.
-AC_PROG_AWK
-AC_PROG_MAKE_SET
-AC_CHECK_PROGS(NPROC, [nproc gnproc])
-AC_CHECK_PROGS(GETCONF, [getconf])
-AS_IF([test "x$NPROC" != "x"],
-       [NPROC_CMD=$NPROC],
-       [AS_IF([test "x$GETCONF" != "x"],
-               [NPROC_CMD="$GETCONF _NPROCESSORS_ONLN"],
-               [NPROC_CMD="echo 1"]
-       )]
+AS_CASE([$host],
+  [*-cygwin* | *-msys*], [LT_NO_UNDEFINED="-no-undefined"]
 )
 )
-AC_SUBST([NPROC_CMD], [$NPROC_CMD])
 
 
-LT_INIT
+
+##                   ##
+## C compiler checks ##
+##                   ##
+
+# Choose the C compiler
+AC_PROG_CC
+# AC_PROG_CC_STDC was merged in AC_PROG_CC in autoconf 2.70
+m4_version_prereq([2.70], [], [AC_PROG_CC_STDC])
+
+# Make sure the C compiler supports C99
+AS_IF([test "$ac_cv_prog_cc_c99" = "no"], [AC_MSG_ERROR([The compiler does not support C99])])
+
+# Enable available system extensions and LFS support
+AC_USE_SYSTEM_EXTENSIONS
+AC_SYS_LARGEFILE
+
+# Check if the selected C compiler supports atomic builtins
+AE_CC_ATOMIC_BUILTINS
+
+
+##                     ##
+## C++ compiler checks ##
+##                     ##
+
+# Require a C++11 compiler without GNU extensions (-std=c++11)
+AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory])
+
+# Make sure the C compiler supports __attribute__
+AX_C___ATTRIBUTE__
+AS_IF([test "x$ax_cv___attribute__" != "xyes"],
+  [AC_MSG_ERROR([The compiler does not support __attribute__ extensions])])
+
+# Make sure we have pthread support
+AX_PTHREAD([], [AC_MSG_ERROR([Could not configure pthread support])])
 
 # Checks for typedefs, structures, and compiler characteristics.
 AC_C_INLINE
 
 # Checks for typedefs, structures, and compiler characteristics.
 AC_C_INLINE
+AC_C_TYPEOF
+AC_TYPE_INT32_T
 AC_TYPE_PID_T
 AC_TYPE_SIZE_T
 AC_TYPE_SSIZE_T
 AC_TYPE_UINT16_T
 AC_TYPE_PID_T
 AC_TYPE_SIZE_T
 AC_TYPE_SSIZE_T
 AC_TYPE_UINT16_T
-AC_TYPE_INT32_T
 AC_TYPE_UINT32_T
 AC_TYPE_UINT64_T
 AC_TYPE_UINT8_T
 
 AC_TYPE_UINT32_T
 AC_TYPE_UINT64_T
 AC_TYPE_UINT8_T
 
-AX_C___ATTRIBUTE__
-AS_IF([test "x$ax_cv___attribute__" = "xyes"],
-       [:],
-       [AC_MSG_ERROR([The compiler does not support __attribute__ extensions])])
+# Detect warning flags supported by the C compiler and append them to
+# WARN_CFLAGS.
+m4_define([WARN_FLAGS_LIST], [ dnl
+  -Wall dnl
+  -Wextra dnl
+  -Wmissing-prototypes dnl
+  -Wmissing-declarations dnl
+  -Wnull-dereference dnl
+  -Wundef dnl
+  -Wshadow dnl
+  -Wjump-misses-init dnl
+  -Wsuggest-attribute=format dnl
+  -Wtautological-constant-out-of-range-compare dnl
+  -Wnested-externs dnl
+  -Wwrite-strings dnl
+  -Wformat=2 dnl
+  -Wstrict-aliasing dnl
+  -Wmissing-noreturn dnl
+  -Winit-self dnl
+  -Wduplicated-cond dnl
+  -Wduplicated-branches dnl
+  -Wlogical-op dnl
+  dnl
+  dnl-Wredundant-decls dnl
+  -Wno-null-dereference dnl
+])
+
+# Pass -Werror as an extra flag during the test: this is needed to make the
+# -Wunknown-warning-option diagnostic fatal with clang.
+AC_LANG_PUSH([C])
+AX_APPEND_COMPILE_FLAGS([WARN_FLAGS_LIST], [WARN_CFLAGS], [-Werror])
+AC_LANG_POP([C])
+
+AC_LANG_PUSH([C++])
+AX_APPEND_COMPILE_FLAGS([WARN_FLAGS_LIST], [WARN_CXXFLAGS], [-Werror])
+AC_LANG_POP([C++])
+
+AE_IF_FEATURE_ENABLED([Werror], [WARN_CFLAGS="${WARN_CFLAGS} -Werror"])
+AE_IF_FEATURE_ENABLED([Werror], [WARN_CXXFLAGS="${WARN_CXXFLAGS} -Werror"])
+
+
+##               ##
+## Header checks ##
+##               ##
+
+AC_HEADER_STDBOOL
+AC_CHECK_HEADERS([ \
+       limits.h \
+       stddef.h \
+       sys/param.h \
+       sys/time.h \
+])
 
 
-AX_PTHREAD(,[AC_MSG_ERROR([Could not configure pthreads support])])
 
 
-AM_CFLAGS="$AM_CFLAGS $PTHREAD_CFLAGS"
+##                 ##
+## Programs checks ##
+##                 ##
+
+AC_PROG_AWK
+AC_PROG_GREP
+AC_PROG_MAKE_SET
+AC_CHECK_PROGS(NPROC, [nproc gnproc])
+AC_CHECK_PROGS(GETCONF, [getconf])
+AC_CHECK_PROGS(TIME, [time])
+
+# Initialize and configure libtool
+LT_INIT
+
+
+##                ##
+## Library checks ##
+##                ##
 
 # Checks for library functions.
 AC_FUNC_MMAP
 
 # Checks for library functions.
 AC_FUNC_MMAP
@@ -108,6 +188,7 @@ AC_CHECK_FUNCS([ \
        munmap \
        rand_r \
        sched_getcpu \
        munmap \
        rand_r \
        sched_getcpu \
+       sched_setaffinity \
        strerror \
        strtoul \
        sysconf \
        strerror \
        strtoul \
        sysconf \
@@ -116,282 +197,140 @@ AC_CHECK_FUNCS([ \
 # AC_FUNC_MALLOC causes problems when cross-compiling.
 #AC_FUNC_MALLOC
 
 # AC_FUNC_MALLOC causes problems when cross-compiling.
 #AC_FUNC_MALLOC
 
-# Check for headers
-AC_HEADER_STDBOOL
-AC_CHECK_HEADERS([ \
-       limits.h \
-       stddef.h \
-       sys/param.h \
-       sys/time.h \
+# Search for clock_gettime() in -lrt
+AC_SEARCH_LIBS([clock_gettime], [rt], [
+  AC_DEFINE([CONFIG_RCU_HAVE_CLOCK_GETTIME], [1], [clock_gettime() is detected.])
 ])
 
 ])
 
-# Find arch type
-AS_CASE([$host_cpu],
-       [k1om], [ARCHTYPE="x86"],
-       [i386], [ARCHTYPE="x86" && SUBARCHTYPE="x86compat"],
-       [i486], [ARCHTYPE="x86"],
-       [i586], [ARCHTYPE="x86"],
-       [i686], [ARCHTYPE="x86"],
-       [amd64], [ARCHTYPE="x86"],
-       [x86_64], [ARCHTYPE="x86"],
-       [powerpc], [ARCHTYPE="ppc"],
-       [ppc64], [ARCHTYPE="ppc"],
-       [powerpc64], [ARCHTYPE="ppc"],
-       [powerpc64le], [ARCHTYPE="ppc"],
-       [ppc], [ARCHTYPE="ppc"],
-       [s390], [ARCHTYPE="s390"],
-       [s390x], [ARCHTYPE="s390"],
-       [sparc], [ARCHTYPE="sparc64"],
-       [sparc64], [ARCHTYPE="sparc64"],
-       [alpha*], [ARCHTYPE="alpha"],
-       [ia64], [ARCHTYPE="ia64"],
-       [arm*], [ARCHTYPE="arm"],
-       [aarch64*], [ARCHTYPE="aarch64"],
-       [mips*], [ARCHTYPE="mips"],
-       [nios2*], [ARCHTYPE="nios2"],
-       [tile*], [ARCHTYPE="tile"],
-       [hppa*], [ARCHTYPE="hppa"],
-       [m68k], [ARCHTYPE="m68k"],
-       [riscv*], [ARCHTYPE="riscv"],
-       [ARCHTYPE="unknown"]
-)
 
 
-AS_CASE([$host],[*-cygwin*],
-       [AM_CONDITIONAL(USE_CYGWIN, true)],
-       [AM_CONDITIONAL(USE_CYGWIN, false)]
-)
+##                             ##
+## Optional features selection ##
+##                             ##
+
+# Allow to fallback to FIXME if the membarrier syscall is unavailable on the
+# running kernel, when disabled, abort if the syscall is unavailable. Applies
+# to default and bulletproof flavors.
+# Enabled by default
+AE_FEATURE_DEFAULT_ENABLE
+AE_FEATURE([sys-membarrier-fallback], [Abort if sys-membarrier is needed but not available rather than using a fallback.])
+
+# Use compiler Thread Local Storage, when disabled use pthread_getspecific() to emulate TLS.
+# Enabled by default
+AE_FEATURE_DEFAULT_ENABLE
+AE_FEATURE([compiler-tls], [Use pthread_getspecific() to emulate Thread Local Storage (TLS) variables.])
+
+# smp-support configure option
+# Enabled by default
+AE_FEATURE_DEFAULT_ENABLE
+AE_FEATURE([smp-support], [Disable SMP support. Warning: only use this on uniprocessor systems.])
 
 
-AC_SUBST(ARCHTYPE)
-AC_SUBST(SUBARCHTYPE)
+# RCU debugging option
+# Disabled by default
+AE_FEATURE_DEFAULT_DISABLE
+AE_FEATURE([rcu-debug], [Enable internal debugging self-checks. Introduces a performance penalty.])
 
 
-UATOMICSRC=include/urcu/uatomic/$ARCHTYPE.h
-ARCHSRC=include/urcu/arch/$ARCHTYPE.h
+# rculfhash iterator debugging
+# Disabled by default
+AE_FEATURE_DEFAULT_DISABLE
+AE_FEATURE([cds-lfht-iter-debug], [Enable extra debugging checks for lock-free hash table iterator traversal. Alters the rculfhash ABI. Make sure to compile both library and application with matching configuration.])
+
+# Use compiler atomic builtins, when disabled use our legacy uatomic implementation.
+# Disabled by default
+AE_FEATURE_DEFAULT_DISABLE
+AE_FEATURE([compiler-atomic-builtins], [Enable the use of compiler atomic builtins.])
+
+# emit legacy memory barriers
+# Enable by default
+AE_FEATURE_DEFAULT_ENABLE
+AE_FEATURE([legacy-mb], [Disable legacy memory barriers.])
+
+# When given, add -Werror to WARN_CFLAGS and WARN_CXXFLAGS.
+# Disabled by default
+AE_FEATURE_DEFAULT_DISABLE
+AE_FEATURE([Werror],[Treat compiler warnings as errors.])
+
+##                                                                    ##
+## Set defines for optional features conditionnals in the source code ##
+##                                                                    ##
+
+AE_IF_FEATURE_DISABLED([sys-membarrier-fallback], [
+  AC_DEFINE([CONFIG_RCU_FORCE_SYS_MEMBARRIER], [1], [Require the operating system to support the membarrier system call for default and bulletproof flavors.])
+])
 
 
-AS_IF([test "x$SUBARCHTYPE" = xx86compat],[
-       AC_DEFINE([CONFIG_RCU_COMPAT_ARCH], [1])
+AE_IF_FEATURE_ENABLED([compiler-tls], [
+  AC_DEFINE([CONFIG_RCU_TLS], [1], [Use compiler provided Thread Local Storage.])
 ])
 
 ])
 
-AS_IF([test "$host_cpu" = "armv7l"],[
-       AM_CFLAGS="$AM_CFLAGS -mcpu=cortex-a9 -mtune=cortex-a9 -O1"
+AE_IF_FEATURE_ENABLED([smp-support], [
+  AC_DEFINE([CONFIG_RCU_SMP], [1], [Enable SMP support. With SMP support enabled, uniprocessors are also supported. With SMP support disabled, UP systems work fine, but the behavior of SMP systems is undefined.])
 ])
 
 ])
 
-# ARM-specific checks
-AS_IF([test "x$ARCHTYPE" = "xarm"],[
-       AC_MSG_CHECKING([for dmb instruction])
-       AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
-                               int main()
-                               {
-                                       asm volatile("dmb":::"memory");
-                                       return 0;
-                               }
-               ]])
-       ],[
-               AC_MSG_RESULT([yes])
-               AC_DEFINE([CONFIG_RCU_ARM_HAVE_DMB], [1])
-       ],[
-               AC_MSG_RESULT([no])
-       ])
+AE_IF_FEATURE_ENABLED([rcu-debug], [
+  AC_DEFINE([CONFIG_RCU_DEBUG], [1], [Enable internal debugging self-checks. Introduces a performance penalty.])
 ])
 
 ])
 
-# Tile-specific checks
-AS_IF([echo "$host_cpu" | grep "^tile"],[
-       AC_MSG_CHECKING([for Tile architecture type])
-       AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
-                               #ifndef __tilegx__
-                               #error
-                               #endif
-               ]])
-       ],[
-               AC_MSG_RESULT([ok])
-       ],[
-               AC_MSG_FAILURE([URCU has only been tested on the TileGx architecture. For other Tile* architectures, please run the tests first and report the results to the maintainer so that proper support can be added.])
-       ])
+AE_IF_FEATURE_ENABLED([cds-lfht-iter-debug], [
+  AC_DEFINE([CONFIG_CDS_LFHT_ITER_DEBUG], [1], [Enable extra debugging checks for lock-free hash table iterator traversal. Alters the rculfhash ABI. Make sure to compile both library and application with matching configuration.])
 ])
 
 ])
 
-# x86-specific checks
-AS_IF([test "x$ARCHTYPE" = "xx86"],[
-       AC_MSG_CHECKING([if architecture really supports the mfence instruction])
-       #For now, using lock; addl compatibility mode even for i686, because the
-       #Pentium III is seen as a i686, but lacks mfence instruction.
-       #Only using fence for x86_64.
-       #
-       #k1om is the name for the Intel MIC family (Xeon Phi). It is an x86_64
-       #variant but lacks fence instructions.
-       AS_IF([test "x$host_cpu" != "xi386" -a "x$host_cpu" != "xi486" -a "x$host_cpu" != "xi586" -a "x$host_cpu" != "xi686" -a "x$host_vendor" != "xk1om" -a "x$host_cpu" != "xk1om"],[
-               AC_MSG_RESULT([yes])
-               AC_DEFINE([CONFIG_RCU_HAVE_FENCE], [1])
-               config_rcu_have_fence=yes
-       ],[
-               AC_MSG_RESULT([no])
-               config_rcu_have_fence=no
-       ])
+AE_IF_FEATURE_ENABLED([compiler-atomic-builtins], [
+  AC_DEFINE([CONFIG_RCU_USE_ATOMIC_BUILTINS], [1], [Use compiler atomic builtins.])
 ])
 
 ])
 
-# Check if sys_futex() is available
-AC_MSG_CHECKING([for sys_futex()])
-AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
-               #include <sys/syscall.h>
-               #ifndef __NR_futex
-               #error "futexes not available"
-               #endif
-       ]])
-],[
-       AC_MSG_RESULT([yes])
-       AC_DEFINE([CONFIG_RCU_HAVE_FUTEX], [1])
-       compat_futex_test=0
-],[
-       AC_MSG_RESULT([no])
-       compat_futex_test=1
+AE_IF_FEATURE_ENABLED([legacy-mb], [
+  AC_DEFINE([CONFIG_RCU_EMIT_LEGACY_MB], [1], [Emit legacy memory barriers that were documented in the APIs.])
 ])
 
 ])
 
-# Search for clock_gettime
-AC_SEARCH_LIBS([clock_gettime], [rt], [
-       AC_DEFINE([CONFIG_RCU_HAVE_CLOCK_GETTIME], [1])
-       config_rcu_have_clock_gettime=yes
-], [])
+##                                                                          ##
+## Set automake variables for optional feature conditionnals in Makefile.am ##
+##                                                                          ##
 
 
-AM_CONDITIONAL([COMPAT_FUTEX], [test "x$compat_futex_test" = "x1"])
-AM_CONDITIONAL([COMPAT_ARCH], [test "x$SUBARCHTYPE" = "xx86compat"])
-AM_CONDITIONAL([NO_SHARED], [test "x$enable_shared" = "xno"])
+# Building the examples requires the shared libraries to be enabled
+AM_CONDITIONAL([ENABLE_EXAMPLES], AE_IS_FEATURE_ENABLED([shared]))
 
 
-# smp-support configure option
-AC_ARG_ENABLE([smp-support], 
-       AS_HELP_STRING([--disable-smp-support], [Disable SMP support. Warning: only use this on uniprocessor systems. [default=enabled]]),
-       [def_smp_support=$enableval],
-       [def_smp_support="yes"])
-AS_IF([test "x$def_smp_support" = "xyes"], [AC_DEFINE([CONFIG_RCU_SMP], [1])])
 
 
-# RCU debugging option
-AC_ARG_ENABLE([rcu-debug],
-      AS_HELP_STRING([--enable-rcu-debug], [Enable internal debugging
-                     self-checks. Introduce performance penalty.]))
-AS_IF([test "x$enable_rcu_debug" = "xyes"], [
-       AC_DEFINE([CONFIG_RCU_DEBUG], [1])
-])
+##                                          ##
+## Check for optional features dependencies ##
+##                                          ##
 
 
-# rculfhash iterator debugging
-AC_ARG_ENABLE([cds-lfht-iter-debug],
-      AS_HELP_STRING([--enable-cds-lfht-iter-debug], [Enable extra debugging checks for lock-free hash table iterator traversal. Alters the rculfhash ABI. Make sure to compile both library and application with matching configuration.]))
-AS_IF([test "x$enable_cds_lfht_iter_debug" = "xyes"], [
-       AC_DEFINE([CONFIG_CDS_LFHT_ITER_DEBUG], [1])
-])
 
 
-# From the sched_setaffinity(2)'s man page:
-# ~~~~
-# The CPU affinity system calls were introduced in Linux kernel 2.5.8.
-# The library interfaces were introduced in glibc 2.3.  Initially, the
-# glibc interfaces included a cpusetsize argument.  In glibc 2.3.3,
-# the cpuset size argument was removed, but this argument was
-# restored in glibc 2.3.4.
-# ~~~~
-
-# In addition to that, some vendors ported the system call to 2.4
-# kernels.
-
-# Furthermore, when the function first appeared, the MASK argument was
-# an unsigned long pointer, while later it was made into a cpu_set_t
-# pointer.  Systems that have the cpu_set_t version also should have
-# the CPU_ZERO, CPU_SET, etc. macros.
-
-# All this mess means we have to cater for at least 3 different
-# sched_setaffinity prototypes:
-
-# ~~~~
-#  int sched_setaffinity (pid_t pid, unsigned int len, unsigned long *mask);
-#  int sched_setaffinity (pid_t __pid, size_t __cpusetsize, const cpu_set_t *__cpuset);
-#  int sched_setaffinity (pid_t __pid, const cpu_set_t *__mask);
-# ~~~~
-
-AC_CHECK_TYPES([cpu_set_t],
-       [have_cpu_set_t="yes"],
-       [have_cpu_set_t="no"],
-       [#include <sched.h>])
-
-# Confirm that we have CPU_ZERO, and it actually works.
-AC_MSG_CHECKING([whether CPU_ZERO works])
-AH_TEMPLATE([HAVE_CPU_ZERO], [Defined to 1 if we have CPU_ZERO and it works])
-AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
-               #include <sched.h>
-               int main()
-               {
-                       cpu_set_t foo; CPU_ZERO(&foo);
-                       return 0;
-               }
-       ]])
-],[
-       AC_DEFINE(HAVE_CPU_ZERO, 1)
-       AC_MSG_RESULT([yes])
-],[
-       AC_MSG_RESULT([no])
+AE_IF_FEATURE_ENABLED([compiler-atomic-builtins], [
+  AS_IF([test "x$ae_cv_cc_atomic_builtins" != xyes], [
+     AC_MSG_ERROR([The compiler does not support atomic builtins.])
+  ])
 ])
 
 ])
 
-# Confirm that we have CPU_SET, and it actually works.
-AC_MSG_CHECKING([whether CPU_SET works])
-AH_TEMPLATE([HAVE_CPU_SET], [Defined to 1 if we have CPU_SET and it works])
-AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
-               #include <sched.h>
-               int main()
-               {
-                       cpu_set_t foo; CPU_SET(0, &foo);
-                       return 0;
-               }
-       ]])
-],[
-       AC_DEFINE(HAVE_CPU_SET, 1)
-       AC_MSG_RESULT([yes])
-],[
-       AC_MSG_RESULT([no])
-])
+##                                             ##
+## Substitute variables for use in Makefile.am ##
+##                                             ##
 
 
-# First check if the function is available at all.
-AC_CHECK_FUNCS([sched_setaffinity],[
-       # Okay, we have it.  Check if also have cpu_set_t.  If we don't,
-       # then we have the first version using unsigned long, and no
-       # CPU_ZERO, etc. macros.  If we do have cpu_set_t, we may have the
-       # version with 2 or 3 arguments.  In that case, CPU_ZERO, etc.,
-       # should also be present, but we confirm nonetheless.
-
-       AS_IF([test "x$have_cpu_set_t" = "xyes"], [
-               # We do have it.
-               # Check how many arguments does sched_setaffinity take.
-               # Should be 3 or 2.
-               AC_MSG_CHECKING([how many arguments sched_setaffinity takes])
-               AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
-                               #include <sched.h>
-                               int main()
-                               {
-                                       cpu_set_t foo;
-                                       sched_setaffinity(0, sizeof (foo), &foo);
-                                       return 0;
-                               }
-                       ]])
-               ],
-               [sched_set_affinity_args=3],
-               [sched_set_affinity_args=2])
-               AC_DEFINE_UNQUOTED(SCHED_SETAFFINITY_ARGS,
-                       $sched_set_affinity_args,
-                       [Defined to sched_setaffinity's number of arguments.])
-               AC_MSG_RESULT([$sched_set_affinity_args])
-       ],[
-               # No cpu_set_t, always 3 args.
-               AC_DEFINE(SCHED_SETAFFINITY_ARGS, 3)
-       ])
-])
+# Library versions for libtool
+AC_SUBST([URCU_LIBRARY_VERSION], [urcu_lib_version])
+
+AC_SUBST(LT_NO_UNDEFINED)
 
 
-AM_CPPFLAGS="-include config.h"
+# The order in which the include folders are searched is important.
+# The top_builddir should always be searched first in the event that a build
+# time generated file is included.
+AM_CPPFLAGS="-I\$(top_builddir)/include -I\$(top_srcdir)/include -include config.h"
 AC_SUBST(AM_CPPFLAGS)
 
 AC_SUBST(AM_CPPFLAGS)
 
-AM_CFLAGS="-Wall -Wextra -Wno-unused-parameter $AM_CFLAGS"
+AM_CFLAGS="$WARN_CFLAGS $PTHREAD_CFLAGS"
 AC_SUBST(AM_CFLAGS)
 
 AC_SUBST(AM_CFLAGS)
 
-AC_CONFIG_LINKS([
-       include/urcu/arch.h:$ARCHSRC
-       include/urcu/uatomic.h:$UATOMICSRC
-])
+AM_CXXFLAGS="$WARN_CXXFLAGS $PTHREAD_CFLAGS"
+AC_SUBST(AM_CXXFLAGS)
+
+
+##                                     ##
+## Output files generated by configure ##
+##                                     ##
+
 AC_CONFIG_FILES([
        Makefile
        doc/Makefile
        doc/examples/Makefile
 AC_CONFIG_FILES([
        Makefile
        doc/Makefile
        doc/examples/Makefile
+       extras/Makefile
        include/Makefile
        src/Makefile
        tests/Makefile
        include/Makefile
        src/Makefile
        tests/Makefile
@@ -405,69 +344,10 @@ AC_CONFIG_FILES([
        src/liburcu-cds.pc
        src/liburcu-qsbr.pc
        src/liburcu-mb.pc
        src/liburcu-cds.pc
        src/liburcu-qsbr.pc
        src/liburcu-mb.pc
-       src/liburcu-signal.pc
+       src/liburcu-memb.pc
 ])
 
 ])
 
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_bp_perf_global.tap], [chmod +x tests/regression/rcutorture_urcu_bp_perf_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_bp_perf_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_bp_perf_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_bp_perf_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_bp_perf_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_bp_rperf_global.tap], [chmod +x tests/regression/rcutorture_urcu_bp_rperf_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_bp_rperf_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_bp_rperf_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_bp_rperf_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_bp_rperf_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_bp_stress_global.tap], [chmod +x tests/regression/rcutorture_urcu_bp_stress_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_bp_stress_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_bp_stress_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_bp_stress_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_bp_stress_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_bp_uperf_global.tap], [chmod +x tests/regression/rcutorture_urcu_bp_uperf_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_bp_uperf_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_bp_uperf_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_bp_uperf_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_bp_uperf_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_mb_perf_global.tap], [chmod +x tests/regression/rcutorture_urcu_mb_perf_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_mb_perf_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_mb_perf_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_mb_perf_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_mb_perf_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_mb_rperf_global.tap], [chmod +x tests/regression/rcutorture_urcu_mb_rperf_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_mb_rperf_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_mb_rperf_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_mb_rperf_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_mb_rperf_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_mb_stress_global.tap], [chmod +x tests/regression/rcutorture_urcu_mb_stress_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_mb_stress_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_mb_stress_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_mb_stress_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_mb_stress_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_mb_uperf_global.tap], [chmod +x tests/regression/rcutorture_urcu_mb_uperf_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_mb_uperf_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_mb_uperf_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_mb_uperf_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_mb_uperf_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_membarrier_perf_global.tap], [chmod +x tests/regression/rcutorture_urcu_membarrier_perf_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_membarrier_perf_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_membarrier_perf_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_membarrier_perf_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_membarrier_perf_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_membarrier_rperf_global.tap], [chmod +x tests/regression/rcutorture_urcu_membarrier_rperf_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_membarrier_rperf_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_membarrier_rperf_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_membarrier_rperf_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_membarrier_rperf_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_membarrier_stress_global.tap], [chmod +x tests/regression/rcutorture_urcu_membarrier_stress_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_membarrier_stress_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_membarrier_stress_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_membarrier_stress_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_membarrier_stress_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_membarrier_uperf_global.tap], [chmod +x tests/regression/rcutorture_urcu_membarrier_uperf_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_membarrier_uperf_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_membarrier_uperf_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_membarrier_uperf_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_membarrier_uperf_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_qsbr_perf_global.tap], [chmod +x tests/regression/rcutorture_urcu_qsbr_perf_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_qsbr_perf_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_qsbr_perf_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_qsbr_perf_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_qsbr_perf_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_qsbr_rperf_global.tap], [chmod +x tests/regression/rcutorture_urcu_qsbr_rperf_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_qsbr_rperf_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_qsbr_rperf_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_qsbr_rperf_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_qsbr_rperf_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_qsbr_stress_global.tap], [chmod +x tests/regression/rcutorture_urcu_qsbr_stress_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_qsbr_stress_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_qsbr_stress_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_qsbr_stress_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_qsbr_stress_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_qsbr_uperf_global.tap], [chmod +x tests/regression/rcutorture_urcu_qsbr_uperf_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_qsbr_uperf_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_qsbr_uperf_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_qsbr_uperf_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_qsbr_uperf_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_signal_perf_global.tap], [chmod +x tests/regression/rcutorture_urcu_signal_perf_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_signal_perf_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_signal_perf_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_signal_perf_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_signal_perf_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_signal_rperf_global.tap], [chmod +x tests/regression/rcutorture_urcu_signal_rperf_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_signal_rperf_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_signal_rperf_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_signal_rperf_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_signal_rperf_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_signal_stress_global.tap], [chmod +x tests/regression/rcutorture_urcu_signal_stress_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_signal_stress_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_signal_stress_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_signal_stress_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_signal_stress_perthread.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_signal_uperf_global.tap], [chmod +x tests/regression/rcutorture_urcu_signal_uperf_global.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_signal_uperf_percpu.tap], [chmod +x tests/regression/rcutorture_urcu_signal_uperf_percpu.tap])
-AC_CONFIG_FILES([tests/regression/rcutorture_urcu_signal_uperf_perthread.tap], [chmod +x tests/regression/rcutorture_urcu_signal_uperf_perthread.tap])
+AC_CONFIG_FILES([tests/utils/env.sh],[chmod +x tests/utils/env.sh])
 
 
 AC_OUTPUT
 
 
 AC_OUTPUT
@@ -476,58 +356,58 @@ AC_OUTPUT
 # Mini-report on what will be built.
 #
 
 # Mini-report on what will be built.
 #
 
-PPRINT_INIT
-PPRINT_SET_INDENT(1)
-PPRINT_SET_TS(38)
+AE_PPRINT_INIT
+AE_PPRINT_SET_INDENT(1)
+AE_PPRINT_SET_TS(38)
 
 AS_ECHO
 
 AS_ECHO
-AS_ECHO("${PPRINT_COLOR_BLDBLU}Userspace-RCU $PACKAGE_VERSION${PPRINT_COLOR_RST}")
+AS_ECHO("${AE_PPRINT_COLOR_BLDBLU}Userspace-RCU $PACKAGE_VERSION${AE_PPRINT_COLOR_RST}")
 AS_ECHO
 
 AS_ECHO
 
-PPRINT_SUBTITLE([Features])
+AE_PPRINT_SUBTITLE([Features])
 
 
-PPRINT_PROP_STRING([Target architecture], $host_cpu)
+AE_PPRINT_PROP_STRING([Target architecture], $host_cpu)
 
 # SMP support enabled/disabled
 
 # SMP support enabled/disabled
-test "x$def_smp_support" = "xyes" && value=1 || value=0
-PPRINT_PROP_BOOL([SMP support], $value)
-
-# Memory fence support available
-test "x$config_rcu_have_fence" = "xyes" && value=1 || value=0
-PPRINT_PROP_BOOL([Memory fence instructions], $value)
-
-# Futex support available
-test "x$compat_futex_test" = "x0" && value=1 || value=0
-PPRINT_PROP_BOOL([Futex support], $value)
+AE_IS_FEATURE_ENABLED([smp-support]) && value=1 || value=0
+AE_PPRINT_PROP_BOOL([SMP support], $value)
 
 # TLS
 
 # TLS
-test "x$def_tls_detect" = "x" && value="pthread_getspecific()" || value="$def_tls_detect"
-PPRINT_PROP_STRING([Thread Local Storage (TLS)], [$value])
+AE_IS_FEATURE_ENABLED([compiler-tls]) && value="compiler TLS" || value="pthread_getspecific()"
+AE_PPRINT_PROP_STRING([Thread Local Storage (TLS)], [$value])
 
 # clock_gettime() available
 
 # clock_gettime() available
-test "x$config_rcu_have_clock_gettime" = "xyes" && value=1 || value=0
-PPRINT_PROP_BOOL([clock_gettime()], $value)
+test "x$ac_cv_search_function_clock_gettime" != "xno" && value=1 || value=0
+AE_PPRINT_PROP_BOOL([clock_gettime()], $value)
 
 # Require membarrier
 
 # Require membarrier
-test "x$def_sys_membarrier_fallback" != "xyes" && value=1 || value=0
-PPRINT_PROP_BOOL([Require membarrier], $value)
+AE_IS_FEATURE_ENABLED([sys-membarrier-fallback]) && value=0 || value=1
+AE_PPRINT_PROP_BOOL([Require membarrier], $value)
 
 # RCU debug enabled/disabled
 
 # RCU debug enabled/disabled
-test "x$enable_rcu_debug" = "xyes" && value=1 || value=0
-PPRINT_PROP_BOOL([Internal debugging], $value)
+AE_IS_FEATURE_ENABLED([rcu-debug]) && value=1 || value=0
+AE_PPRINT_PROP_BOOL([Internal debugging], $value)
 
 # rculfhash iterator debug enabled/disabled
 
 # rculfhash iterator debug enabled/disabled
-test "x$enable_cds_lfht_iter_debug" = "xyes" && value=1 || value=0
-PPRINT_PROP_BOOL([Lock-free hash table iterator debugging], $value)
+AE_IS_FEATURE_ENABLED([cds-lfht-iter-debug]) && value=1 || value=0
+AE_PPRINT_PROP_BOOL([Lock-free HT iterator debugging], $value)
+
+AE_PPRINT_PROP_BOOL([Multi-flavor support], 1)
+
+# atomic builtins enabled/disabled
+AE_IS_FEATURE_ENABLED([compiler-atomic-builtins]) && value=1 || value=0
+AE_PPRINT_PROP_BOOL([Use compiler atomic builtins], $value)
 
 
-PPRINT_PROP_BOOL([Multi-flavor support], 1)
+# legacy memory barriers
+AE_IS_FEATURE_ENABLED([legacy-mb]) && value=1 || value=0
+AE_PPRINT_PROP_BOOL([Emit legacy memory barriers], $value)
 
 report_bindir="`eval eval echo $bindir`"
 report_libdir="`eval eval echo $libdir`"
 
 
 report_bindir="`eval eval echo $bindir`"
 report_libdir="`eval eval echo $libdir`"
 
-# Print the bindir and libdir this `make install' will install into.
+# Print the bindir and libdir this 'make install' will install into.
 AS_ECHO
 AS_ECHO
-PPRINT_SUBTITLE([Install directories])
-PPRINT_PROP_STRING([Binaries], [$report_bindir])
-PPRINT_PROP_STRING([Libraries], [$report_libdir])
+AE_PPRINT_SUBTITLE([Install directories])
+AE_PPRINT_PROP_STRING([Binaries], [$report_bindir])
+AE_PPRINT_PROP_STRING([Libraries], [$report_libdir])
 
 
index cf2e902c7c0210e94408ee749837283b2a71b1b0..19a27097a0632f63502402c2edd20ed74ae78aa3 100644 (file)
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
+
 SUBDIRS = examples
 
 dist_doc_DATA = rcu-api.md \
 SUBDIRS = examples
 
 dist_doc_DATA = rcu-api.md \
index 49a3c7c967e30d0636e6cfb2fbdee0b9d2c30a47..9940a366bbe9e42f68ecc0406aeb210026b2ee3d 100644 (file)
@@ -1,3 +1,9 @@
+<!--
+SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+
+SPDX-License-Identifier: CC-BY-4.0
+-->
+
 Userspace RCU Concurrent Data Structures (CDS) API
 ==================================================
 
 Userspace RCU Concurrent Data Structures (CDS) API
 ==================================================
 
@@ -33,12 +39,12 @@ Downside over `list.h`: lookup of tail in O(n).
 
 Doubly-linked list, with single pointer list head.
 Requires mutual exclusion on updates, allows RCU read traversals. Useful
 
 Doubly-linked list, with single pointer list head.
 Requires mutual exclusion on updates, allows RCU read traversals. Useful
-for implementing hash tables. Downside over rculist.h: lookup of tail in O(n).
+for implementing hash tables. Downside over `rculist.h`: lookup of tail in O(n).
 
 
 ### `urcu/wfstack.h`
 
 
 
 ### `urcu/wfstack.h`
 
-Stack with wait-free push and wait-free pop_all. Both
+Stack with wait-free push and wait-free pop\_all. Both
 blocking and non-blocking pop and traversal operations are provided. This
 stack does _not_ specifically rely on RCU. Various synchronization techniques
 can be used to deal with pop ABA. Those are detailed in the API.
 blocking and non-blocking pop and traversal operations are provided. This
 stack does _not_ specifically rely on RCU. Various synchronization techniques
 can be used to deal with pop ABA. Those are detailed in the API.
@@ -59,7 +65,7 @@ traversal (see API for details).
 
 ### `urcu/lfstack.h`
 
 
 ### `urcu/lfstack.h`
 
-Stack with lock-free push, lock-free pop, wait-free pop_all,
+Stack with lock-free push, lock-free pop, wait-free pop\_all,
 wait-free traversal. Various synchronization techniques can be
 used to deal with pop ABA. Those are detailed in the API.
 This stack does _not_ specifically rely on RCU.
 wait-free traversal. Various synchronization techniques can be
 used to deal with pop ABA. Those are detailed in the API.
 This stack does _not_ specifically rely on RCU.
@@ -76,7 +82,7 @@ This queue relies on RCU for existence guarantees.
 ### `urcu/rculfhash.h`
 
 Lock-Free Resizable RCU Hash Table. RCU used to provide
 ### `urcu/rculfhash.h`
 
 Lock-Free Resizable RCU Hash Table. RCU used to provide
-existance guarantees. Provides scalable updates, and scalable
+existence guarantees. Provides scalable updates, and scalable
 RCU read-side lookups and traversals. Unique and duplicate keys
 are supported. Provides "uniquify add" and "replace add"
 operations, along with associated read-side traversal uniqueness
 RCU read-side lookups and traversals. Unique and duplicate keys
 are supported. Provides "uniquify add" and "replace add"
 operations, along with associated read-side traversal uniqueness
index edf00ebe3e6222a523c30baf287e13ab093e6dc4..81691692ed5a77aac6132058bd72f7347642ad55 100644 (file)
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
+
 doc_examplesdir = ${docdir}/examples
 
 doc_examples_urcu_flavorsdir = ${doc_examplesdir}/urcu-flavors
 doc_examplesdir = ${docdir}/examples
 
 doc_examples_urcu_flavorsdir = ${doc_examplesdir}/urcu-flavors
@@ -7,12 +11,10 @@ dist_doc_examples_urcu_flavors_DATA = \
        urcu-flavors/Makefile.qsbr \
        urcu-flavors/Makefile.mb \
        urcu-flavors/Makefile.membarrier \
        urcu-flavors/Makefile.qsbr \
        urcu-flavors/Makefile.mb \
        urcu-flavors/Makefile.membarrier \
-       urcu-flavors/Makefile.signal \
        urcu-flavors/Makefile.bp \
        urcu-flavors/qsbr.c \
        urcu-flavors/mb.c \
        urcu-flavors/membarrier.c \
        urcu-flavors/Makefile.bp \
        urcu-flavors/qsbr.c \
        urcu-flavors/mb.c \
        urcu-flavors/membarrier.c \
-       urcu-flavors/signal.c \
        urcu-flavors/bp.c
 
 dist_doc_examples_DATA = \
        urcu-flavors/bp.c
 
 dist_doc_examples_DATA = \
@@ -111,10 +113,8 @@ dist_doc_examples_rculfhash_DATA = \
        rculfhash/cds_lfht_lookup.c \
        rculfhash/cds_lfht_for_each_entry_duplicate.c
 
        rculfhash/cds_lfht_lookup.c \
        rculfhash/cds_lfht_for_each_entry_duplicate.c
 
-if NO_SHARED
-# Don't build examples if shared libraries support was explicitly
-# disabled.
-else
+# Building the examples requires the shared libraries to be enabled
+if ENABLE_EXAMPLES
 
 SUBDIRS_PROXY = hlist list urcu-flavors wfcqueue rculfqueue \
        wfstack lfstack rculfhash
 
 SUBDIRS_PROXY = hlist list urcu-flavors wfcqueue rculfqueue \
        wfstack lfstack rculfhash
index e6196f53104f37796a03fd83320541a436710b32..21cac7b93dfd431a3f0b02bbf27eb652023952c3 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 LOCAL_CFLAGS := -g -O2 -Wall
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 LOCAL_CFLAGS := -g -O2 -Wall
index 08f37283b65bf06b76bf17a912331d6eaa91c44b..676d9b30d7455e9e86eebad4736a15f79f6fb06c 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 all:
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 all:
index 4256035ea75adfe573eac26872d55c73b69cd945..c06be16a6666ee94458c371c8925d887a3d983df 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 all:
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 all:
index f1bf7d79ba0295e6555825e00f5a964dd29b60d6..1f225fd0e9aeec3a9f46c656ba558b59f37c063c 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_hlist_add_head_rcu
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_hlist_add_head_rcu
index 642b04de4818243278110a30c0ff46e6fc9b79df..e042ffac59f9eb3276d1ddcd33452d33dc4c623a 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_hlist_del_rcu
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_hlist_del_rcu
index 035ecbfe3661cb4cc646a16f93436f79cc47a52f..86380a51efa9594df8f867b2eedbe197ba7d91f6 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_hlist_for_each_entry_rcu
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_hlist_for_each_entry_rcu
index 23d0a0c2484f20ba8ef4506abe48b10324ddae35..9b40d8a9601c856ee00211d0d7ee164faaa8b975 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_hlist_for_each_rcu
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_hlist_for_each_rcu
index bfe71c4263680bdf8b81132908d191699c197535..6087bae8b2d4ac524106c847e45c90b71ce057b3 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to add into a non-circular linked-list safely
  * against concurrent RCU traversals.
  */
  * This example shows how to add into a non-circular linked-list safely
  * against concurrent RCU traversals.
  */
@@ -28,7 +21,7 @@ struct mynode {
        struct cds_hlist_node node;     /* Linked-list chaining */
 };
 
        struct cds_hlist_node node;     /* Linked-list chaining */
 };
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_HLIST_HEAD(mylist);         /* Defines an empty hlist head */
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_HLIST_HEAD(mylist);         /* Defines an empty hlist head */
index 2c0008eefb2b791e204d337f21c203756dbb85d7..1ef229f61a9d6e2c2a621b80ab6111f3bd1732c5 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to remove from a non-circular linked-list
  * safely against concurrent RCU traversals.
  */
  * This example shows how to remove from a non-circular linked-list
  * safely against concurrent RCU traversals.
  */
@@ -37,7 +30,7 @@ void free_node_rcu(struct rcu_head *head)
        free(node);
 }
 
        free(node);
 }
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_HLIST_HEAD(mylist);         /* Defines an empty hlist head */
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_HLIST_HEAD(mylist);         /* Defines an empty hlist head */
index 5f8fa72fd3d01fb9227c0cdc8faec9d8fd51521f..bf675fd809233d8c86ea7414e1d8a6bf583f0ca0 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to do a non-circular RCU linked list
  * traversal, safely against concurrent RCU updates.
  */
  * This example shows how to do a non-circular RCU linked list
  * traversal, safely against concurrent RCU updates.
  */
@@ -28,7 +21,7 @@ struct mynode {
        struct cds_hlist_node node;     /* Linked-list chaining */
 };
 
        struct cds_hlist_node node;     /* Linked-list chaining */
 };
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_HLIST_HEAD(mylist);         /* Defines an empty hlist head */
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_HLIST_HEAD(mylist);         /* Defines an empty hlist head */
index fe31b54108cecc3eea6f1cb257a438fd507e06cb..464205400c7938edcfda2171cb962d66afaabbe7 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to do a non-circular RCU linked list
  * traversal, safely against concurrent RCU updates.
  * cds_hlist_for_each_rcu() iterates on struct cds_hlist_node, and thus,
  * This example shows how to do a non-circular RCU linked list
  * traversal, safely against concurrent RCU updates.
  * cds_hlist_for_each_rcu() iterates on struct cds_hlist_node, and thus,
@@ -31,7 +24,7 @@ struct mynode {
        struct cds_hlist_node node;     /* Linked-list chaining */
 };
 
        struct cds_hlist_node node;     /* Linked-list chaining */
 };
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_HLIST_HEAD(mylist);         /* Defines an empty hlist head */
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_HLIST_HEAD(mylist);         /* Defines an empty hlist head */
index 42398ed2b23ee3c20e8f8eba79efc99ca4517609..189a7bd996d75c7f3b3d6f6a4cecbbc87ccef973 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 all:
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 all:
index 9ee48d5b5dab3de2c6ac896d32896c4c891a235f..07a07d7bf1f019245c81f65d1a5b4d2ba52db1bd 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfs_pop_all_blocking
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfs_pop_all_blocking
index da434587d40ccf28730fbea08ef463feb578468d..f5fa1c868963df6752d8d593a23b8decb2c3a07c 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfs_pop_blocking
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfs_pop_blocking
index a2078c4f1d927def7efc1aea4c21e7d5ecf90081..8908afe2e12d7022efaa64063128eda43220e2aa 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfs_push
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfs_push
index 1aaffb00a92cd69c59448f75c0b6b037cb49eb99..290fe8096f9c6c987f19ce2469d5780db27e2d00 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to pop all nodes from a lfstack.
  */
 
  * This example shows how to pop all nodes from a lfstack.
  */
 
@@ -27,7 +20,7 @@ struct mynode {
        struct cds_lfs_node node;       /* Chaining in stack */
 };
 
        struct cds_lfs_node node;       /* Chaining in stack */
 };
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_lfs_stack mystack;   /* Stack */
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_lfs_stack mystack;   /* Stack */
index 68c17e4065096f147db7e20b795015feea748a98..25d6381bb582df70c89c54f3eb652ddc8e8419ea 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to pop nodes from a lfstack.
  */
 
  * This example shows how to pop nodes from a lfstack.
  */
 
@@ -27,7 +20,7 @@ struct mynode {
        struct cds_lfs_node node;       /* Chaining in stack */
 };
 
        struct cds_lfs_node node;       /* Chaining in stack */
 };
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_lfs_stack mystack;   /* Stack */
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_lfs_stack mystack;   /* Stack */
index 3b048f4559974683bdf3a6c92b416e7a4ad57b2c..b3c5b933f0cf8b9a0b2aa80ed25aa515b720b83b 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to push nodes into a lfstack.
  */
 
  * This example shows how to push nodes into a lfstack.
  */
 
@@ -27,7 +20,7 @@ struct mynode {
        struct cds_lfs_node node;       /* Chaining in stack */
 };
 
        struct cds_lfs_node node;       /* Chaining in stack */
 };
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_lfs_stack mystack;   /* Stack */
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_lfs_stack mystack;   /* Stack */
index 79a09e313ad6bff1934b936e7e1d30977e021f21..034a59315a3952069a14ace68ad31e2173885021 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 all:
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 all:
index faf2c948c19a02cc6d9d5ce5502d25eec11def12..91ab9039af9be9e72083514600984cd1ed6c1359 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_list_add_rcu
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_list_add_rcu
index 30310242c5f199328db01f17535e37b661bc21a6..6a60c03fa79d08894ecb68f915acdde3c2ff446b 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_list_add_tail_rcu
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_list_add_tail_rcu
index 74cef2b6e54b479981bdcb1ec7e0efaf26c3cbc1..1509267c262c7474df3461336b7cb96338808863 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_list_del_rcu
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_list_del_rcu
index 911301e07e9602ab9dc4d66d9b85041392c72875..af0805693bad53957c5760ca9dc166198db0d3ef 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_list_for_each_entry_rcu
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_list_for_each_entry_rcu
index 2f2f02fefd77a3c64b8c3a03e5754d15d08b7557..54bb040a12b8f43de7de5ca76a51d2cf493344b6 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_list_for_each_rcu
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_list_for_each_rcu
index 5e130b350063c99365124f1f1630980da9f271ef..a7cc56d97f283d653204f336c53babf8f71bd147 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_list_replace_rcu
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_list_replace_rcu
index 4235d251ee04327f80a012ea458b13713cd5bf00..13da5b39cf51efd9b5c6855704a28b8900cbdcb7 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to add into a linked-list safely against
  * concurrent RCU traversals.
  */
  * This example shows how to add into a linked-list safely against
  * concurrent RCU traversals.
  */
@@ -28,7 +21,7 @@ struct mynode {
        struct cds_list_head node;      /* Linked-list chaining */
 };
 
        struct cds_list_head node;      /* Linked-list chaining */
 };
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_LIST_HEAD(mylist);          /* Defines an empty list head */
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_LIST_HEAD(mylist);          /* Defines an empty list head */
index 653da6cfc48fdc5540091970caf3b335cc09fb30..475cf6624a5ca65f2a0068a86da006eb77f2ea8f 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to add into tail of a linked-list safely
  * against concurrent RCU traversals.
  */
  * This example shows how to add into tail of a linked-list safely
  * against concurrent RCU traversals.
  */
@@ -28,7 +21,7 @@ struct mynode {
        struct cds_list_head node;      /* Linked-list chaining */
 };
 
        struct cds_list_head node;      /* Linked-list chaining */
 };
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_LIST_HEAD(mylist);          /* Defines an empty list head */
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_LIST_HEAD(mylist);          /* Defines an empty list head */
index 1f4265c73e82fd9342de9049bef577c3acc95f15..b4e4c137246238cbef1e1b43ac0862d26cf40d3d 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to remove from a linked-list safely against
  * concurrent RCU traversals.
  */
  * This example shows how to remove from a linked-list safely against
  * concurrent RCU traversals.
  */
@@ -37,7 +30,7 @@ void free_node_rcu(struct rcu_head *head)
        free(node);
 }
 
        free(node);
 }
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_LIST_HEAD(mylist);          /* Defines an empty list head */
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_LIST_HEAD(mylist);          /* Defines an empty list head */
index 6e4f7d6533f2db10322387592fbac0afea8cf8cb..ef9e954bf2f309465f14b38c84435954b6ebd997 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to do a RCU linked list traversal, safely
  * against concurrent RCU updates.
  */
  * This example shows how to do a RCU linked list traversal, safely
  * against concurrent RCU updates.
  */
@@ -28,7 +21,7 @@ struct mynode {
        struct cds_list_head node;      /* Linked-list chaining */
 };
 
        struct cds_list_head node;      /* Linked-list chaining */
 };
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_LIST_HEAD(mylist);          /* Defines an empty list head */
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_LIST_HEAD(mylist);          /* Defines an empty list head */
index 12d5c4d80971e53449f972d87dc17a7c5777463f..044aa5efeb7b9f3ace93e2677ad4bf273d78efb6 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to do a RCU linked list traversal, safely
  * against concurrent RCU updates. cds_list_for_each_rcu() iterates on
  * struct cds_list_head, and thus, either caa_container_of() or
  * This example shows how to do a RCU linked list traversal, safely
  * against concurrent RCU updates. cds_list_for_each_rcu() iterates on
  * struct cds_list_head, and thus, either caa_container_of() or
@@ -30,7 +23,7 @@ struct mynode {
        struct cds_list_head node;      /* Linked-list chaining */
 };
 
        struct cds_list_head node;      /* Linked-list chaining */
 };
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_LIST_HEAD(mylist);          /* Defines an empty list head */
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_LIST_HEAD(mylist);          /* Defines an empty list head */
index 39202ea9f41da34a652664988c2d8dc3bf99fab2..d17084b661993f86d66af6b50b262ddba40416b9 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to replace a node within a linked-list safely
  * against concurrent RCU traversals.
  */
  * This example shows how to replace a node within a linked-list safely
  * against concurrent RCU traversals.
  */
@@ -37,7 +30,7 @@ void free_node_rcu(struct rcu_head *head)
        free(node);
 }
 
        free(node);
 }
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_LIST_HEAD(mylist);          /* Defines an empty list head */
 {
        int values[] = { -5, 42, 36, 24, };
        CDS_LIST_HEAD(mylist);          /* Defines an empty list head */
index c64f40a85cbc4080b8b9fdbb8ec18b2e363c1c83..29b28f7d8bb7e8690de0a5f4addf12b80fadb05b 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 all:
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 all:
index 9fab2b66ae1daec70e3d56b1abf9f7a5ec06c958..45333f5579db8199899766646186a16f7fcf32c3 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfht_add
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfht_add
index dcd253abff41952ff61f7635f15e4ec125931d68..6147a414fbcda5bb9ce66ef34994f323cad09fc8 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfht_add_replace
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfht_add_replace
index c74c61e21aac825dc6f8fbbc241c32502e8b46d2..a1772d32efce9c30c83e355fbb14fcd1dc650722 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfht_add_unique
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfht_add_unique
index 6377490739c49af2f9ae15965f23408e377c2d54..982b0f788789524bba0ec70722bfe59439229102 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfht_del
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfht_del
index d79789391a30879525981e2bb953e5d0e47f4d9e..deda37af1d085d681d7371ad782c506bbba1b174 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfht_destroy
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfht_destroy
index 7020b143222ef96c1e05892b923bc6c0d210d4d6..fd5d38dfa1bc068c010dc5aa54778a4441130ea1 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfht_for_each_entry_duplicate
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfht_for_each_entry_duplicate
index 79eb6c492a77356c56d641ae683d92c98ef6bb8b..8330c9ca22198e51fefb3b710a3eb03660fc6238 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfht_lookup
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfht_lookup
index acff676d81193fe2c739a0b36744b5c43d3825b5..927e38d99c24dba7ecf8ef667f549d0b3c631ca2 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to add nodes (allowing duplicate keys) into a
  * RCU lock-free hash table.
  * This hash table requires using a RCU scheme.
  * This example shows how to add nodes (allowing duplicate keys) into a
  * RCU lock-free hash table.
  * This hash table requires using a RCU scheme.
@@ -32,7 +25,7 @@ struct mynode {
        struct cds_lfht_node node;      /* Chaining in hash table */
 };
 
        struct cds_lfht_node node;      /* Chaining in hash table */
 };
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 42, 36, 24, }; /* 42 is duplicated */
        struct cds_lfht *ht;    /* Hash table */
 {
        int values[] = { -5, 42, 42, 36, 24, }; /* 42 is duplicated */
        struct cds_lfht *ht;    /* Hash table */
index 3b64ee00980fda6aa73230994b16b10195ca676c..ecab5708c6cff3620ca2b906d1b7da8c6701b319 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to add nodes into a RCU lock-free hash table
  * with cds_lfht_add_replace(), which replaces existing nodes with the
  * same key if found.
  * This example shows how to add nodes into a RCU lock-free hash table
  * with cds_lfht_add_replace(), which replaces existing nodes with the
  * same key if found.
@@ -54,7 +47,7 @@ void free_node(struct rcu_head *head)
        free(node);
 }
 
        free(node);
 }
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 42, 36, 24, }; /* 42 is duplicated */
        struct cds_lfht *ht;    /* Hash table */
 {
        int values[] = { -5, 42, 42, 36, 24, }; /* 42 is duplicated */
        struct cds_lfht *ht;    /* Hash table */
index 23b29f2c0bf194b80715842dbbf252193f7cfee3..326e19b135f2471fee702899985d29c6544e5844 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to add unique nodes into a RCU lock-free hash
  * table. We use a "seqnum" field to show which node is staying in the
  * hash table. This hash table requires using a RCU scheme.
  * This example shows how to add unique nodes into a RCU lock-free hash
  * table. We use a "seqnum" field to show which node is staying in the
  * hash table. This hash table requires using a RCU scheme.
@@ -43,7 +36,7 @@ int match(struct cds_lfht_node *ht_node, const void *_key)
        return *key == node->value;
 }
 
        return *key == node->value;
 }
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 42, 36, 24, }; /* 42 is duplicated */
        struct cds_lfht *ht;    /* Hash table */
 {
        int values[] = { -5, 42, 42, 36, 24, }; /* 42 is duplicated */
        struct cds_lfht *ht;    /* Hash table */
index f030ee17c6063491130333e5bcbf07989a49c137..4eb3486e5833da4d11333b5977d49ccb312a5421 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to remove nodes from a RCU lock-free hash table.
  * This hash table requires using a RCU scheme.
  */
  * This example shows how to remove nodes from a RCU lock-free hash table.
  * This hash table requires using a RCU scheme.
  */
@@ -50,7 +43,7 @@ void free_node(struct rcu_head *head)
        free(node);
 }
 
        free(node);
 }
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 42, 36, 24, }; /* 42 is duplicated */
        int remove_values[] = { 42, 36, 24, 123, };
 {
        int values[] = { -5, 42, 42, 36, 24, }; /* 42 is duplicated */
        int remove_values[] = { 42, 36, 24, 123, };
index 1c723a56895e9096791817029779332cd4b4f8d1..f0c8219f9194c1fda16330e2498e2d5606f6f3ad 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to use cds_lfht_destroy() to clear memory used
  * by a a RCU lock-free hash table. This hash table requires using a
  * RCU scheme.
  * This example shows how to use cds_lfht_destroy() to clear memory used
  * by a a RCU lock-free hash table. This hash table requires using a
  * RCU scheme.
@@ -41,7 +34,7 @@ void free_node(struct rcu_head *head)
        free(node);
 }
 
        free(node);
 }
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 42, 36, 24, }; /* 42 is duplicated */
        struct cds_lfht *ht;    /* Hash table */
 {
        int values[] = { -5, 42, 42, 36, 24, }; /* 42 is duplicated */
        struct cds_lfht *ht;    /* Hash table */
index a975128f5be28397af4348206e94255fc754e05b..14f39e1f8ba32534dd79bee243645205ba46ab78 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to iterate on duplicate keys within a RCU
  * lock-free hash table. This hash table requires using a RCU scheme.
  */
  * This example shows how to iterate on duplicate keys within a RCU
  * lock-free hash table. This hash table requires using a RCU scheme.
  */
@@ -42,7 +35,7 @@ int match(struct cds_lfht_node *ht_node, const void *_key)
        return *key == node->value;
 }
 
        return *key == node->value;
 }
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 42, 36, 24, }; /* 42 is duplicated */
        int lookup_values[] = { 42, 200, 36, };
 {
        int values[] = { -5, 42, 42, 36, 24, }; /* 42 is duplicated */
        int lookup_values[] = { 42, 200, 36, };
index de2a47f62376af5a5d898f348fdfe4b44d710432..6b06095df1631f0a0640837a72cf0aac58985ec4 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to lookup keys within a RCU lock-free hash
  * table. This hash table requires using a RCU scheme.
  */
  * This example shows how to lookup keys within a RCU lock-free hash
  * table. This hash table requires using a RCU scheme.
  */
@@ -42,7 +35,7 @@ int match(struct cds_lfht_node *ht_node, const void *_key)
        return *key == node->value;
 }
 
        return *key == node->value;
 }
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 42, 36, 24, }; /* 42 is duplicated */
        int lookup_values[] = { 42, 200, 36, };
 {
        int values[] = { -5, 42, 42, 36, 24, }; /* 42 is duplicated */
        int lookup_values[] = { 42, 200, 36, };
index 5e8b288231389a0473d815f904d7ff1033745dc9..23812ce246d6c0fb4c8c77bc384d46dfcf44bfd9 100644 (file)
@@ -1,21 +1,16 @@
+// SPDX-FileCopyrightText: 2009-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 #ifndef _JHASH_H
 #define _JHASH_H
 
 #ifndef _JHASH_H
 #define _JHASH_H
 
+#if defined(__FreeBSD__)
+#include <sys/endian.h>
+#endif
+
 /*
 /*
- * jhash.h
- *
  * Example hash function.
  * Example hash function.
- *
- * Copyright 2009-2012 - Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
  */
 
 /*
  */
 
 /*
@@ -112,7 +107,7 @@ uint32_t hashlittle(const void *key, size_t length, uint32_t initval)
                 * rest of the string.  Every machine with memory protection I've seen
                 * does it on word boundaries, so is OK with this.      But VALGRIND will
                 * still catch it and complain. The masking trick does make the hash
                 * rest of the string.  Every machine with memory protection I've seen
                 * does it on word boundaries, so is OK with this.      But VALGRIND will
                 * still catch it and complain. The masking trick does make the hash
-                * noticably faster for short strings (like English words).
+                * noticeably faster for short strings (like English words).
                 */
 #ifndef VALGRIND
 
                 */
 #ifndef VALGRIND
 
index b964d2322d52e8541e00b86d0cbf620593f316c0..445a3ad9783290a6cc83d51cd741bc0ae143ce1d 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 all:
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 all:
index c08387356908f9ced7a86ce6f4d9ed34fc187fde..e893b5b8818e0dab90a314002729a0614b69d4aa 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfq_dequeue
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfq_dequeue
index b8f1ff5663de18c9f65dcf7a45995e7ec8606e01..c84c5c4b6c9dfe53158ac447e60e8e619ef6227b 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfq_enqueue
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_lfq_enqueue
index fc8053cee05bab19cde28c1b4f98ada105948fad..67d766a6c6a16f2b1ec0e4816e834057c4b006f7 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to dequeue nodes from a RCU lock-free queue.
  * This queue requires using a RCU scheme.
  */
  * This example shows how to dequeue nodes from a RCU lock-free queue.
  * This queue requires using a RCU scheme.
  */
@@ -39,7 +32,7 @@ void free_node(struct rcu_head *head)
        free(node);
 }
 
        free(node);
 }
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_lfq_queue_rcu myqueue;       /* Queue */
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_lfq_queue_rcu myqueue;       /* Queue */
index 1e78f1694295280fb5c7891e9c52f92e8bd40669..b0ea03053772362bdc849de2994cf07bb780f0d2 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to enqueue nodes into a RCU lock-free queue.
  * This queue requires using a RCU scheme.
  */
  * This example shows how to enqueue nodes into a RCU lock-free queue.
  * This queue requires using a RCU scheme.
  */
@@ -29,7 +22,7 @@ struct mynode {
        struct cds_lfq_node_rcu node;   /* Chaining in queue */
 };
 
        struct cds_lfq_node_rcu node;   /* Chaining in queue */
 };
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_lfq_queue_rcu myqueue;       /* Queue */
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_lfq_queue_rcu myqueue;       /* Queue */
index fedadb2ad638035e61c489efa75c00687b8ba92f..6738eafb11cf761557fd1a1338f407029d574884 100644 (file)
@@ -1,21 +1,13 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 all:
        $(AM_V_at)$(MAKE) -f Makefile.qsbr
        $(AM_V_at)$(MAKE) -f Makefile.mb
        $(AM_V_at)$(MAKE) -f Makefile.membarrier
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 all:
        $(AM_V_at)$(MAKE) -f Makefile.qsbr
        $(AM_V_at)$(MAKE) -f Makefile.mb
        $(AM_V_at)$(MAKE) -f Makefile.membarrier
-       $(AM_V_at)$(MAKE) -f Makefile.signal
        $(AM_V_at)$(MAKE) -f Makefile.bp
 
 .PHONY: clean
        $(AM_V_at)$(MAKE) -f Makefile.bp
 
 .PHONY: clean
@@ -23,5 +15,4 @@ clean:
        $(AM_V_at)$(MAKE) -f Makefile.qsbr clean
        $(AM_V_at)$(MAKE) -f Makefile.mb clean
        $(AM_V_at)$(MAKE) -f Makefile.membarrier clean
        $(AM_V_at)$(MAKE) -f Makefile.qsbr clean
        $(AM_V_at)$(MAKE) -f Makefile.mb clean
        $(AM_V_at)$(MAKE) -f Makefile.membarrier clean
-       $(AM_V_at)$(MAKE) -f Makefile.signal clean
        $(AM_V_at)$(MAKE) -f Makefile.bp clean
        $(AM_V_at)$(MAKE) -f Makefile.bp clean
index 5170f02253caba40e31337c222bdd69adc41439d..b42fe4dd67932f29c68f8ea654339ea31048087c 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = bp
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = bp
index 7a4e2f9b40b3fbb5fade79acb655cff27e11d056..b5d9ffbd7df5b2f148adf6fad043428348cd15cd 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = mb
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = mb
index 977078e39a929680584704f9ac059874c978357e..64dfceb4ab6d688c5aa268b0cbd628eb7f256a9b 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = membarrier
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = membarrier
index dc28ddd72c975a04f6438bdd72539cedbc0fd3f0..b50ce82f2ff98c0865a574cacd771dfd70cc7a1e 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = qsbr
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = qsbr
diff --git a/doc/examples/urcu-flavors/Makefile.signal b/doc/examples/urcu-flavors/Makefile.signal
deleted file mode 100644 (file)
index 6e2c0db..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
-#
-# This makefile is purposefully kept simple to support GNU and BSD make.
-
-EXAMPLE_NAME = signal
-
-SOURCES = $(EXAMPLE_NAME).c
-OBJECTS = $(EXAMPLE_NAME).o
-BINARY = $(EXAMPLE_NAME)
-LIBS = -lurcu-signal
-
-include ../Makefile.examples.template
index 1875a860b781a9f91ff80beb25d302f6a6dd44fb..d42373386633f0a6c724d31a69c902a6ee1e058e 100644 (file)
@@ -1,20 +1,6 @@
-/*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
 
 #include <unistd.h>
 #include <stdlib.h>
 
 #include <unistd.h>
 #include <stdlib.h>
@@ -46,7 +32,7 @@ int add_node(uint64_t v)
 {
        struct mynode *node;
 
 {
        struct mynode *node;
 
-       node = calloc(sizeof(*node), 1);
+       node = calloc(1, sizeof(*node));
        if (!node)
                return -1;
        node->value = v;
        if (!node)
                return -1;
        node->value = v;
@@ -54,7 +40,7 @@ int add_node(uint64_t v)
        return 0;
 }
 
        return 0;
 }
 
-int main(int argc, char **argv)
+int main(void)
 {
        uint64_t values[] = { 42, 36, 24, };
        unsigned int i;
 {
        uint64_t values[] = { 42, 36, 24, };
        unsigned int i;
index e103e4f91f55f1d69078733136366d05145194a7..7069c248fef60a538d6f3623ccc87771e8d34d1a 100644 (file)
@@ -1,20 +1,6 @@
-/*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
 
 #include <unistd.h>
 #include <stdlib.h>
 
 #include <unistd.h>
 #include <stdlib.h>
@@ -47,7 +33,7 @@ int add_node(uint64_t v)
 {
        struct mynode *node;
 
 {
        struct mynode *node;
 
-       node = calloc(sizeof(*node), 1);
+       node = calloc(1, sizeof(*node));
        if (!node)
                return -1;
        node->value = v;
        if (!node)
                return -1;
        node->value = v;
@@ -63,7 +49,7 @@ void rcu_free_node(struct rcu_head *rh)
        free(node);
 }
 
        free(node);
 }
 
-int main(int argc, char **argv)
+int main(void)
 {
        uint64_t values[] = { 42, 36, 24, };
        unsigned int i;
 {
        uint64_t values[] = { 42, 36, 24, };
        unsigned int i;
index f9523d5d16dbea16021f86a4b92e170abc71ad52..73b9bd8edd124922430dd677e5f508c04f4669db 100644 (file)
@@ -1,20 +1,6 @@
-/*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
 
 #include <unistd.h>
 #include <stdlib.h>
 
 #include <unistd.h>
 #include <stdlib.h>
@@ -47,7 +33,7 @@ int add_node(uint64_t v)
 {
        struct mynode *node;
 
 {
        struct mynode *node;
 
-       node = calloc(sizeof(*node), 1);
+       node = calloc(1, sizeof(*node));
        if (!node)
                return -1;
        node->value = v;
        if (!node)
                return -1;
        node->value = v;
@@ -63,7 +49,7 @@ void rcu_free_node(struct rcu_head *rh)
        free(node);
 }
 
        free(node);
 }
 
-int main(int argc, char **argv)
+int main(void)
 {
        uint64_t values[] = { 42, 36, 24, };
        unsigned int i;
 {
        uint64_t values[] = { 42, 36, 24, };
        unsigned int i;
index 7af8ada31fc59543a2573d2cbdfce9bbe83b5004..ca00933a1a88ba4640640c4b6cd2bd5cb3e36c7e 100644 (file)
@@ -1,20 +1,6 @@
-/*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
 
 #include <unistd.h>
 #include <stdlib.h>
 
 #include <unistd.h>
 #include <stdlib.h>
@@ -46,7 +32,7 @@ int add_node(uint64_t v)
 {
        struct mynode *node;
 
 {
        struct mynode *node;
 
-       node = calloc(sizeof(*node), 1);
+       node = calloc(1, sizeof(*node));
        if (!node)
                return -1;
        node->value = v;
        if (!node)
                return -1;
        node->value = v;
@@ -62,7 +48,7 @@ void rcu_free_node(struct rcu_head *rh)
        free(node);
 }
 
        free(node);
 }
 
-int main(int argc, char **argv)
+int main(void)
 {
        uint64_t values[] = { 42, 36, 24, };
        unsigned int i;
 {
        uint64_t values[] = { 42, 36, 24, };
        unsigned int i;
diff --git a/doc/examples/urcu-flavors/signal.c b/doc/examples/urcu-flavors/signal.c
deleted file mode 100644 (file)
index e396b9e..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <inttypes.h>
-
-#include <urcu/urcu-signal.h>  /* Signal-based RCU flavor */
-#include <urcu/rculist.h>      /* List example */
-#include <urcu/compiler.h>     /* For CAA_ARRAY_SIZE */
-
-/*
- * Example showing how to use the signal-based Userspace RCU flavor.
- *
- * This is a mock-up example where updates and RCU traversals are
- * performed by the same thread to keep things simple on purpose.
- */
-
-static CDS_LIST_HEAD(mylist);
-
-struct mynode {
-       uint64_t value;
-       struct cds_list_head node;      /* linked-list chaining */
-       struct rcu_head rcu_head;       /* for call_rcu() */
-};
-
-static
-int add_node(uint64_t v)
-{
-       struct mynode *node;
-
-       node = calloc(sizeof(*node), 1);
-       if (!node)
-               return -1;
-       node->value = v;
-       cds_list_add_rcu(&node->node, &mylist);
-       return 0;
-}
-
-static
-void rcu_free_node(struct rcu_head *rh)
-{
-       struct mynode *node = caa_container_of(rh, struct mynode, rcu_head);
-
-       free(node);
-}
-
-int main(int argc, char **argv)
-{
-       uint64_t values[] = { 42, 36, 24, };
-       unsigned int i;
-       int ret;
-       struct mynode *node, *n;
-
-       /*
-        * Each thread need using RCU read-side need to be explicitly
-        * registered.
-        */
-       urcu_signal_register_thread();
-
-       /*
-        * Adding nodes to the linked-list. Safe against concurrent
-        * RCU traversals, require mutual exclusion with list updates.
-        */
-       for (i = 0; i < CAA_ARRAY_SIZE(values); i++) {
-               ret = add_node(values[i]);
-               if (ret)
-                       goto end;
-       }
-
-       /*
-        * We need to explicitly mark RCU read-side critical sections
-        * with rcu_read_lock() and rcu_read_unlock(). They can be
-        * nested. Those are no-ops for the QSBR flavor.
-        */
-       urcu_signal_read_lock();
-
-       /*
-        * RCU traversal of the linked list.
-        */
-       cds_list_for_each_entry_rcu(node, &mylist, node) {
-               printf("Value: %" PRIu64 "\n", node->value);
-       }
-       urcu_signal_read_unlock();
-
-       /*
-        * Removing nodes from linked list. Safe against concurrent RCU
-        * traversals, require mutual exclusion with list updates.
-        */
-       cds_list_for_each_entry_safe(node, n, &mylist, node) {
-               cds_list_del_rcu(&node->node);
-               /*
-                * call_rcu() will ensure that the handler
-                * "rcu_free_node" is executed after a grace period.
-                * call_rcu() can be called from RCU read-side critical
-                * sections.
-                */
-               urcu_signal_call_rcu(&node->rcu_head, rcu_free_node);
-       }
-
-       /*
-        * We can also wait for a quiescent state by calling
-        * synchronize_rcu() rather than using call_rcu(). It is usually
-        * a slower approach than call_rcu(), because the latter can
-        * batch work. Moreover, call_rcu() can be called from a RCU
-        * read-side critical section, but synchronize_rcu() should not.
-        */
-       urcu_signal_synchronize_rcu();
-
-       sleep(1);
-
-       /*
-        * Waiting for previously called call_rcu handlers to complete
-        * before program exits, or in library destructors, is a good
-        * practice.
-        */
-       urcu_signal_barrier();
-
-end:
-       urcu_signal_unregister_thread();
-       return ret;
-}
index 4f0338ecf34bba453ea9bf81aa619f978ba47874..317985d830572bc2affbb3534d59cbd9b5773544 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 all:
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 all:
index 4f80a718affcdcb858fd2a247f89319dac829fb8..bbb303ded2f34eaa507a0d9751ef9c200b30fcfd 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_wfcq_dequeue
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_wfcq_dequeue
index aef5105e32b7632672a25f541822040fc66b65bb..1145756837a9c84ab439eef0aa99b742cf569c16 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_wfcq_enqueue
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_wfcq_enqueue
index 76b9f0a0689faa345940a027c9125c2c1f8a55ac..17da52abe94a7617624e5f6c46577a9f3ca344d9 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_wfcq_splice
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_wfcq_splice
index 742a6869e9fd2c8b0c054d91e130e59f733a5a3e..01a34a5f434738d86bb116a7ca08fadf9e1e6ef2 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to dequeue nodes from a wfcqueue.
  */
 
  * This example shows how to dequeue nodes from a wfcqueue.
  */
 
@@ -27,7 +20,7 @@ struct mynode {
        struct cds_wfcq_node node;      /* Chaining in queue */
 };
 
        struct cds_wfcq_node node;      /* Chaining in queue */
 };
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_wfcq_head myqueue_head;      /* Queue head */
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_wfcq_head myqueue_head;      /* Queue head */
index cfc9963e6040659f0bfa3de984b4a0d0266ee003..374ca72c9791d268b58cfeef1561b2a9040f9550 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to enqueue nodes into a wfcqueue.
  */
 
  * This example shows how to enqueue nodes into a wfcqueue.
  */
 
@@ -27,7 +20,7 @@ struct mynode {
        struct cds_wfcq_node node;      /* Chaining in queue */
 };
 
        struct cds_wfcq_node node;      /* Chaining in queue */
 };
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_wfcq_head myqueue_head;      /* Queue head */
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_wfcq_head myqueue_head;      /* Queue head */
index f11edcbc9f34d44840664d79f2aded42ad3005e2..5e369e83291e234a9af34a33c21f46c418e85243 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to splice nodes from a source wfcqueue A into
  * a destination wfcqueue B.
  */
  * This example shows how to splice nodes from a source wfcqueue A into
  * a destination wfcqueue B.
  */
@@ -69,7 +62,7 @@ void print_queue(struct cds_wfcq_head *head,
        printf("\n");
 }
 
        printf("\n");
 }
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values_A[] = { -5, 42, 36, 24, };
        int values_B[] = { 200, 300, 400, };
 {
        int values_A[] = { -5, 42, 36, 24, };
        int values_B[] = { 200, 300, 400, };
index 098fb94f206aeb27ec683187975cb60ada6f913a..a0be0dabc6a6e6e88ba3ca6b4bbf9d82d0452692 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 all:
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 all:
index 24df9510f04e0c4f78cebd4a8c111581cee53aef..69e91ff11aa56ed9b12abd1ddaf0426c52507730 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_wfs_pop
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_wfs_pop
index 452fd9c8d02970ec594d102e46d62b48c508b2c1..164c89bb629f0830972331b96702da218eddb4f9 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_wfs_pop_all_blocking
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_wfs_pop_all_blocking
index 43f96c13d2f4a440d1441ab2ff49b92fd60355ea..e29a35f37e7bc6c8e5e697bda85ee45276495a32 100644 (file)
@@ -1,14 +1,7 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
+# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 #
 #
+# SPDX-License-Identifier: MIT
+
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_wfs_push
 # This makefile is purposefully kept simple to support GNU and BSD make.
 
 EXAMPLE_NAME = cds_wfs_push
index 09edd3dc8a268a337b52b4482955323574fd6373..93809ef4b7aa4e9217df5327254f9b97d40c884e 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to pop nodes from a wfstack.
  */
 
  * This example shows how to pop nodes from a wfstack.
  */
 
@@ -27,7 +20,7 @@ struct mynode {
        struct cds_wfs_node node;       /* Chaining in stack */
 };
 
        struct cds_wfs_node node;       /* Chaining in stack */
 };
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_wfs_stack mystack;   /* Stack */
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_wfs_stack mystack;   /* Stack */
index c5681ce55c0ccfcd4e4aa988a2b4fc53c0246e5d..a9cc4ca01cabe83c352b5ab00dc42d2cda35715a 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to pop all nodes from a wfstack.
  */
 
  * This example shows how to pop all nodes from a wfstack.
  */
 
@@ -27,7 +20,7 @@ struct mynode {
        struct cds_wfs_node node;       /* Chaining in stack */
 };
 
        struct cds_wfs_node node;       /* Chaining in stack */
 };
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_wfs_stack mystack;   /* Stack */
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_wfs_stack mystack;   /* Stack */
index 2daaef51be4462beb2812a1ee27a42c1efc6061c..69eb6ca09844eb3b428359393f478177580020a6 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program for any
- * purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is
- * granted, provided the above notices are retained, and a notice that
- * the code was modified is included with the above copyright notice.
- *
  * This example shows how to push nodes into a wfstack.
  */
 
  * This example shows how to push nodes into a wfstack.
  */
 
@@ -27,7 +20,7 @@ struct mynode {
        struct cds_wfs_node node;       /* Chaining in stack */
 };
 
        struct cds_wfs_node node;       /* Chaining in stack */
 };
 
-int main(int argc, char **argv)
+int main(void)
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_wfs_stack mystack;   /* Stack */
 {
        int values[] = { -5, 42, 36, 24, };
        struct cds_wfs_stack mystack;   /* Stack */
index e8ec0228731361b17d558f1236c6e61dea63ad05..b305fcfa5bf4cf176a2e1cde1a55b5d75b7b941b 100644 (file)
@@ -1,3 +1,9 @@
+<!--
+SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+
+SPDX-License-Identifier: CC-BY-4.0
+-->
+
 Userspace RCU API
 =================
 
 Userspace RCU API
 =================
 
@@ -60,6 +66,31 @@ started: this is not a reader-writer lock. The duration
 actually waited is called an RCU grace period.
 
 
 actually waited is called an RCU grace period.
 
 
+```c
+struct urcu_gp_poll_state start_poll_synchronize_rcu(void);
+```
+
+Provides a handle for checking if a new grace period has started
+and completed since the handle was obtained. It returns a
+`struct urcu_gp_poll_state` handle that can be used with
+`poll_state_synchronize_rcu` to check, by polling, if the
+associated grace period has completed.
+
+`start_poll_synchronize_rcu` must only be called from
+registered RCU read-side threads. For the QSBR flavor, the
+caller must be online.
+
+
+```c
+bool poll_state_synchronize_rcu(struct urcu_gp_poll_state state);
+```
+
+Checks if the grace period associated with the
+`struct urcu_gp_poll_state` handle has completed. If the grace
+period has completed, the function returns true. Otherwise,
+it returns false.
+
+
 ```c
 void call_rcu(struct rcu_head *head,
               void (*func)(struct rcu_head *head));
 ```c
 void call_rcu(struct rcu_head *head,
               void (*func)(struct rcu_head *head));
index a5bbdefa39c70f0abffe47b91d6d7a34ae950ed9..1a0c68c42cad5e95f73bd21001b63909577c6a6a 100644 (file)
@@ -1,3 +1,9 @@
+<!--
+SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+
+SPDX-License-Identifier: CC-BY-4.0
+-->
+
 # Solaris support
 ## Solaris 10
 ### Dependencies
 # Solaris support
 ## Solaris 10
 ### Dependencies
@@ -20,7 +26,7 @@ And the following OpenCSW packages are required :
 * gsed
 * gmake
 * pkgconfig
 * gsed
 * gmake
 * pkgconfig
-* libglib2_dev
+* libglib2\_dev
 * gcc4core
 
 ### Build
 * gcc4core
 
 ### Build
index 9dd0c1c18ee5d1bd2e5c80f95b9b66edc3cf800e..642170857a1e2a4d260267c10b5dcf6892ebb5b7 100644 (file)
@@ -1,3 +1,9 @@
+<!--
+SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+
+SPDX-License-Identifier: CC-BY-4.0
+-->
+
 Userspace RCU Atomic Operations API
 ===================================
 
 Userspace RCU Atomic Operations API
 ===================================
 
@@ -27,7 +33,7 @@ API
 ---
 
 ```c
 ---
 
 ```c
-void uatomic_set(type *addr, type v)
+void uatomic_set(type *addr, type v);
 ```
 
 Atomically write `v` into `addr`. By "atomically", we mean that no
 ```
 
 Atomically write `v` into `addr`. By "atomically", we mean that no
@@ -36,7 +42,7 @@ effects of `uatomic_set()`.
 
 
 ```c
 
 
 ```c
-type uatomic_read(type *addr)
+type uatomic_read(type *addr);
 ```
 
 Atomically read `v` from `addr`. By "atomically", we mean that
 ```
 
 Atomically read `v` from `addr`. By "atomically", we mean that
@@ -45,18 +51,19 @@ uatomic update.
 
 
 ```c
 
 
 ```c
-type uatomic_cmpxchg(type *addr, type old, type new)
+type uatomic_cmpxchg(type *addr, type old, type new);
 ```
 
 An atomic read-modify-write operation that performs this
 sequence of operations atomically: check if `addr` contains `old`.
 If true, then replace the content of `addr` by `new`. Return the
 value previously contained by `addr`. This function implies a full
 ```
 
 An atomic read-modify-write operation that performs this
 sequence of operations atomically: check if `addr` contains `old`.
 If true, then replace the content of `addr` by `new`. Return the
 value previously contained by `addr`. This function implies a full
-memory barrier before and after the atomic operation.
+memory barrier before and after the atomic operation on success.
+On failure, no memory order is guaranteed.
 
 
 ```c
 
 
 ```c
-type uatomic_xchg(type *addr, type new)
+type uatomic_xchg(type *addr, type new);
 ```
 
 An atomic read-modify-write operation that performs this sequence
 ```
 
 An atomic read-modify-write operation that performs this sequence
@@ -67,8 +74,8 @@ operation.
 
 
 ```c
 
 
 ```c
-type uatomic_add_return(type *addr, type v)
-type uatomic_sub_return(type *addr, type v)
+type uatomic_add_return(type *addr, type v);
+type uatomic_sub_return(type *addr, type v);
 ```
 
 An atomic read-modify-write operation that performs this
 ```
 
 An atomic read-modify-write operation that performs this
@@ -79,8 +86,8 @@ operation.
 
 
 ```c
 
 
 ```c
-void uatomic_and(type *addr, type mask)
-void uatomic_or(type *addr, type mask)
+void uatomic_and(type *addr, type mask);
+void uatomic_or(type *addr, type mask);
 ```
 
 Atomically write the result of bitwise "and"/"or" between the
 ```
 
 Atomically write the result of bitwise "and"/"or" between the
@@ -95,8 +102,8 @@ atomic instructions implicitly supply the needed memory barriers.
 
 
 ```c
 
 
 ```c
-void uatomic_add(type *addr, type v)
-void uatomic_sub(type *addr, type v)
+void uatomic_add(type *addr, type v);
+void uatomic_sub(type *addr, type v);
 ```
 
 Atomically increment/decrement the content of `addr` by `v`.
 ```
 
 Atomically increment/decrement the content of `addr` by `v`.
@@ -110,8 +117,8 @@ instructions implicitly supply the needed memory barriers.
 
 
 ```c
 
 
 ```c
-void uatomic_inc(type *addr)
-void uatomic_dec(type *addr)
+void uatomic_inc(type *addr);
+void uatomic_dec(type *addr);
 ```
 
 Atomically increment/decrement the content of `addr` by 1.
 ```
 
 Atomically increment/decrement the content of `addr` by 1.
diff --git a/extras/Makefile.am b/extras/Makefile.am
new file mode 100644 (file)
index 0000000..514c889
--- /dev/null
@@ -0,0 +1,6 @@
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
+
+# Directories added to EXTRA_DIST will be recursively copied to the distribution.
+EXTRA_DIST = $(srcdir)/abi
diff --git a/extras/abi/0.10/x86_64-pc-linux-gnu/liburcu-bp.so.6.xml b/extras/abi/0.10/x86_64-pc-linux-gnu/liburcu-bp.so.6.xml
new file mode 100644 (file)
index 0000000..044f276
--- /dev/null
@@ -0,0 +1,900 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-bp.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_child_bp -->
+    <elf-symbol name='call_rcu_after_fork_child_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_bp -->
+    <elf-symbol name='call_rcu_after_fork_parent_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_bp -->
+    <elf-symbol name='call_rcu_before_fork_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_bp -->
+    <elf-symbol name='call_rcu_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_data_free_bp -->
+    <elf-symbol name='call_rcu_data_free_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_bp -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_call_rcu_data_bp -->
+    <elf-symbol name='create_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- defer_rcu_bp -->
+    <elf-symbol name='defer_rcu_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data_bp -->
+    <elf-symbol name='free_all_cpu_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_data_bp -->
+    <elf-symbol name='get_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_thread_bp -->
+    <elf-symbol name='get_call_rcu_thread_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_bp -->
+    <elf-symbol name='get_cpu_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_bp -->
+    <elf-symbol name='get_default_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_bp -->
+    <elf-symbol name='get_thread_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_barrier_bp -->
+    <elf-symbol name='rcu_barrier_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_bp_after_fork_child -->
+    <elf-symbol name='rcu_bp_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_bp_after_fork_parent -->
+    <elf-symbol name='rcu_bp_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_bp_before_fork -->
+    <elf-symbol name='rcu_bp_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_bp_register -->
+    <elf-symbol name='rcu_bp_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym_bp -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_bp -->
+    <elf-symbol name='rcu_defer_barrier_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_bp -->
+    <elf-symbol name='rcu_defer_barrier_thread_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_exit_bp -->
+    <elf-symbol name='rcu_defer_exit_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_bp -->
+    <elf-symbol name='rcu_defer_register_thread_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_bp -->
+    <elf-symbol name='rcu_defer_unregister_thread_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym_bp -->
+    <elf-symbol name='rcu_dereference_sym_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_lock_bp -->
+    <elf-symbol name='rcu_read_lock_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_ongoing_bp -->
+    <elf-symbol name='rcu_read_ongoing_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_unlock_bp -->
+    <elf-symbol name='rcu_read_unlock_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym_bp -->
+    <elf-symbol name='rcu_set_pointer_sym_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym_bp -->
+    <elf-symbol name='rcu_xchg_pointer_sym_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_bp -->
+    <elf-symbol name='set_cpu_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_bp -->
+    <elf-symbol name='set_thread_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- synchronize_rcu_bp -->
+    <elf-symbol name='synchronize_rcu_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_register_rculfhash_atfork_bp -->
+    <elf-symbol name='urcu_register_rculfhash_atfork_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_unregister_rculfhash_atfork_bp -->
+    <elf-symbol name='urcu_unregister_rculfhash_atfork_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_bp -->
+    <elf-symbol name='rcu_flavor_bp' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_gp_bp -->
+    <elf-symbol name='rcu_gp_bp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_reader_bp -->
+    <elf-symbol name='rcu_reader_bp' size='8' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_has_sys_membarrier -->
+    <elf-symbol name='urcu_bp_has_sys_membarrier' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu-bp.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <!-- int urcu_bp_has_sys_membarrier -->
+    <var-decl name='urcu_bp_has_sys_membarrier' type-id='type-id-1' mangled-name='urcu_bp_has_sys_membarrier' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='109' column='1' elf-symbol-id='urcu_bp_has_sys_membarrier'/>
+    <!-- struct rcu_gp_bp -->
+    <class-decl name='rcu_gp_bp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='77' column='1' id='type-id-2'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_gp_bp::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- rcu_gp_bp rcu_gp_bp -->
+    <var-decl name='rcu_gp_bp' type-id='type-id-2' mangled-name='rcu_gp_bp' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='88' column='1' elf-symbol-id='rcu_gp_bp'/>
+    <!-- struct rcu_reader_bp -->
+    <class-decl name='rcu_reader_bp' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='90' column='1' id='type-id-4'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_reader_bp::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='92' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head rcu_reader_bp::node -->
+        <var-decl name='node' type-id='type-id-5' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t rcu_reader_bp::tid -->
+        <var-decl name='tid' type-id='type-id-6' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='95' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1216'>
+        <!-- int rcu_reader_bp::alloc -->
+        <var-decl name='alloc' type-id='type-id-1' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='96' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='35' column='1' id='type-id-5'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-7' visibility='default' filepath='../include/urcu/list.h' line='36' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-7' visibility='default' filepath='../include/urcu/list.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-7'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-6'/>
+    <!-- rcu_reader_bp* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-8'/>
+    <!-- rcu_reader_bp* rcu_reader_bp -->
+    <var-decl name='rcu_reader_bp' type-id='type-id-8' mangled-name='rcu_reader_bp' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='104' column='1' elf-symbol-id='rcu_reader_bp'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../src/urcu-flavor.h' line='40' column='1' id='type-id-9'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-10' visibility='default' filepath='../src/urcu-flavor.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-10' visibility='default' filepath='../src/urcu-flavor.h' line='42' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-11' visibility='default' filepath='../src/urcu-flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-10' visibility='default' filepath='../src/urcu-flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-12' visibility='default' filepath='../src/urcu-flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-10' visibility='default' filepath='../src/urcu-flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='48' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-10' visibility='default' filepath='../src/urcu-flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-10' visibility='default' filepath='../src/urcu-flavor.h' line='51' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-10' visibility='default' filepath='../src/urcu-flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-10' visibility='default' filepath='../src/urcu-flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-10' visibility='default' filepath='../src/urcu-flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-14' visibility='default' filepath='../src/urcu-flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-14' visibility='default' filepath='../src/urcu-flavor.h' line='58' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-15'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-16' size-in-bits='64' id='type-id-10'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-11'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../src/urcu-call-rcu.h' line='59' column='1' id='type-id-18'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-19' visibility='default' filepath='../src/urcu-call-rcu.h' line='60' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-20' visibility='default' filepath='../src/urcu-call-rcu.h' line='61' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-19'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-21'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-22'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-23' size-in-bits='64' id='type-id-20'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-24' size-in-bits='64' id='type-id-12'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-15' size-in-bits='64' id='type-id-25'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-27'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-13'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../src/urcu-flavor.h' line='30' column='1' id='type-id-29'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-27' visibility='default' filepath='../src/urcu-flavor.h' line='31' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-27' visibility='default' filepath='../src/urcu-flavor.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-27' visibility='default' filepath='../src/urcu-flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-25' visibility='default' filepath='../src/urcu-flavor.h' line='34' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-14'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-9' const='yes' id='type-id-32'/>
+    <!-- const rcu_flavor_struct rcu_flavor_bp -->
+    <var-decl name='rcu_flavor_bp' type-id='type-id-32' mangled-name='rcu_flavor_bp' visibility='default' filepath='../src/urcu-flavor.h' line='79' column='1' elf-symbol-id='rcu_flavor_bp'/>
+    <!-- void rcu_defer_exit_bp() -->
+    <function-decl name='rcu_defer_exit_bp' mangled-name='rcu_defer_exit_bp' filepath='src/urcu-defer-impl.h' line='466' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_exit_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void rcu_defer_unregister_thread_bp() -->
+    <function-decl name='rcu_defer_unregister_thread_bp' mangled-name='rcu_defer_unregister_thread_bp' filepath='src/urcu-defer-impl.h' line='448' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_unregister_thread_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int rcu_defer_register_thread_bp() -->
+    <function-decl name='rcu_defer_register_thread_bp' mangled-name='rcu_defer_register_thread_bp' filepath='src/urcu-defer-impl.h' line='426' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_register_thread_bp'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void defer_rcu_bp(void (void*)*, void*) -->
+    <function-decl name='defer_rcu_bp' mangled-name='defer_rcu_bp' filepath='src/urcu-defer-impl.h' line='395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_bp'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-27' name='fct' filepath='src/urcu-defer-impl.h' line='395' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='p' filepath='src/urcu-defer-impl.h' line='395' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_bp() -->
+    <function-decl name='rcu_defer_barrier_bp' mangled-name='rcu_defer_barrier_bp' filepath='src/urcu-defer-impl.h' line='281' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_thread_bp() -->
+    <function-decl name='rcu_defer_barrier_thread_bp' mangled-name='rcu_defer_barrier_thread_bp' filepath='src/urcu-defer-impl.h' line='261' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_unregister_rculfhash_atfork_bp(urcu_atfork*) -->
+    <function-decl name='urcu_unregister_rculfhash_atfork_bp' mangled-name='urcu_unregister_rculfhash_atfork_bp' filepath='src/urcu-call-rcu-impl.h' line='1011' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_unregister_rculfhash_atfork_bp'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-30' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1011' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_register_rculfhash_atfork_bp(urcu_atfork*) -->
+    <function-decl name='urcu_register_rculfhash_atfork_bp' mangled-name='urcu_register_rculfhash_atfork_bp' filepath='src/urcu-call-rcu-impl.h' line='1001' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_register_rculfhash_atfork_bp'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-30' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1011' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_child_bp() -->
+    <function-decl name='call_rcu_after_fork_child_bp' mangled-name='call_rcu_after_fork_child_bp' filepath='src/urcu-call-rcu-impl.h' line='959' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_parent_bp() -->
+    <function-decl name='call_rcu_after_fork_parent_bp' mangled-name='call_rcu_after_fork_parent_bp' filepath='src/urcu-call-rcu-impl.h' line='937' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_parent_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void call_rcu_before_fork_bp() -->
+    <function-decl name='call_rcu_before_fork_bp' mangled-name='call_rcu_before_fork_bp' filepath='src/urcu-call-rcu-impl.h' line='910' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_before_fork_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void rcu_barrier_bp() -->
+    <function-decl name='rcu_barrier_bp' mangled-name='rcu_barrier_bp' filepath='src/urcu-call-rcu-impl.h' line='839' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_barrier_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void free_all_cpu_call_rcu_data_bp() -->
+    <function-decl name='free_all_cpu_call_rcu_data_bp' mangled-name='free_all_cpu_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='776' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_all_cpu_call_rcu_data_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='52' column='1' id='type-id-33'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-34' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='60' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-35' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-36' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-6' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-1' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-5' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-34'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-35'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-19' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-37' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-38'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-39' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-40' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-39'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-42'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-43'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-45'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-46'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-45' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-44'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-47'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='320' id='type-id-40'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-41'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-38' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-37'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-1' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-49'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-49' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-36'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-50'/>
+    <!-- void call_rcu_data_free_bp(call_rcu_data*) -->
+    <function-decl name='call_rcu_data_free_bp' mangled-name='call_rcu_data_free_bp' filepath='src/urcu-call-rcu-impl.h' line='744' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_data_free_bp'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='744' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void call_rcu_bp(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='call_rcu_bp' mangled-name='call_rcu_bp' filepath='src/urcu-call-rcu-impl.h' line='706' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_bp'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-22' name='head' filepath='src/urcu-call-rcu-impl.h' line='706' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-20' name='func' filepath='src/urcu-call-rcu-impl.h' line='707' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int create_all_cpu_call_rcu_data_bp(unsigned long int) -->
+    <function-decl name='create_all_cpu_call_rcu_data_bp' mangled-name='create_all_cpu_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='628' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_bp'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='628' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void set_thread_call_rcu_data_bp(call_rcu_data*) -->
+    <function-decl name='set_thread_call_rcu_data_bp' mangled-name='set_thread_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='615' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_thread_call_rcu_data_bp'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='615' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- call_rcu_data* get_thread_call_rcu_data_bp() -->
+    <function-decl name='get_thread_call_rcu_data_bp' mangled-name='get_thread_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='599' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_thread_call_rcu_data_bp'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- call_rcu_data* get_call_rcu_data_bp() -->
+    <function-decl name='get_call_rcu_data_bp' mangled-name='get_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='579' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_data_bp'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- call_rcu_data* get_default_call_rcu_data_bp() -->
+    <function-decl name='get_default_call_rcu_data_bp' mangled-name='get_default_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='554' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_default_call_rcu_data_bp'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- int set_cpu_call_rcu_data_bp(int, call_rcu_data*) -->
+    <function-decl name='set_cpu_call_rcu_data_bp' mangled-name='set_cpu_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='515' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_cpu_call_rcu_data_bp'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='515' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='515' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- call_rcu_data* create_call_rcu_data_bp(unsigned long int, int) -->
+    <function-decl name='create_call_rcu_data_bp' mangled-name='create_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='491' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_call_rcu_data_bp'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='491' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='492' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- pthread_t get_call_rcu_thread_bp(call_rcu_data*) -->
+    <function-decl name='get_call_rcu_thread_bp' mangled-name='get_call_rcu_thread_bp' filepath='src/urcu-call-rcu-impl.h' line='473' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_thread_bp'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='473' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- call_rcu_data* get_cpu_call_rcu_data_bp(int) -->
+    <function-decl name='get_cpu_call_rcu_data_bp' mangled-name='get_cpu_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='451' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_bp'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='451' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-25' size-in-bits='64' id='type-id-51'/>
+    <!-- void* rcu_cmpxchg_pointer_sym_bp(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym_bp' mangled-name='rcu_cmpxchg_pointer_sym_bp' filepath='src/urcu-bp.c' line='732' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym_bp'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='732' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='old' filepath='src/urcu-bp.c' line='732' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='_new' filepath='src/urcu-bp.c' line='732' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym_bp(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym_bp' mangled-name='rcu_xchg_pointer_sym_bp' filepath='src/urcu-bp.c' line='726' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym_bp'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='726' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='726' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym_bp(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym_bp' mangled-name='rcu_set_pointer_sym_bp' filepath='src/urcu-bp.c' line='719' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym_bp'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='719' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='719' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym_bp(void*) -->
+    <function-decl name='rcu_dereference_sym_bp' mangled-name='rcu_dereference_sym_bp' filepath='src/urcu-bp.c' line='714' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym_bp'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='p' filepath='src/urcu-bp.c' line='714' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void rcu_bp_after_fork_child() -->
+    <function-decl name='rcu_bp_after_fork_child' mangled-name='rcu_bp_after_fork_child' filepath='src/urcu-bp.c' line='701' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_bp_after_fork_child'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void rcu_bp_after_fork_parent() -->
+    <function-decl name='rcu_bp_after_fork_parent' mangled-name='rcu_bp_after_fork_parent' filepath='src/urcu-bp.c' line='666' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_bp_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void rcu_bp_before_fork() -->
+    <function-decl name='rcu_bp_before_fork' mangled-name='rcu_bp_before_fork' filepath='src/urcu-bp.c' line='652' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_bp_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void rcu_bp_register() -->
+    <function-decl name='rcu_bp_register' mangled-name='rcu_bp_register' filepath='src/urcu-bp.c' line='519' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_bp_register'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int rcu_read_ongoing_bp() -->
+    <function-decl name='rcu_read_ongoing_bp' mangled-name='rcu_read_ongoing_bp' filepath='src/urcu-bp.c' line='352' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_ongoing_bp'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void rcu_read_unlock_bp() -->
+    <function-decl name='rcu_read_unlock_bp' mangled-name='rcu_read_unlock_bp' filepath='src/urcu-bp.c' line='347' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_unlock_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void rcu_read_lock_bp() -->
+    <function-decl name='rcu_read_lock_bp' mangled-name='rcu_read_lock_bp' filepath='src/urcu-bp.c' line='342' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_lock_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void synchronize_rcu_bp() -->
+    <function-decl name='synchronize_rcu_bp' mangled-name='synchronize_rcu_bp' filepath='src/urcu-bp.c' line='259' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='synchronize_rcu_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-17'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-16'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-23'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-22'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-24'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-22'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-20'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-28'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-27'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='732' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='old' filepath='src/urcu-bp.c' line='732' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='_new' filepath='src/urcu-bp.c' line='732' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='726' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='726' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='719' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='719' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='p' filepath='src/urcu-bp.c' line='714' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-37' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-52'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-55' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-53'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-56' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-56'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-59' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-58'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-59'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-42' size-in-bits='64' id='type-id-57'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-60'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='384' id='type-id-54'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-61'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-55'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-52' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-62'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-62' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-63'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-64'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-66' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-41' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-65'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-41' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-66'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-64' const='yes' id='type-id-67'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-67' size-in-bits='64' id='type-id-68'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-68' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-68' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.10/x86_64-pc-linux-gnu/liburcu-cds.so.6.xml b/extras/abi/0.10/x86_64-pc-linux-gnu/liburcu-cds.so.6.xml
new file mode 100644 (file)
index 0000000..bcdb9db
--- /dev/null
@@ -0,0 +1,1493 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-cds.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- __cds_lfs_init -->
+    <elf-symbol name='__cds_lfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_lfs_pop -->
+    <elf-symbol name='__cds_lfs_pop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_lfs_pop_all -->
+    <elf-symbol name='__cds_lfs_pop_all' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _cds_lfht_new -->
+    <elf-symbol name='_cds_lfht_new' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_add -->
+    <elf-symbol name='cds_lfht_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_add_replace -->
+    <elf-symbol name='cds_lfht_add_replace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_add_unique -->
+    <elf-symbol name='cds_lfht_add_unique' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_count_nodes -->
+    <elf-symbol name='cds_lfht_count_nodes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_del -->
+    <elf-symbol name='cds_lfht_del' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_destroy -->
+    <elf-symbol name='cds_lfht_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_first -->
+    <elf-symbol name='cds_lfht_first' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_fls_ulong -->
+    <elf-symbol name='cds_lfht_fls_ulong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_get_count_order_u32 -->
+    <elf-symbol name='cds_lfht_get_count_order_u32' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_get_count_order_ulong -->
+    <elf-symbol name='cds_lfht_get_count_order_ulong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_is_node_deleted -->
+    <elf-symbol name='cds_lfht_is_node_deleted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_lookup -->
+    <elf-symbol name='cds_lfht_lookup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_next -->
+    <elf-symbol name='cds_lfht_next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_next_duplicate -->
+    <elf-symbol name='cds_lfht_next_duplicate' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_replace -->
+    <elf-symbol name='cds_lfht_replace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_resize -->
+    <elf-symbol name='cds_lfht_resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_dequeue_rcu -->
+    <elf-symbol name='cds_lfq_dequeue_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_destroy_rcu -->
+    <elf-symbol name='cds_lfq_destroy_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_enqueue_rcu -->
+    <elf-symbol name='cds_lfq_enqueue_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_init_rcu -->
+    <elf-symbol name='cds_lfq_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_node_init_rcu -->
+    <elf-symbol name='cds_lfq_node_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_destroy -->
+    <elf-symbol name='cds_lfs_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_empty -->
+    <elf-symbol name='cds_lfs_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_init -->
+    <elf-symbol name='cds_lfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_init_rcu -->
+    <elf-symbol name='cds_lfs_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_node_init -->
+    <elf-symbol name='cds_lfs_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_node_init_rcu -->
+    <elf-symbol name='cds_lfs_node_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_all_blocking -->
+    <elf-symbol name='cds_lfs_pop_all_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_blocking -->
+    <elf-symbol name='cds_lfs_pop_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_lock -->
+    <elf-symbol name='cds_lfs_pop_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_rcu -->
+    <elf-symbol name='cds_lfs_pop_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_unlock -->
+    <elf-symbol name='cds_lfs_pop_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_push -->
+    <elf-symbol name='cds_lfs_push' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_push_rcu -->
+    <elf-symbol name='cds_lfs_push_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_create -->
+    <elf-symbol name='urcu_workqueue_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_create_completion -->
+    <elf-symbol name='urcu_workqueue_create_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_create_worker -->
+    <elf-symbol name='urcu_workqueue_create_worker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_destroy -->
+    <elf-symbol name='urcu_workqueue_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_destroy_completion -->
+    <elf-symbol name='urcu_workqueue_destroy_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_flush_queued_work -->
+    <elf-symbol name='urcu_workqueue_flush_queued_work' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_pause_worker -->
+    <elf-symbol name='urcu_workqueue_pause_worker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_queue_completion -->
+    <elf-symbol name='urcu_workqueue_queue_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_queue_work -->
+    <elf-symbol name='urcu_workqueue_queue_work' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_resume_worker -->
+    <elf-symbol name='urcu_workqueue_resume_worker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_wait_completion -->
+    <elf-symbol name='urcu_workqueue_wait_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_mm_chunk -->
+    <elf-symbol name='cds_lfht_mm_chunk' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_mm_mmap -->
+    <elf-symbol name='cds_lfht_mm_mmap' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_mm_order -->
+    <elf-symbol name='cds_lfht_mm_order' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='rculfqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfq_node_rcu -->
+    <class-decl name='cds_lfq_node_rcu' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/rculfqueue.h' line='35' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfq_node_rcu* cds_lfq_node_rcu::next -->
+        <var-decl name='next' type-id='type-id-2' visibility='default' filepath='../include/urcu/rculfqueue.h' line='36' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int cds_lfq_node_rcu::dummy -->
+        <var-decl name='dummy' type-id='type-id-3' visibility='default' filepath='../include/urcu/rculfqueue.h' line='37' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfq_node_rcu* -->
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-3'/>
+    <!-- struct cds_lfq_queue_rcu -->
+    <class-decl name='cds_lfq_queue_rcu' size-in-bits='192' is-struct='yes' visibility='default' filepath='../include/urcu/rculfqueue.h' line='40' column='1' id='type-id-4'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfq_node_rcu* cds_lfq_queue_rcu::head -->
+        <var-decl name='head' type-id='type-id-2' visibility='default' filepath='../include/urcu/rculfqueue.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_lfq_node_rcu* cds_lfq_queue_rcu::tail -->
+        <var-decl name='tail' type-id='type-id-2' visibility='default' filepath='../include/urcu/rculfqueue.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* cds_lfq_queue_rcu::queue_call_rcu -->
+        <var-decl name='queue_call_rcu' type-id='type-id-5' visibility='default' filepath='../include/urcu/rculfqueue.h' line='42' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-6'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../src/urcu-call-rcu.h' line='59' column='1' id='type-id-7'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-8' visibility='default' filepath='../src/urcu-call-rcu.h' line='60' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-9' visibility='default' filepath='../src/urcu-call-rcu.h' line='61' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-10' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-10'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-7' size-in-bits='64' id='type-id-11'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-12' size-in-bits='64' id='type-id-9'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-13' size-in-bits='64' id='type-id-5'/>
+    <!-- cds_lfq_queue_rcu* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-14'/>
+    <!-- cds_lfq_node_rcu* cds_lfq_dequeue_rcu(cds_lfq_queue_rcu*) -->
+    <function-decl name='cds_lfq_dequeue_rcu' mangled-name='cds_lfq_dequeue_rcu' filepath='src/rculfqueue.c' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_dequeue_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='56' column='1'/>
+      <!-- cds_lfq_node_rcu* -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void cds_lfq_enqueue_rcu(cds_lfq_queue_rcu*, cds_lfq_node_rcu*) -->
+    <function-decl name='cds_lfq_enqueue_rcu' mangled-name='cds_lfq_enqueue_rcu' filepath='src/rculfqueue.c' line='50' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_enqueue_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='50' column='1'/>
+      <!-- parameter of type 'cds_lfq_node_rcu*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/rculfqueue.c' line='50' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- int cds_lfq_destroy_rcu(cds_lfq_queue_rcu*) -->
+    <function-decl name='cds_lfq_destroy_rcu' mangled-name='cds_lfq_destroy_rcu' filepath='src/rculfqueue.c' line='45' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_destroy_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='45' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- void cds_lfq_init_rcu(cds_lfq_queue_rcu*, void (rcu_head*, void (rcu_head*)*)*) -->
+    <function-decl name='cds_lfq_init_rcu' mangled-name='cds_lfq_init_rcu' filepath='src/rculfqueue.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_init_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='38' column='1'/>
+      <!-- parameter of type 'void (rcu_head*, void (rcu_head*)*)*' -->
+      <parameter type-id='type-id-5' name='queue_call_rcu' filepath='src/rculfqueue.c' line='39' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfq_node_init_rcu(cds_lfq_node_rcu*) -->
+    <function-decl name='cds_lfq_node_init_rcu' mangled-name='cds_lfq_node_init_rcu' filepath='src/rculfqueue.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_node_init_rcu'>
+      <!-- parameter of type 'cds_lfq_node_rcu*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/rculfqueue.c' line='33' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-12'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-11'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-13'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-11'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-9'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfstack.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfs_node_rcu -->
+    <class-decl name='cds_lfs_node_rcu' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/rculfstack.h' line='37' column='1' id='type-id-15'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node_rcu* cds_lfs_node_rcu::next -->
+        <var-decl name='next' type-id='type-id-16' visibility='default' filepath='../include/urcu/rculfstack.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfs_node_rcu* -->
+    <pointer-type-def type-id='type-id-15' size-in-bits='64' id='type-id-16'/>
+    <!-- struct cds_lfs_stack_rcu -->
+    <class-decl name='cds_lfs_stack_rcu' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/rculfstack.h' line='41' column='1' id='type-id-17'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node_rcu* cds_lfs_stack_rcu::head -->
+        <var-decl name='head' type-id='type-id-16' visibility='default' filepath='../include/urcu/rculfstack.h' line='42' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfs_stack_rcu* -->
+    <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-18'/>
+    <!-- cds_lfs_node_rcu* cds_lfs_pop_rcu(cds_lfs_stack_rcu*) -->
+    <function-decl name='cds_lfs_pop_rcu' mangled-name='cds_lfs_pop_rcu' filepath='src/rculfstack.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_rcu'>
+      <!-- parameter of type 'cds_lfs_stack_rcu*' -->
+      <parameter type-id='type-id-18' name='s' filepath='src/rculfstack.c' line='53' column='1'/>
+      <!-- cds_lfs_node_rcu* -->
+      <return type-id='type-id-16'/>
+    </function-decl>
+    <!-- int cds_lfs_push_rcu(cds_lfs_stack_rcu*, cds_lfs_node_rcu*) -->
+    <function-decl name='cds_lfs_push_rcu' mangled-name='cds_lfs_push_rcu' filepath='src/rculfstack.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_push_rcu'>
+      <!-- parameter of type 'cds_lfs_stack_rcu*' -->
+      <parameter type-id='type-id-18' name='s' filepath='src/rculfstack.c' line='47' column='1'/>
+      <!-- parameter of type 'cds_lfs_node_rcu*' -->
+      <parameter type-id='type-id-16' name='node' filepath='src/rculfstack.c' line='48' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- void cds_lfs_init_rcu(cds_lfs_stack_rcu*) -->
+    <function-decl name='cds_lfs_init_rcu' mangled-name='cds_lfs_init_rcu' filepath='src/rculfstack.c' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_init_rcu'>
+      <!-- parameter of type 'cds_lfs_stack_rcu*' -->
+      <parameter type-id='type-id-18' name='s' filepath='src/rculfstack.c' line='42' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_node_init_rcu(cds_lfs_node_rcu*) -->
+    <function-decl name='cds_lfs_node_init_rcu' mangled-name='cds_lfs_node_init_rcu' filepath='src/rculfstack.c' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_node_init_rcu'>
+      <!-- parameter of type 'cds_lfs_node_rcu*' -->
+      <parameter type-id='type-id-16' name='node' filepath='src/rculfstack.c' line='37' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='lfstack.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfs_head -->
+    <class-decl name='cds_lfs_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='69' column='1' id='type-id-19'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node cds_lfs_head::node -->
+        <var-decl name='node' type-id='type-id-20' visibility='default' filepath='../include/urcu/lfstack.h' line='70' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_lfs_node -->
+    <class-decl name='cds_lfs_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='59' column='1' id='type-id-20'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node* cds_lfs_node::next -->
+        <var-decl name='next' type-id='type-id-21' visibility='default' filepath='../include/urcu/lfstack.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfs_node* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-21'/>
+    <!-- cds_lfs_head* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-22'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='87' column='1' id='type-id-23'>
+      <data-member access='private'>
+        <!-- __cds_lfs_stack* __anonymous_union__::_s -->
+        <var-decl name='_s' type-id='type-id-24' visibility='default' filepath='../include/urcu/lfstack.h' line='88' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_lfs_stack* __anonymous_union__::s -->
+        <var-decl name='s' type-id='type-id-25' visibility='default' filepath='../include/urcu/lfstack.h' line='89' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __cds_lfs_stack -->
+    <class-decl name='__cds_lfs_stack' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='73' column='1' id='type-id-26'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_head* __cds_lfs_stack::head -->
+        <var-decl name='head' type-id='type-id-22' visibility='default' filepath='../include/urcu/lfstack.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __cds_lfs_stack* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-24'/>
+    <!-- struct cds_lfs_stack -->
+    <class-decl name='cds_lfs_stack' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='77' column='1' id='type-id-27'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_head* cds_lfs_stack::head -->
+        <var-decl name='head' type-id='type-id-22' visibility='default' filepath='../include/urcu/lfstack.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_lfs_stack::lock -->
+        <var-decl name='lock' type-id='type-id-28' visibility='default' filepath='../include/urcu/lfstack.h' line='79' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-29'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-30' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-31' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-32' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-30'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-3' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-3' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-3' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-34' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-34' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-35' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-33'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-34'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-37' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-37' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-37'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-36' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-35'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-38'/>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-39'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-38' size-in-bits='320' id='type-id-31'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-39' id='type-id-40'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-32'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-29' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-28'/>
+    <!-- cds_lfs_stack* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-25'/>
+    <!-- typedef __anonymous_union__ cds_lfs_stack_ptr_t -->
+    <typedef-decl name='cds_lfs_stack_ptr_t' type-id='type-id-23' filepath='../include/urcu/lfstack.h' line='90' column='1' id='type-id-41'/>
+    <!-- cds_lfs_head* __cds_lfs_pop_all(cds_lfs_stack_ptr_t) -->
+    <function-decl name='__cds_lfs_pop_all' mangled-name='__cds_lfs_pop_all' filepath='src/lfstack.c' line='88' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_lfs_pop_all'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='88' column='1'/>
+      <!-- cds_lfs_head* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_lfs_node* __cds_lfs_pop(cds_lfs_stack_ptr_t) -->
+    <function-decl name='__cds_lfs_pop' mangled-name='__cds_lfs_pop' filepath='src/lfstack.c' line='83' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_lfs_pop'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='83' column='1'/>
+      <!-- cds_lfs_node* -->
+      <return type-id='type-id-21'/>
+    </function-decl>
+    <!-- void cds_lfs_pop_unlock(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_unlock' mangled-name='cds_lfs_pop_unlock' filepath='src/lfstack.c' line='78' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_unlock'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_pop_lock(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_lock' mangled-name='cds_lfs_pop_lock' filepath='src/lfstack.c' line='73' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_lock'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- cds_lfs_head* cds_lfs_pop_all_blocking(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_all_blocking' mangled-name='cds_lfs_pop_all_blocking' filepath='src/lfstack.c' line='68' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_all_blocking'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='68' column='1'/>
+      <!-- cds_lfs_head* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_lfs_node* cds_lfs_pop_blocking(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_blocking' mangled-name='cds_lfs_pop_blocking' filepath='src/lfstack.c' line='63' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_blocking'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='63' column='1'/>
+      <!-- cds_lfs_node* -->
+      <return type-id='type-id-21'/>
+    </function-decl>
+    <!-- bool -->
+    <type-decl name='bool' size-in-bits='8' id='type-id-42'/>
+    <!-- bool cds_lfs_push(cds_lfs_stack_ptr_t, cds_lfs_node*) -->
+    <function-decl name='cds_lfs_push' mangled-name='cds_lfs_push' filepath='src/lfstack.c' line='58' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_push'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='58' column='1'/>
+      <!-- parameter of type 'cds_lfs_node*' -->
+      <parameter type-id='type-id-21' name='node' filepath='src/lfstack.c' line='58' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-42'/>
+    </function-decl>
+    <!-- bool cds_lfs_empty(cds_lfs_stack_ptr_t) -->
+    <function-decl name='cds_lfs_empty' mangled-name='cds_lfs_empty' filepath='src/lfstack.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_empty'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='53' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-42'/>
+    </function-decl>
+    <!-- void __cds_lfs_init(__cds_lfs_stack*) -->
+    <function-decl name='__cds_lfs_init' mangled-name='__cds_lfs_init' filepath='src/lfstack.c' line='48' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_lfs_init'>
+      <!-- parameter of type '__cds_lfs_stack*' -->
+      <parameter type-id='type-id-24' name='s' filepath='src/lfstack.c' line='48' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_destroy(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_destroy' mangled-name='cds_lfs_destroy' filepath='src/lfstack.c' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_destroy'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_init(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_init' mangled-name='cds_lfs_init' filepath='src/lfstack.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_init'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_node_init(cds_lfs_node*) -->
+    <function-decl name='cds_lfs_node_init' mangled-name='cds_lfs_node_init' filepath='src/lfstack.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_node_init'>
+      <!-- parameter of type 'cds_lfs_node*' -->
+      <parameter type-id='type-id-21' name='node' filepath='src/lfstack.c' line='33' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='workqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct urcu_workqueue -->
+    <class-decl name='urcu_workqueue' size-in-bits='2048' is-struct='yes' visibility='default' filepath='src/workqueue.c' line='54' column='1' id='type-id-43'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail urcu_workqueue::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-44' visibility='default' filepath='src/workqueue.c' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head urcu_workqueue::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-45' visibility='default' filepath='src/workqueue.c' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int urcu_workqueue::flags -->
+        <var-decl name='flags' type-id='type-id-39' visibility='default' filepath='src/workqueue.c' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t urcu_workqueue::futex -->
+        <var-decl name='futex' type-id='type-id-46' visibility='default' filepath='src/workqueue.c' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int urcu_workqueue::qlen -->
+        <var-decl name='qlen' type-id='type-id-39' visibility='default' filepath='src/workqueue.c' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t urcu_workqueue::tid -->
+        <var-decl name='tid' type-id='type-id-47' visibility='default' filepath='src/workqueue.c' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int urcu_workqueue::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-3' visibility='default' filepath='src/workqueue.c' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int urcu_workqueue::loop_count -->
+        <var-decl name='loop_count' type-id='type-id-39' visibility='default' filepath='src/workqueue.c' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void* urcu_workqueue::priv -->
+        <var-decl name='priv' type-id='type-id-48' visibility='default' filepath='src/workqueue.c' line='69' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='896'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::grace_period_fct -->
+        <var-decl name='grace_period_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='960'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::initialize_worker_fct -->
+        <var-decl name='initialize_worker_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='71' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::finalize_worker_fct -->
+        <var-decl name='finalize_worker_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1088'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_before_pause_fct -->
+        <var-decl name='worker_before_pause_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_after_resume_fct -->
+        <var-decl name='worker_after_resume_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1216'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_before_wait_fct -->
+        <var-decl name='worker_before_wait_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1280'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_after_wake_up_fct -->
+        <var-decl name='worker_after_wake_up_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='76' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-44'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-10' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-45'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-28' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-50'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-50' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-46'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-39' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-47'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-6' size-in-bits='64' id='type-id-48'/>
+    <!-- urcu_workqueue* -->
+    <pointer-type-def type-id='type-id-43' size-in-bits='64' id='type-id-51'/>
+    <!-- void (urcu_workqueue*, void*)* -->
+    <pointer-type-def type-id='type-id-52' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_workqueue_create_worker(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_create_worker' mangled-name='urcu_workqueue_create_worker' filepath='src/workqueue.c' line='458' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_create_worker'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='458' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_resume_worker(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_resume_worker' mangled-name='urcu_workqueue_resume_worker' filepath='src/workqueue.c' line='451' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_resume_worker'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='451' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_pause_worker(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_pause_worker' mangled-name='urcu_workqueue_pause_worker' filepath='src/workqueue.c' line='440' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_pause_worker'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='451' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_flush_queued_work(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_flush_queued_work' mangled-name='urcu_workqueue_flush_queued_work' filepath='src/workqueue.c' line='427' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_flush_queued_work'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='458' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- struct urcu_workqueue_completion -->
+    <class-decl name='urcu_workqueue_completion' size-in-bits='128' is-struct='yes' visibility='default' filepath='src/workqueue.c' line='79' column='1' id='type-id-53'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int urcu_workqueue_completion::barrier_count -->
+        <var-decl name='barrier_count' type-id='type-id-3' visibility='default' filepath='src/workqueue.c' line='80' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- int32_t urcu_workqueue_completion::futex -->
+        <var-decl name='futex' type-id='type-id-46' visibility='default' filepath='src/workqueue.c' line='81' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- urcu_ref urcu_workqueue_completion::ref -->
+        <var-decl name='ref' type-id='type-id-54' visibility='default' filepath='src/workqueue.c' line='82' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct urcu_ref -->
+    <class-decl name='urcu_ref' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/ref.h' line='23' column='1' id='type-id-54'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- long int urcu_ref::refcount -->
+        <var-decl name='refcount' type-id='type-id-32' visibility='default' filepath='../include/urcu/ref.h' line='24' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_workqueue_completion* -->
+    <pointer-type-def type-id='type-id-53' size-in-bits='64' id='type-id-55'/>
+    <!-- void urcu_workqueue_queue_completion(urcu_workqueue*, urcu_workqueue_completion*) -->
+    <function-decl name='urcu_workqueue_queue_completion' mangled-name='urcu_workqueue_queue_completion' filepath='src/workqueue.c' line='410' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_queue_completion'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='410' column='1'/>
+      <!-- parameter of type 'urcu_workqueue_completion*' -->
+      <parameter type-id='type-id-55' name='completion' filepath='src/workqueue.c' line='411' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_wait_completion(urcu_workqueue_completion*) -->
+    <function-decl name='urcu_workqueue_wait_completion' mangled-name='urcu_workqueue_wait_completion' filepath='src/workqueue.c' line='397' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_wait_completion'>
+      <!-- parameter of type 'urcu_workqueue_completion*' -->
+      <parameter type-id='type-id-55' name='completion' filepath='src/workqueue.c' line='397' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_destroy_completion(urcu_workqueue_completion*) -->
+    <function-decl name='urcu_workqueue_destroy_completion' mangled-name='urcu_workqueue_destroy_completion' filepath='src/workqueue.c' line='392' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_destroy_completion'>
+      <!-- parameter of type 'urcu_workqueue_completion*' -->
+      <parameter type-id='type-id-55' name='completion' filepath='src/workqueue.c' line='392' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- urcu_workqueue_completion* urcu_workqueue_create_completion() -->
+    <function-decl name='urcu_workqueue_create_completion' mangled-name='urcu_workqueue_create_completion' filepath='src/workqueue.c' line='380' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_create_completion'>
+      <!-- urcu_workqueue_completion* -->
+      <return type-id='type-id-55'/>
+    </function-decl>
+    <!-- struct urcu_work -->
+    <class-decl name='urcu_work' size-in-bits='128' is-struct='yes' visibility='default' filepath='src/workqueue.h' line='53' column='1' id='type-id-56'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node urcu_work::next -->
+        <var-decl name='next' type-id='type-id-8' visibility='default' filepath='src/workqueue.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (urcu_work*)* urcu_work::func -->
+        <var-decl name='func' type-id='type-id-57' visibility='default' filepath='src/workqueue.h' line='55' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_work* -->
+    <pointer-type-def type-id='type-id-56' size-in-bits='64' id='type-id-58'/>
+    <!-- void (urcu_work*)* -->
+    <pointer-type-def type-id='type-id-59' size-in-bits='64' id='type-id-57'/>
+    <!-- void urcu_workqueue_queue_work(urcu_workqueue*, urcu_work*, void (urcu_work*)*) -->
+    <function-decl name='urcu_workqueue_queue_work' mangled-name='urcu_workqueue_queue_work' filepath='src/workqueue.c' line='346' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_queue_work'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='346' column='1'/>
+      <!-- parameter of type 'urcu_work*' -->
+      <parameter type-id='type-id-58' name='work' filepath='src/workqueue.c' line='347' column='1'/>
+      <!-- parameter of type 'void (urcu_work*)*' -->
+      <parameter type-id='type-id-57' name='func' filepath='src/workqueue.c' line='348' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_destroy(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_destroy' mangled-name='urcu_workqueue_destroy' filepath='src/workqueue.c' line='334' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_destroy'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='458' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- urcu_workqueue* urcu_workqueue_create(unsigned long int, int, void*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*) -->
+    <function-decl name='urcu_workqueue_create' mangled-name='urcu_workqueue_create' filepath='src/workqueue.c' line='269' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_create'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='flags' filepath='src/workqueue.c' line='269' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='cpu_affinity' filepath='src/workqueue.c' line='270' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='priv' filepath='src/workqueue.c' line='270' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='grace_period_fct' filepath='src/workqueue.c' line='271' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='initialize_worker_fct' filepath='src/workqueue.c' line='272' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='finalize_worker_fct' filepath='src/workqueue.c' line='273' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_before_wait_fct' filepath='src/workqueue.c' line='274' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_after_wake_up_fct' filepath='src/workqueue.c' line='275' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_before_pause_fct' filepath='src/workqueue.c' line='276' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_after_resume_fct' filepath='src/workqueue.c' line='277' column='1'/>
+      <!-- urcu_workqueue* -->
+      <return type-id='type-id-51'/>
+    </function-decl>
+    <!-- void (urcu_work*) -->
+    <function-type size-in-bits='64' id='type-id-59'>
+      <!-- parameter of type 'urcu_work*' -->
+      <parameter type-id='type-id-58'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (urcu_workqueue*, void*) -->
+    <function-type size-in-bits='64' id='type-id-52'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfht -->
+    <class-decl name='cds_lfht' size-in-bits='5248' is-struct='yes' visibility='default' filepath='../src/rculfhash-internal.h' line='68' column='1' id='type-id-60'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int cds_lfht::max_nr_buckets -->
+        <var-decl name='max_nr_buckets' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- const cds_lfht_mm_type* cds_lfht::mm -->
+        <var-decl name='mm' type-id='type-id-61' visibility='default' filepath='../src/rculfhash-internal.h' line='71' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- const rcu_flavor_struct* cds_lfht::flavor -->
+        <var-decl name='flavor' type-id='type-id-62' visibility='default' filepath='../src/rculfhash-internal.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- long int cds_lfht::count -->
+        <var-decl name='count' type-id='type-id-32' visibility='default' filepath='../src/rculfhash-internal.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- pthread_mutex_t cds_lfht::resize_mutex -->
+        <var-decl name='resize_mutex' type-id='type-id-28' visibility='default' filepath='../src/rculfhash-internal.h' line='83' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- pthread_attr_t* cds_lfht::resize_attr -->
+        <var-decl name='resize_attr' type-id='type-id-63' visibility='default' filepath='../src/rculfhash-internal.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- unsigned int cds_lfht::in_progress_destroy -->
+        <var-decl name='in_progress_destroy' type-id='type-id-33' visibility='default' filepath='../src/rculfhash-internal.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- unsigned long int cds_lfht::resize_target -->
+        <var-decl name='resize_target' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- int cds_lfht::resize_initiated -->
+        <var-decl name='resize_initiated' type-id='type-id-3' visibility='default' filepath='../src/rculfhash-internal.h' line='87' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='800'>
+        <!-- int cds_lfht::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='../src/rculfhash-internal.h' line='92' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- unsigned long int cds_lfht::min_alloc_buckets_order -->
+        <var-decl name='min_alloc_buckets_order' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='93' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='896'>
+        <!-- unsigned long int cds_lfht::min_nr_alloc_buckets -->
+        <var-decl name='min_nr_alloc_buckets' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='960'>
+        <!-- ht_items_count* cds_lfht::split_count -->
+        <var-decl name='split_count' type-id='type-id-64' visibility='default' filepath='../src/rculfhash-internal.h' line='95' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- unsigned long int cds_lfht::size -->
+        <var-decl name='size' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='100' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1088'>
+        <!-- cds_lfht_node* (cds_lfht*, unsigned long int)* cds_lfht::bucket_at -->
+        <var-decl name='bucket_at' type-id='type-id-65' visibility='default' filepath='../src/rculfhash-internal.h' line='105' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-66' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_lfht_mm_type -->
+    <class-decl name='cds_lfht_mm_type' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/rculfhash.h' line='105' column='1' id='type-id-67'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfht* (unsigned long int, unsigned long int)* cds_lfht_mm_type::alloc_cds_lfht -->
+        <var-decl name='alloc_cds_lfht' type-id='type-id-68' visibility='default' filepath='../include/urcu/rculfhash.h' line='106' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (cds_lfht*, unsigned long int)* cds_lfht_mm_type::alloc_bucket_table -->
+        <var-decl name='alloc_bucket_table' type-id='type-id-69' visibility='default' filepath='../include/urcu/rculfhash.h' line='108' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (cds_lfht*, unsigned long int)* cds_lfht_mm_type::free_bucket_table -->
+        <var-decl name='free_bucket_table' type-id='type-id-69' visibility='default' filepath='../include/urcu/rculfhash.h' line='109' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- cds_lfht_node* (cds_lfht*, unsigned long int)* cds_lfht_mm_type::bucket_at -->
+        <var-decl name='bucket_at' type-id='type-id-65' visibility='default' filepath='../include/urcu/rculfhash.h' line='110' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfht* -->
+    <pointer-type-def type-id='type-id-60' size-in-bits='64' id='type-id-70'/>
+    <!-- cds_lfht* (unsigned long int, unsigned long int)* -->
+    <pointer-type-def type-id='type-id-71' size-in-bits='64' id='type-id-68'/>
+    <!-- void (cds_lfht*, unsigned long int)* -->
+    <pointer-type-def type-id='type-id-72' size-in-bits='64' id='type-id-69'/>
+    <!-- struct cds_lfht_node -->
+    <class-decl name='cds_lfht_node' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/rculfhash.h' line='60' column='1' id='type-id-73'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfht_node* cds_lfht_node::next -->
+        <var-decl name='next' type-id='type-id-74' visibility='default' filepath='../include/urcu/rculfhash.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- unsigned long int cds_lfht_node::reverse_hash -->
+        <var-decl name='reverse_hash' type-id='type-id-39' visibility='default' filepath='../include/urcu/rculfhash.h' line='62' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfht_node* -->
+    <pointer-type-def type-id='type-id-73' size-in-bits='64' id='type-id-74'/>
+    <!-- cds_lfht_node* (cds_lfht*, unsigned long int)* -->
+    <pointer-type-def type-id='type-id-75' size-in-bits='64' id='type-id-65'/>
+    <!-- const cds_lfht_mm_type -->
+    <qualified-type-def type-id='type-id-67' const='yes' id='type-id-76'/>
+    <!-- const cds_lfht_mm_type* -->
+    <pointer-type-def type-id='type-id-76' size-in-bits='64' id='type-id-61'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../src/urcu-flavor.h' line='40' column='1' id='type-id-77'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-78' visibility='default' filepath='../src/urcu-flavor.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-78' visibility='default' filepath='../src/urcu-flavor.h' line='42' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-79' visibility='default' filepath='../src/urcu-flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-78' visibility='default' filepath='../src/urcu-flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-5' visibility='default' filepath='../src/urcu-flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-78' visibility='default' filepath='../src/urcu-flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-80' visibility='default' filepath='../src/urcu-flavor.h' line='48' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-78' visibility='default' filepath='../src/urcu-flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-78' visibility='default' filepath='../src/urcu-flavor.h' line='51' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-78' visibility='default' filepath='../src/urcu-flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-78' visibility='default' filepath='../src/urcu-flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-78' visibility='default' filepath='../src/urcu-flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-81' visibility='default' filepath='../src/urcu-flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-81' visibility='default' filepath='../src/urcu-flavor.h' line='58' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-82' size-in-bits='64' id='type-id-78'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-83' size-in-bits='64' id='type-id-79'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-84' size-in-bits='64' id='type-id-85'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-86' size-in-bits='64' id='type-id-80'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../src/urcu-flavor.h' line='30' column='1' id='type-id-87'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-85' visibility='default' filepath='../src/urcu-flavor.h' line='31' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-85' visibility='default' filepath='../src/urcu-flavor.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-85' visibility='default' filepath='../src/urcu-flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-48' visibility='default' filepath='../src/urcu-flavor.h' line='34' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-87' size-in-bits='64' id='type-id-88'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-89' size-in-bits='64' id='type-id-81'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-77' const='yes' id='type-id-90'/>
+    <!-- const rcu_flavor_struct* -->
+    <pointer-type-def type-id='type-id-90' size-in-bits='64' id='type-id-62'/>
+    <!-- union pthread_attr_t -->
+    <union-decl name='pthread_attr_t' size-in-bits='448' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='56' column='1' id='type-id-91'>
+      <data-member access='private'>
+        <!-- char pthread_attr_t::__size[56] -->
+        <var-decl name='__size' type-id='type-id-92' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int pthread_attr_t::__align -->
+        <var-decl name='__align' type-id='type-id-32' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='59' column='1'/>
+      </data-member>
+    </union-decl>
+
+    <!-- char[56] -->
+    <array-type-def dimensions='1' type-id='type-id-38' size-in-bits='448' id='type-id-92'>
+      <!-- <anonymous range>[56] -->
+      <subrange length='56' type-id='type-id-39' id='type-id-93'/>
+
+    </array-type-def>
+    <!-- typedef pthread_attr_t pthread_attr_t -->
+    <typedef-decl name='pthread_attr_t' type-id='type-id-91' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='62' column='1' id='type-id-94'/>
+    <!-- pthread_attr_t* -->
+    <pointer-type-def type-id='type-id-94' size-in-bits='64' id='type-id-63'/>
+    <!-- struct ht_items_count -->
+    <class-decl name='ht_items_count' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/rculfhash.c' line='337' column='1' id='type-id-95'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int ht_items_count::add -->
+        <var-decl name='add' type-id='type-id-39' visibility='default' filepath='src/rculfhash.c' line='338' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- unsigned long int ht_items_count::del -->
+        <var-decl name='del' type-id='type-id-39' visibility='default' filepath='src/rculfhash.c' line='338' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- ht_items_count* -->
+    <pointer-type-def type-id='type-id-95' size-in-bits='64' id='type-id-64'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='4096' is-anonymous='yes' visibility='default' filepath='../src/rculfhash-internal.h' line='111' column='1' id='type-id-66'>
+      <data-member access='private'>
+        <!-- cds_lfht_node* __anonymous_union__::tbl_order[64] -->
+        <var-decl name='tbl_order' type-id='type-id-96' visibility='default' filepath='../src/rculfhash-internal.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_lfht_node* __anonymous_union__::tbl_chunk[1] -->
+        <var-decl name='tbl_chunk' type-id='type-id-97' visibility='default' filepath='../src/rculfhash-internal.h' line='132' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_lfht_node* __anonymous_union__::tbl_mmap -->
+        <var-decl name='tbl_mmap' type-id='type-id-74' visibility='default' filepath='../src/rculfhash-internal.h' line='138' column='1'/>
+      </data-member>
+    </union-decl>
+
+    <!-- cds_lfht_node*[64] -->
+    <array-type-def dimensions='1' type-id='type-id-74' size-in-bits='4096' id='type-id-96'>
+      <!-- <anonymous range>[64] -->
+      <subrange length='64' type-id='type-id-39' id='type-id-98'/>
+
+    </array-type-def>
+
+    <!-- cds_lfht_node*[1] -->
+    <array-type-def dimensions='1' type-id='type-id-74' size-in-bits='64' id='type-id-97'>
+      <!-- <anonymous range>[1] -->
+      <subrange length='1' type-id='type-id-39' id='type-id-99'/>
+
+    </array-type-def>
+    <!-- void cds_lfht_resize(cds_lfht*, unsigned long int) -->
+    <function-decl name='cds_lfht_resize' mangled-name='cds_lfht_resize' filepath='src/rculfhash.c' line='1978' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_resize'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1978' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='new_size' filepath='src/rculfhash.c' line='1978' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- long int* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-100'/>
+    <!-- unsigned long int* -->
+    <pointer-type-def type-id='type-id-39' size-in-bits='64' id='type-id-101'/>
+    <!-- void cds_lfht_count_nodes(cds_lfht*, long int*, unsigned long int*, long int*) -->
+    <function-decl name='cds_lfht_count_nodes' mangled-name='cds_lfht_count_nodes' filepath='src/rculfhash.c' line='1856' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_count_nodes'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1856' column='1'/>
+      <!-- parameter of type 'long int*' -->
+      <parameter type-id='type-id-100' name='approx_before' filepath='src/rculfhash.c' line='1857' column='1'/>
+      <!-- parameter of type 'unsigned long int*' -->
+      <parameter type-id='type-id-101' name='count' filepath='src/rculfhash.c' line='1858' column='1'/>
+      <!-- parameter of type 'long int*' -->
+      <parameter type-id='type-id-100' name='approx_after' filepath='src/rculfhash.c' line='1859' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- pthread_attr_t** -->
+    <pointer-type-def type-id='type-id-63' size-in-bits='64' id='type-id-102'/>
+    <!-- int cds_lfht_destroy(cds_lfht*, pthread_attr_t**) -->
+    <function-decl name='cds_lfht_destroy' mangled-name='cds_lfht_destroy' filepath='src/rculfhash.c' line='1831' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_destroy'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1831' column='1'/>
+      <!-- parameter of type 'pthread_attr_t**' -->
+      <parameter type-id='type-id-102' name='attr' filepath='src/rculfhash.c' line='1831' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- int cds_lfht_is_node_deleted(cds_lfht_node*) -->
+    <function-decl name='cds_lfht_is_node_deleted' mangled-name='cds_lfht_is_node_deleted' filepath='src/rculfhash.c' line='1788' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_is_node_deleted'>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1788' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- int cds_lfht_del(cds_lfht*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_del' mangled-name='cds_lfht_del' filepath='src/rculfhash.c' line='1772' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_del'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1772' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1772' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- struct cds_lfht_iter -->
+    <class-decl name='cds_lfht_iter' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/rculfhash.h' line='66' column='1' id='type-id-103'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfht_node* cds_lfht_iter::node -->
+        <var-decl name='node' type-id='type-id-74' visibility='default' filepath='../include/urcu/rculfhash.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_lfht_node* cds_lfht_iter::next -->
+        <var-decl name='next' type-id='type-id-74' visibility='default' filepath='../include/urcu/rculfhash.h' line='67' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfht_iter* -->
+    <pointer-type-def type-id='type-id-103' size-in-bits='64' id='type-id-104'/>
+    <!-- int (cds_lfht_node*, void*)* -->
+    <pointer-type-def type-id='type-id-105' size-in-bits='64' id='type-id-106'/>
+    <!-- typedef int (cds_lfht_node*, void*)* cds_lfht_match_fct -->
+    <typedef-decl name='cds_lfht_match_fct' type-id='type-id-106' filepath='../include/urcu/rculfhash.h' line='83' column='1' id='type-id-107'/>
+    <!-- int cds_lfht_replace(cds_lfht*, cds_lfht_iter*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_replace' mangled-name='cds_lfht_replace' filepath='src/rculfhash.c' line='1751' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_replace'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1751' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-104' name='old_iter' filepath='src/rculfhash.c' line='1752' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1753' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-107' name='match' filepath='src/rculfhash.c' line='1754' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1755' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='new_node' filepath='src/rculfhash.c' line='1756' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- cds_lfht_node* cds_lfht_add_replace(cds_lfht*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_add_replace' mangled-name='cds_lfht_add_replace' filepath='src/rculfhash.c' line='1728' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_add_replace'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1728' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1729' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-107' name='match' filepath='src/rculfhash.c' line='1730' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1731' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1732' column='1'/>
+      <!-- cds_lfht_node* -->
+      <return type-id='type-id-74'/>
+    </function-decl>
+    <!-- cds_lfht_node* cds_lfht_add_unique(cds_lfht*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_add_unique' mangled-name='cds_lfht_add_unique' filepath='src/rculfhash.c' line='1711' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_add_unique'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1728' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1729' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-107' name='match' filepath='src/rculfhash.c' line='1730' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1731' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1732' column='1'/>
+      <!-- cds_lfht_node* -->
+      <return type-id='type-id-74'/>
+    </function-decl>
+    <!-- void cds_lfht_add(cds_lfht*, unsigned long int, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_add' mangled-name='cds_lfht_add' filepath='src/rculfhash.c' line='1700' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_add'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1700' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1700' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1701' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_first(cds_lfht*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_first' mangled-name='cds_lfht_first' filepath='src/rculfhash.c' line='1690' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_first'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1690' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-104' name='iter' filepath='src/rculfhash.c' line='1690' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_next(cds_lfht*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_next' mangled-name='cds_lfht_next' filepath='src/rculfhash.c' line='1668' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_next'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1668' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-104' name='iter' filepath='src/rculfhash.c' line='1668' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_next_duplicate(cds_lfht*, cds_lfht_match_fct, void*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_next_duplicate' mangled-name='cds_lfht_next_duplicate' filepath='src/rculfhash.c' line='1635' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_next_duplicate'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1635' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-107' name='match' filepath='src/rculfhash.c' line='1635' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1636' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-104' name='iter' filepath='src/rculfhash.c' line='1636' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_lookup(cds_lfht*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_lookup' mangled-name='cds_lfht_lookup' filepath='src/rculfhash.c' line='1597' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_lookup'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1597' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1597' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-107' name='match' filepath='src/rculfhash.c' line='1598' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1598' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-104' name='iter' filepath='src/rculfhash.c' line='1599' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- cds_lfht* _cds_lfht_new(unsigned long int, unsigned long int, unsigned long int, int, const cds_lfht_mm_type*, const rcu_flavor_struct*, pthread_attr_t*) -->
+    <function-decl name='_cds_lfht_new' mangled-name='_cds_lfht_new' filepath='src/rculfhash.c' line='1520' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_cds_lfht_new'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='init_size' filepath='src/rculfhash.c' line='1520' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='min_nr_alloc_buckets' filepath='src/rculfhash.c' line='1521' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='max_nr_buckets' filepath='src/rculfhash.c' line='1522' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/rculfhash.c' line='1523' column='1'/>
+      <!-- parameter of type 'const cds_lfht_mm_type*' -->
+      <parameter type-id='type-id-61' name='mm' filepath='src/rculfhash.c' line='1524' column='1'/>
+      <!-- parameter of type 'const rcu_flavor_struct*' -->
+      <parameter type-id='type-id-62' name='flavor' filepath='src/rculfhash.c' line='1525' column='1'/>
+      <!-- parameter of type 'pthread_attr_t*' -->
+      <parameter type-id='type-id-63' name='attr' filepath='src/rculfhash.c' line='1526' column='1'/>
+      <!-- cds_lfht* -->
+      <return type-id='type-id-70'/>
+    </function-decl>
+    <!-- int cds_lfht_get_count_order_ulong(unsigned long int) -->
+    <function-decl name='cds_lfht_get_count_order_ulong' mangled-name='cds_lfht_get_count_order_ulong' filepath='src/rculfhash.c' line='574' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_get_count_order_ulong'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='x' filepath='src/rculfhash.c' line='574' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- typedef unsigned int __uint32_t -->
+    <typedef-decl name='__uint32_t' type-id='type-id-33' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='41' column='1' id='type-id-108'/>
+    <!-- typedef __uint32_t uint32_t -->
+    <typedef-decl name='uint32_t' type-id='type-id-108' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h' line='26' column='1' id='type-id-109'/>
+    <!-- int cds_lfht_get_count_order_u32(uint32_t) -->
+    <function-decl name='cds_lfht_get_count_order_u32' mangled-name='cds_lfht_get_count_order_u32' filepath='src/rculfhash.c' line='562' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_get_count_order_u32'>
+      <!-- parameter of type 'typedef uint32_t' -->
+      <parameter type-id='type-id-109' name='x' filepath='src/rculfhash.c' line='562' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- unsigned int cds_lfht_fls_ulong(unsigned long int) -->
+    <function-decl name='cds_lfht_fls_ulong' mangled-name='cds_lfht_fls_ulong' filepath='src/rculfhash.c' line='549' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_fls_ulong'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='x' filepath='src/rculfhash.c' line='549' column='1'/>
+      <!-- unsigned int -->
+      <return type-id='type-id-33'/>
+    </function-decl>
+    <!-- cds_lfht* (unsigned long int, unsigned long int) -->
+    <function-type size-in-bits='64' id='type-id-71'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- cds_lfht* -->
+      <return type-id='type-id-70'/>
+    </function-type>
+    <!-- cds_lfht_node* (cds_lfht*, unsigned long int) -->
+    <function-type size-in-bits='64' id='type-id-75'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- cds_lfht_node* -->
+      <return type-id='type-id-74'/>
+    </function-type>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-83'>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-type>
+    <!-- int (cds_lfht_node*, void*) -->
+    <function-type size-in-bits='64' id='type-id-105'>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-82'>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (cds_lfht*, unsigned long int) -->
+    <function-type size-in-bits='64' id='type-id-72'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-89'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-88'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-86'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-85'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-84'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash-mm-order.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- const cds_lfht_mm_type cds_lfht_mm_order -->
+    <var-decl name='cds_lfht_mm_order' type-id='type-id-76' mangled-name='cds_lfht_mm_order' visibility='default' filepath='../include/urcu/rculfhash.h' line='114' column='1' elf-symbol-id='cds_lfht_mm_order'/>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash-mm-chunk.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- const cds_lfht_mm_type cds_lfht_mm_chunk -->
+    <var-decl name='cds_lfht_mm_chunk' type-id='type-id-76' mangled-name='cds_lfht_mm_chunk' visibility='default' filepath='../include/urcu/rculfhash.h' line='115' column='1' elf-symbol-id='cds_lfht_mm_chunk'/>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash-mm-mmap.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- const cds_lfht_mm_type cds_lfht_mm_mmap -->
+    <var-decl name='cds_lfht_mm_mmap' type-id='type-id-76' mangled-name='cds_lfht_mm_mmap' visibility='default' filepath='../include/urcu/rculfhash.h' line='116' column='1' elf-symbol-id='cds_lfht_mm_mmap'/>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-28' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-110'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-111' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-112' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-113' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-111'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-114' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-115' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-115' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-115' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-114'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-117' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-116'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-117'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-33' size-in-bits='64' id='type-id-115'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-39' id='type-id-118'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-38' size-in-bits='384' id='type-id-112'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-39' id='type-id-119'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-113'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-110' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-120'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-120' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-121'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-122'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-123' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-124' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-32' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-123'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-32' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-124'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-122' const='yes' id='type-id-125'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-125' size-in-bits='64' id='type-id-126'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-121' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-126' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-121' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-121' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-126' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-121' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.10/x86_64-pc-linux-gnu/liburcu-common.so.6.xml b/extras/abi/0.10/x86_64-pc-linux-gnu/liburcu-common.so.6.xml
new file mode 100644 (file)
index 0000000..e7aef91
--- /dev/null
@@ -0,0 +1,910 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-common.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- __cds_wfcq_dequeue_blocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_dequeue_nonblocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_dequeue_with_state_blocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_dequeue_with_state_nonblocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_with_state_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_first_blocking -->
+    <elf-symbol name='__cds_wfcq_first_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_first_nonblocking -->
+    <elf-symbol name='__cds_wfcq_first_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_init -->
+    <elf-symbol name='__cds_wfcq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_next_blocking -->
+    <elf-symbol name='__cds_wfcq_next_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_next_nonblocking -->
+    <elf-symbol name='__cds_wfcq_next_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_splice_blocking -->
+    <elf-symbol name='__cds_wfcq_splice_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_splice_nonblocking -->
+    <elf-symbol name='__cds_wfcq_splice_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfq_dequeue_blocking -->
+    <elf-symbol name='__cds_wfq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_init -->
+    <elf-symbol name='__cds_wfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_all -->
+    <elf-symbol name='__cds_wfs_pop_all' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_blocking -->
+    <elf-symbol name='__cds_wfs_pop_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_nonblocking -->
+    <elf-symbol name='__cds_wfs_pop_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_with_state_blocking -->
+    <elf-symbol name='__cds_wfs_pop_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_with_state_nonblocking -->
+    <elf-symbol name='__cds_wfs_pop_with_state_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_blocking -->
+    <elf-symbol name='cds_wfcq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_lock -->
+    <elf-symbol name='cds_wfcq_dequeue_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_unlock -->
+    <elf-symbol name='cds_wfcq_dequeue_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_with_state_blocking -->
+    <elf-symbol name='cds_wfcq_dequeue_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_destroy -->
+    <elf-symbol name='cds_wfcq_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_empty -->
+    <elf-symbol name='cds_wfcq_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_enqueue -->
+    <elf-symbol name='cds_wfcq_enqueue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_init -->
+    <elf-symbol name='cds_wfcq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_node_init -->
+    <elf-symbol name='cds_wfcq_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_splice_blocking -->
+    <elf-symbol name='cds_wfcq_splice_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_dequeue_blocking -->
+    <elf-symbol name='cds_wfq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_destroy -->
+    <elf-symbol name='cds_wfq_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_enqueue -->
+    <elf-symbol name='cds_wfq_enqueue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_init -->
+    <elf-symbol name='cds_wfq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_node_init -->
+    <elf-symbol name='cds_wfq_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_destroy -->
+    <elf-symbol name='cds_wfs_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_empty -->
+    <elf-symbol name='cds_wfs_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_first -->
+    <elf-symbol name='cds_wfs_first' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_init -->
+    <elf-symbol name='cds_wfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_next_blocking -->
+    <elf-symbol name='cds_wfs_next_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_next_nonblocking -->
+    <elf-symbol name='cds_wfs_next_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_node_init -->
+    <elf-symbol name='cds_wfs_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_all_blocking -->
+    <elf-symbol name='cds_wfs_pop_all_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_blocking -->
+    <elf-symbol name='cds_wfs_pop_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_lock -->
+    <elf-symbol name='cds_wfs_pop_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_unlock -->
+    <elf-symbol name='cds_wfs_pop_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_with_state_blocking -->
+    <elf-symbol name='cds_wfs_pop_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_push -->
+    <elf-symbol name='cds_wfs_push' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='wfqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_wfq_node -->
+    <class-decl name='cds_wfq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfqueue.h' line='48' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfq_node* cds_wfq_node::next -->
+        <var-decl name='next' type-id='type-id-2' visibility='default' filepath='../include/urcu/wfqueue.h' line='49' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfq_node* -->
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' id='type-id-2'/>
+    <!-- struct cds_wfq_queue -->
+    <class-decl name='cds_wfq_queue' size-in-bits='512' is-struct='yes' visibility='default' filepath='../include/urcu/wfqueue.h' line='52' column='1' id='type-id-3'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfq_node* cds_wfq_queue::head -->
+        <var-decl name='head' type-id='type-id-2' visibility='default' filepath='../include/urcu/wfqueue.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfq_node** cds_wfq_queue::tail -->
+        <var-decl name='tail' type-id='type-id-4' visibility='default' filepath='../include/urcu/wfqueue.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- cds_wfq_node cds_wfq_queue::dummy -->
+        <var-decl name='dummy' type-id='type-id-1' visibility='default' filepath='../include/urcu/wfqueue.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- pthread_mutex_t cds_wfq_queue::lock -->
+        <var-decl name='lock' type-id='type-id-5' visibility='default' filepath='../include/urcu/wfqueue.h' line='55' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfq_node** -->
+    <pointer-type-def type-id='type-id-2' size-in-bits='64' id='type-id-4'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-6'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-7' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-7'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-12' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-12' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-13' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-10'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-11'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-12'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-14'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-14' size-in-bits='64' id='type-id-15'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-14' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-13'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-16'/>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-17'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='320' id='type-id-8'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-17' id='type-id-18'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-9'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-6' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-5'/>
+    <!-- cds_wfq_queue* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-19'/>
+    <!-- cds_wfq_node* cds_wfq_dequeue_blocking(cds_wfq_queue*) -->
+    <function-decl name='cds_wfq_dequeue_blocking' mangled-name='cds_wfq_dequeue_blocking' filepath='src/wfqueue.c' line='59' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_dequeue_blocking'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='59' column='1'/>
+      <!-- cds_wfq_node* -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- cds_wfq_node* __cds_wfq_dequeue_blocking(cds_wfq_queue*) -->
+    <function-decl name='__cds_wfq_dequeue_blocking' mangled-name='__cds_wfq_dequeue_blocking' filepath='src/wfqueue.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfq_dequeue_blocking'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='59' column='1'/>
+      <!-- cds_wfq_node* -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-20'/>
+    <!-- void cds_wfq_enqueue(cds_wfq_queue*, cds_wfq_node*) -->
+    <function-decl name='cds_wfq_enqueue' mangled-name='cds_wfq_enqueue' filepath='src/wfqueue.c' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_enqueue'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='49' column='1'/>
+      <!-- parameter of type 'cds_wfq_node*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/wfqueue.c' line='49' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfq_destroy(cds_wfq_queue*) -->
+    <function-decl name='cds_wfq_destroy' mangled-name='cds_wfq_destroy' filepath='src/wfqueue.c' line='44' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_destroy'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='44' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfq_init(cds_wfq_queue*) -->
+    <function-decl name='cds_wfq_init' mangled-name='cds_wfq_init' filepath='src/wfqueue.c' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_init'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='44' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfq_node_init(cds_wfq_node*) -->
+    <function-decl name='cds_wfq_node_init' mangled-name='cds_wfq_node_init' filepath='src/wfqueue.c' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_node_init'>
+      <!-- parameter of type 'cds_wfq_node*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/wfqueue.c' line='34' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='wfcqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-22'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='83' column='1' id='type-id-23'>
+      <data-member access='private'>
+        <!-- __cds_wfcq_head* __anonymous_union__::_h -->
+        <var-decl name='_h' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_wfcq_head* __anonymous_union__::h -->
+        <var-decl name='h' type-id='type-id-25' visibility='default' filepath='../include/urcu/wfcqueue.h' line='85' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __cds_wfcq_head -->
+    <class-decl name='__cds_wfcq_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='68' column='1' id='type-id-26'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node __cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __cds_wfcq_head* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-24'/>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-27'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-5' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_head* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-25'/>
+    <!-- typedef __anonymous_union__ cds_wfcq_head_ptr_t -->
+    <typedef-decl name='cds_wfcq_head_ptr_t' type-id='type-id-23' filepath='../include/urcu/wfcqueue.h' line='86' column='1' id='type-id-28'/>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-29'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_tail* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- cds_wfcq_node* __cds_wfcq_next_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_node*) -->
+    <function-decl name='__cds_wfcq_next_nonblocking' mangled-name='__cds_wfcq_next_nonblocking' filepath='src/wfcqueue.c' line='178' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_next_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='179' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='180' column='1'/>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='181' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_next_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_node*) -->
+    <function-decl name='__cds_wfcq_next_blocking' mangled-name='__cds_wfcq_next_blocking' filepath='src/wfcqueue.c' line='170' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_next_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='179' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='180' column='1'/>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='181' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_first_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_first_nonblocking' mangled-name='__cds_wfcq_first_nonblocking' filepath='src/wfcqueue.c' line='163' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_first_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_first_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_first_blocking' mangled-name='__cds_wfcq_first_blocking' filepath='src/wfcqueue.c' line='156' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_first_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- unnamed&#45;enum&#45;underlying&#45;type -->
+    <type-decl name='unnamed-enum-underlying-type' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-31'/>
+    <!-- enum cds_wfcq_ret -->
+    <enum-decl name='cds_wfcq_ret' filepath='../include/urcu/wfcqueue.h' line='48' column='1' id='type-id-32'>
+      <underlying-type type-id='type-id-31'/>
+      <enumerator name='CDS_WFCQ_RET_WOULDBLOCK' value='-1'/>
+      <enumerator name='CDS_WFCQ_RET_DEST_EMPTY' value='0'/>
+      <enumerator name='CDS_WFCQ_RET_DEST_NON_EMPTY' value='1'/>
+      <enumerator name='CDS_WFCQ_RET_SRC_EMPTY' value='2'/>
+    </enum-decl>
+    <!-- cds_wfcq_ret __cds_wfcq_splice_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_splice_nonblocking' mangled-name='__cds_wfcq_splice_nonblocking' filepath='src/wfcqueue.c' line='146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_splice_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='dest_q_head' filepath='src/wfcqueue.c' line='147' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='dest_q_tail' filepath='src/wfcqueue.c' line='148' column='1'/>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='src_q_head' filepath='src/wfcqueue.c' line='149' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='src_q_tail' filepath='src/wfcqueue.c' line='150' column='1'/>
+      <!-- enum cds_wfcq_ret -->
+      <return type-id='type-id-32'/>
+    </function-decl>
+    <!-- cds_wfcq_ret __cds_wfcq_splice_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_splice_blocking' mangled-name='__cds_wfcq_splice_blocking' filepath='src/wfcqueue.c' line='136' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_splice_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='dest_q_head' filepath='src/wfcqueue.c' line='147' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='dest_q_tail' filepath='src/wfcqueue.c' line='148' column='1'/>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='src_q_head' filepath='src/wfcqueue.c' line='149' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='src_q_tail' filepath='src/wfcqueue.c' line='150' column='1'/>
+      <!-- enum cds_wfcq_ret -->
+      <return type-id='type-id-32'/>
+    </function-decl>
+    <!-- int* -->
+    <pointer-type-def type-id='type-id-10' size-in-bits='64' id='type-id-33'/>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_with_state_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, int*) -->
+    <function-decl name='__cds_wfcq_dequeue_with_state_nonblocking' mangled-name='__cds_wfcq_dequeue_with_state_nonblocking' filepath='src/wfcqueue.c' line='128' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_with_state_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='129' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='130' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfcqueue.c' line='131' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_dequeue_nonblocking' mangled-name='__cds_wfcq_dequeue_nonblocking' filepath='src/wfcqueue.c' line='121' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_with_state_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, int*) -->
+    <function-decl name='__cds_wfcq_dequeue_with_state_blocking' mangled-name='__cds_wfcq_dequeue_with_state_blocking' filepath='src/wfcqueue.c' line='113' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_with_state_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='129' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='130' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfcqueue.c' line='131' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_dequeue_blocking' mangled-name='__cds_wfcq_dequeue_blocking' filepath='src/wfcqueue.c' line='106' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_ret cds_wfcq_splice_blocking(cds_wfcq_head*, cds_wfcq_tail*, cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_splice_blocking' mangled-name='cds_wfcq_splice_blocking' filepath='src/wfcqueue.c' line='96' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_splice_blocking'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='dest_q_head' filepath='src/wfcqueue.c' line='97' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='dest_q_tail' filepath='src/wfcqueue.c' line='98' column='1'/>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='src_q_head' filepath='src/wfcqueue.c' line='99' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='src_q_tail' filepath='src/wfcqueue.c' line='100' column='1'/>
+      <!-- enum cds_wfcq_ret -->
+      <return type-id='type-id-32'/>
+    </function-decl>
+    <!-- cds_wfcq_node* cds_wfcq_dequeue_with_state_blocking(cds_wfcq_head*, cds_wfcq_tail*, int*) -->
+    <function-decl name='cds_wfcq_dequeue_with_state_blocking' mangled-name='cds_wfcq_dequeue_with_state_blocking' filepath='src/wfcqueue.c' line='88' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_with_state_blocking'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='89' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='90' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfcqueue.c' line='91' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* cds_wfcq_dequeue_blocking(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_dequeue_blocking' mangled-name='cds_wfcq_dequeue_blocking' filepath='src/wfcqueue.c' line='81' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_blocking'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='82' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='83' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- void cds_wfcq_dequeue_unlock(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_dequeue_unlock' mangled-name='cds_wfcq_dequeue_unlock' filepath='src/wfcqueue.c' line='75' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_unlock'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_dequeue_lock(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_dequeue_lock' mangled-name='cds_wfcq_dequeue_lock' filepath='src/wfcqueue.c' line='69' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_lock'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- bool -->
+    <type-decl name='bool' size-in-bits='8' id='type-id-34'/>
+    <!-- bool cds_wfcq_enqueue(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_node*) -->
+    <function-decl name='cds_wfcq_enqueue' mangled-name='cds_wfcq_enqueue' filepath='src/wfcqueue.c' line='62' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_enqueue'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='62' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='63' column='1'/>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='64' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <!-- bool cds_wfcq_empty(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_empty' mangled-name='cds_wfcq_empty' filepath='src/wfcqueue.c' line='55' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_empty'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='55' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='56' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <!-- void __cds_wfcq_init(__cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_init' mangled-name='__cds_wfcq_init' filepath='src/wfcqueue.c' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_init'>
+      <!-- parameter of type '__cds_wfcq_head*' -->
+      <parameter type-id='type-id-24' name='head' filepath='src/wfcqueue.c' line='49' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='50' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_destroy(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_destroy' mangled-name='cds_wfcq_destroy' filepath='src/wfcqueue.c' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_destroy'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_init(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_init' mangled-name='cds_wfcq_init' filepath='src/wfcqueue.c' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_init'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_node_init(cds_wfcq_node*) -->
+    <function-decl name='cds_wfcq_node_init' mangled-name='cds_wfcq_node_init' filepath='src/wfcqueue.c' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_node_init'>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='32' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='wfstack.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_wfs_head -->
+    <class-decl name='cds_wfs_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='82' column='1' id='type-id-35'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_node cds_wfs_head::node -->
+        <var-decl name='node' type-id='type-id-36' visibility='default' filepath='../include/urcu/wfstack.h' line='83' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfs_node -->
+    <class-decl name='cds_wfs_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='72' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_node* cds_wfs_node::next -->
+        <var-decl name='next' type-id='type-id-37' visibility='default' filepath='../include/urcu/wfstack.h' line='73' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfs_node* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-37'/>
+    <!-- cds_wfs_head* -->
+    <pointer-type-def type-id='type-id-35' size-in-bits='64' id='type-id-38'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='100' column='1' id='type-id-39'>
+      <data-member access='private'>
+        <!-- __cds_wfs_stack* __anonymous_union__::_s -->
+        <var-decl name='_s' type-id='type-id-40' visibility='default' filepath='../include/urcu/wfstack.h' line='101' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_wfs_stack* __anonymous_union__::s -->
+        <var-decl name='s' type-id='type-id-41' visibility='default' filepath='../include/urcu/wfstack.h' line='102' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __cds_wfs_stack -->
+    <class-decl name='__cds_wfs_stack' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='86' column='1' id='type-id-42'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_head* __cds_wfs_stack::head -->
+        <var-decl name='head' type-id='type-id-38' visibility='default' filepath='../include/urcu/wfstack.h' line='87' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __cds_wfs_stack* -->
+    <pointer-type-def type-id='type-id-42' size-in-bits='64' id='type-id-40'/>
+    <!-- struct cds_wfs_stack -->
+    <class-decl name='cds_wfs_stack' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='90' column='1' id='type-id-43'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_head* cds_wfs_stack::head -->
+        <var-decl name='head' type-id='type-id-38' visibility='default' filepath='../include/urcu/wfstack.h' line='91' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfs_stack::lock -->
+        <var-decl name='lock' type-id='type-id-5' visibility='default' filepath='../include/urcu/wfstack.h' line='92' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfs_stack* -->
+    <pointer-type-def type-id='type-id-43' size-in-bits='64' id='type-id-41'/>
+    <!-- typedef __anonymous_union__ cds_wfs_stack_ptr_t -->
+    <typedef-decl name='cds_wfs_stack_ptr_t' type-id='type-id-39' filepath='../include/urcu/wfstack.h' line='103' column='1' id='type-id-44'/>
+    <!-- cds_wfs_head* __cds_wfs_pop_all(cds_wfs_stack_ptr_t) -->
+    <function-decl name='__cds_wfs_pop_all' mangled-name='__cds_wfs_pop_all' filepath='src/wfstack.c' line='126' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_all'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='126' column='1'/>
+      <!-- cds_wfs_head* -->
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_with_state_nonblocking(cds_wfs_stack_ptr_t, int*) -->
+    <function-decl name='__cds_wfs_pop_with_state_nonblocking' mangled-name='__cds_wfs_pop_with_state_nonblocking' filepath='src/wfstack.c' line='120' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_with_state_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='120' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfstack.c' line='121' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_nonblocking(cds_wfs_stack_ptr_t) -->
+    <function-decl name='__cds_wfs_pop_nonblocking' mangled-name='__cds_wfs_pop_nonblocking' filepath='src/wfstack.c' line='114' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='114' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_with_state_blocking(cds_wfs_stack_ptr_t, int*) -->
+    <function-decl name='__cds_wfs_pop_with_state_blocking' mangled-name='__cds_wfs_pop_with_state_blocking' filepath='src/wfstack.c' line='108' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_with_state_blocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='120' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfstack.c' line='121' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_blocking(cds_wfs_stack_ptr_t) -->
+    <function-decl name='__cds_wfs_pop_blocking' mangled-name='__cds_wfs_pop_blocking' filepath='src/wfstack.c' line='102' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_blocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='114' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- void cds_wfs_pop_unlock(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_unlock' mangled-name='cds_wfs_pop_unlock' filepath='src/wfstack.c' line='97' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_unlock'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_pop_lock(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_lock' mangled-name='cds_wfs_pop_lock' filepath='src/wfstack.c' line='92' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_lock'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_next_nonblocking(cds_wfs_node*) -->
+    <function-decl name='cds_wfs_next_nonblocking' mangled-name='cds_wfs_next_nonblocking' filepath='src/wfstack.c' line='87' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_next_nonblocking'>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='87' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_next_blocking(cds_wfs_node*) -->
+    <function-decl name='cds_wfs_next_blocking' mangled-name='cds_wfs_next_blocking' filepath='src/wfstack.c' line='82' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_next_blocking'>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='87' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_first(cds_wfs_head*) -->
+    <function-decl name='cds_wfs_first' mangled-name='cds_wfs_first' filepath='src/wfstack.c' line='77' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_first'>
+      <!-- parameter of type 'cds_wfs_head*' -->
+      <parameter type-id='type-id-38' name='head' filepath='src/wfstack.c' line='77' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_head* cds_wfs_pop_all_blocking(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_all_blocking' mangled-name='cds_wfs_pop_all_blocking' filepath='src/wfstack.c' line='72' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_all_blocking'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='72' column='1'/>
+      <!-- cds_wfs_head* -->
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_pop_with_state_blocking(cds_wfs_stack*, int*) -->
+    <function-decl name='cds_wfs_pop_with_state_blocking' mangled-name='cds_wfs_pop_with_state_blocking' filepath='src/wfstack.c' line='67' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_with_state_blocking'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='67' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfstack.c' line='67' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_pop_blocking(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_blocking' mangled-name='cds_wfs_pop_blocking' filepath='src/wfstack.c' line='61' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_blocking'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='61' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- int cds_wfs_push(cds_wfs_stack_ptr_t, cds_wfs_node*) -->
+    <function-decl name='cds_wfs_push' mangled-name='cds_wfs_push' filepath='src/wfstack.c' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_push'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='56' column='1'/>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='56' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-10'/>
+    </function-decl>
+    <!-- bool cds_wfs_empty(cds_wfs_stack_ptr_t) -->
+    <function-decl name='cds_wfs_empty' mangled-name='cds_wfs_empty' filepath='src/wfstack.c' line='51' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_empty'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='51' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <!-- void __cds_wfs_init(__cds_wfs_stack*) -->
+    <function-decl name='__cds_wfs_init' mangled-name='__cds_wfs_init' filepath='src/wfstack.c' line='46' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_init'>
+      <!-- parameter of type '__cds_wfs_stack*' -->
+      <parameter type-id='type-id-40' name='s' filepath='src/wfstack.c' line='46' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_destroy(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_destroy' mangled-name='cds_wfs_destroy' filepath='src/wfstack.c' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_destroy'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_init(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_init' mangled-name='cds_wfs_init' filepath='src/wfstack.c' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_init'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_node_init(cds_wfs_node*) -->
+    <function-decl name='cds_wfs_node_init' mangled-name='cds_wfs_node_init' filepath='src/wfstack.c' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_node_init'>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='31' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-5' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-45'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-48' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-49' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-50' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-50' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-50' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-49'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-51' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-51'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-11' size-in-bits='64' id='type-id-50'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-17' id='type-id-53'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='384' id='type-id-47'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-17' id='type-id-54'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-48'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-45' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-55'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-55' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-10' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-56'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-56' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-57'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-57' size-in-bits='64' id='type-id-58'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-59'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-60' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-61' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-9' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-60'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-9' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-61'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-59' const='yes' id='type-id-62'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-62' size-in-bits='64' id='type-id-63'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-10' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-63' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-10'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-10' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-63' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-10'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.10/x86_64-pc-linux-gnu/liburcu-mb.so.6.xml b/extras/abi/0.10/x86_64-pc-linux-gnu/liburcu-mb.so.6.xml
new file mode 100644 (file)
index 0000000..3ce07d1
--- /dev/null
@@ -0,0 +1,851 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-mb.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_child_mb -->
+    <elf-symbol name='call_rcu_after_fork_child_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_mb -->
+    <elf-symbol name='call_rcu_after_fork_parent_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_mb -->
+    <elf-symbol name='call_rcu_before_fork_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_data_free_mb -->
+    <elf-symbol name='call_rcu_data_free_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_mb -->
+    <elf-symbol name='call_rcu_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_mb -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_call_rcu_data_mb -->
+    <elf-symbol name='create_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- defer_rcu_mb -->
+    <elf-symbol name='defer_rcu_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data_mb -->
+    <elf-symbol name='free_all_cpu_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_data_mb -->
+    <elf-symbol name='get_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_thread_mb -->
+    <elf-symbol name='get_call_rcu_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_mb -->
+    <elf-symbol name='get_cpu_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_mb -->
+    <elf-symbol name='get_default_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_mb -->
+    <elf-symbol name='get_thread_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_barrier_mb -->
+    <elf-symbol name='rcu_barrier_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_mb -->
+    <elf-symbol name='rcu_defer_barrier_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_mb -->
+    <elf-symbol name='rcu_defer_barrier_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_exit_mb -->
+    <elf-symbol name='rcu_defer_exit_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_mb -->
+    <elf-symbol name='rcu_defer_register_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_mb -->
+    <elf-symbol name='rcu_defer_unregister_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_init_mb -->
+    <elf-symbol name='rcu_init_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_lock_mb -->
+    <elf-symbol name='rcu_read_lock_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_ongoing_mb -->
+    <elf-symbol name='rcu_read_ongoing_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_unlock_mb -->
+    <elf-symbol name='rcu_read_unlock_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_register_thread_mb -->
+    <elf-symbol name='rcu_register_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_unregister_thread_mb -->
+    <elf-symbol name='rcu_unregister_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_mb -->
+    <elf-symbol name='set_cpu_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_mb -->
+    <elf-symbol name='set_thread_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- synchronize_rcu_mb -->
+    <elf-symbol name='synchronize_rcu_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_register_rculfhash_atfork_mb -->
+    <elf-symbol name='urcu_register_rculfhash_atfork_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_unregister_rculfhash_atfork_mb -->
+    <elf-symbol name='urcu_unregister_rculfhash_atfork_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_mb -->
+    <elf-symbol name='rcu_flavor_mb' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_gp_mb -->
+    <elf-symbol name='rcu_gp_mb' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_reader_mb -->
+    <elf-symbol name='rcu_reader_mb' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct rcu_gp_mb -->
+    <class-decl name='rcu_gp_mb' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu.h' line='119' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_gp_mb::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu.h' line='127' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t rcu_gp_mb::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu.h' line='129' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-4' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-3'/>
+    <!-- rcu_gp_mb rcu_gp_mb -->
+    <var-decl name='rcu_gp_mb' type-id='type-id-1' mangled-name='rcu_gp_mb' visibility='default' filepath='../include/urcu/static/urcu.h' line='132' column='1' elf-symbol-id='rcu_gp_mb'/>
+    <!-- struct rcu_reader_mb -->
+    <class-decl name='rcu_reader_mb' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu.h' line='134' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_reader_mb::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu.h' line='136' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char rcu_reader_mb::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu.h' line='137' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head rcu_reader_mb::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu.h' line='139' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t rcu_reader_mb::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu.h' line='140' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int rcu_reader_mb::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu.h' line='142' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='35' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='36' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- rcu_reader_mb rcu_reader_mb -->
+    <var-decl name='rcu_reader_mb' type-id='type-id-6' mangled-name='rcu_reader_mb' visibility='default' filepath='../include/urcu/static/urcu.h' line='145' column='1' elf-symbol-id='rcu_reader_mb'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../src/urcu-flavor.h' line='40' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='42' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../src/urcu-flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../src/urcu-flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../src/urcu-flavor.h' line='48' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='51' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../src/urcu-flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../src/urcu-flavor.h' line='58' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../src/urcu-call-rcu.h' line='59' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../src/urcu-call-rcu.h' line='60' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../src/urcu-call-rcu.h' line='61' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../src/urcu-flavor.h' line='30' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../src/urcu-flavor.h' line='31' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../src/urcu-flavor.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../src/urcu-flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../src/urcu-flavor.h' line='34' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct rcu_flavor_mb -->
+    <var-decl name='rcu_flavor_mb' type-id='type-id-35' mangled-name='rcu_flavor_mb' visibility='default' filepath='../src/urcu-flavor.h' line='79' column='1' elf-symbol-id='rcu_flavor_mb'/>
+    <!-- void rcu_defer_exit_mb() -->
+    <function-decl name='rcu_defer_exit_mb' mangled-name='rcu_defer_exit_mb' filepath='src/urcu-defer-impl.h' line='466' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_exit_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_defer_unregister_thread_mb() -->
+    <function-decl name='rcu_defer_unregister_thread_mb' mangled-name='rcu_defer_unregister_thread_mb' filepath='src/urcu-defer-impl.h' line='448' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_unregister_thread_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int rcu_defer_register_thread_mb() -->
+    <function-decl name='rcu_defer_register_thread_mb' mangled-name='rcu_defer_register_thread_mb' filepath='src/urcu-defer-impl.h' line='426' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_register_thread_mb'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void defer_rcu_mb(void (void*)*, void*) -->
+    <function-decl name='defer_rcu_mb' mangled-name='defer_rcu_mb' filepath='src/urcu-defer-impl.h' line='395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_mb'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='395' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='395' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_mb() -->
+    <function-decl name='rcu_defer_barrier_mb' mangled-name='rcu_defer_barrier_mb' filepath='src/urcu-defer-impl.h' line='281' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_thread_mb() -->
+    <function-decl name='rcu_defer_barrier_thread_mb' mangled-name='rcu_defer_barrier_thread_mb' filepath='src/urcu-defer-impl.h' line='261' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_unregister_rculfhash_atfork_mb(urcu_atfork*) -->
+    <function-decl name='urcu_unregister_rculfhash_atfork_mb' mangled-name='urcu_unregister_rculfhash_atfork_mb' filepath='src/urcu-call-rcu-impl.h' line='1011' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_unregister_rculfhash_atfork_mb'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1011' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_register_rculfhash_atfork_mb(urcu_atfork*) -->
+    <function-decl name='urcu_register_rculfhash_atfork_mb' mangled-name='urcu_register_rculfhash_atfork_mb' filepath='src/urcu-call-rcu-impl.h' line='1001' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_register_rculfhash_atfork_mb'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1011' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_child_mb() -->
+    <function-decl name='call_rcu_after_fork_child_mb' mangled-name='call_rcu_after_fork_child_mb' filepath='src/urcu-call-rcu-impl.h' line='959' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_parent_mb() -->
+    <function-decl name='call_rcu_after_fork_parent_mb' mangled-name='call_rcu_after_fork_parent_mb' filepath='src/urcu-call-rcu-impl.h' line='937' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_parent_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void call_rcu_before_fork_mb() -->
+    <function-decl name='call_rcu_before_fork_mb' mangled-name='call_rcu_before_fork_mb' filepath='src/urcu-call-rcu-impl.h' line='910' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_before_fork_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_barrier_mb() -->
+    <function-decl name='rcu_barrier_mb' mangled-name='rcu_barrier_mb' filepath='src/urcu-call-rcu-impl.h' line='839' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_barrier_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void free_all_cpu_call_rcu_data_mb() -->
+    <function-decl name='free_all_cpu_call_rcu_data_mb' mangled-name='free_all_cpu_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='776' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_all_cpu_call_rcu_data_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='52' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='60' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-2' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void call_rcu_data_free_mb(call_rcu_data*) -->
+    <function-decl name='call_rcu_data_free_mb' mangled-name='call_rcu_data_free_mb' filepath='src/urcu-call-rcu-impl.h' line='744' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_data_free_mb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='744' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void call_rcu_mb(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='call_rcu_mb' mangled-name='call_rcu_mb' filepath='src/urcu-call-rcu-impl.h' line='706' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_mb'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='706' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='707' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int create_all_cpu_call_rcu_data_mb(unsigned long int) -->
+    <function-decl name='create_all_cpu_call_rcu_data_mb' mangled-name='create_all_cpu_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='628' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_mb'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='628' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void set_thread_call_rcu_data_mb(call_rcu_data*) -->
+    <function-decl name='set_thread_call_rcu_data_mb' mangled-name='set_thread_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='615' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_thread_call_rcu_data_mb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='615' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* get_thread_call_rcu_data_mb() -->
+    <function-decl name='get_thread_call_rcu_data_mb' mangled-name='get_thread_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='599' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_thread_call_rcu_data_mb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* get_call_rcu_data_mb() -->
+    <function-decl name='get_call_rcu_data_mb' mangled-name='get_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='579' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_data_mb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* get_default_call_rcu_data_mb() -->
+    <function-decl name='get_default_call_rcu_data_mb' mangled-name='get_default_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='554' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_default_call_rcu_data_mb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int set_cpu_call_rcu_data_mb(int, call_rcu_data*) -->
+    <function-decl name='set_cpu_call_rcu_data_mb' mangled-name='set_cpu_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='515' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_cpu_call_rcu_data_mb'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='515' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='515' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- call_rcu_data* create_call_rcu_data_mb(unsigned long int, int) -->
+    <function-decl name='create_call_rcu_data_mb' mangled-name='create_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='491' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_call_rcu_data_mb'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='491' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='492' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t get_call_rcu_thread_mb(call_rcu_data*) -->
+    <function-decl name='get_call_rcu_thread_mb' mangled-name='get_call_rcu_thread_mb' filepath='src/urcu-call-rcu-impl.h' line='473' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_thread_mb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='473' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* get_cpu_call_rcu_data_mb(int) -->
+    <function-decl name='get_cpu_call_rcu_data_mb' mangled-name='get_cpu_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='451' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_mb'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='451' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void rcu_unregister_thread_mb() -->
+    <function-decl name='rcu_unregister_thread_mb' mangled-name='rcu_unregister_thread_mb' filepath='src/urcu.c' line='527' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_unregister_thread_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_register_thread_mb() -->
+    <function-decl name='rcu_register_thread_mb' mangled-name='rcu_register_thread_mb' filepath='src/urcu.c' line='513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_register_thread_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int rcu_read_ongoing_mb() -->
+    <function-decl name='rcu_read_ongoing_mb' mangled-name='rcu_read_ongoing_mb' filepath='src/urcu.c' line='508' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_ongoing_mb'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void rcu_read_unlock_mb() -->
+    <function-decl name='rcu_read_unlock_mb' mangled-name='rcu_read_unlock_mb' filepath='src/urcu.c' line='503' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_unlock_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_read_lock_mb() -->
+    <function-decl name='rcu_read_lock_mb' mangled-name='rcu_read_lock_mb' filepath='src/urcu.c' line='498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_lock_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void synchronize_rcu_mb() -->
+    <function-decl name='synchronize_rcu_mb' mangled-name='synchronize_rcu_mb' filepath='src/urcu.c' line='377' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='synchronize_rcu_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_init_mb() -->
+    <function-decl name='rcu_init_mb' mangled-name='rcu_init_mb' filepath='src/urcu.c' line='88' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_init_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-2' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-2' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.10/x86_64-pc-linux-gnu/liburcu-qsbr.so.6.xml b/extras/abi/0.10/x86_64-pc-linux-gnu/liburcu-qsbr.so.6.xml
new file mode 100644 (file)
index 0000000..c1ee196
--- /dev/null
@@ -0,0 +1,872 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-qsbr.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_child_qsbr -->
+    <elf-symbol name='call_rcu_after_fork_child_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_qsbr -->
+    <elf-symbol name='call_rcu_after_fork_parent_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_qsbr -->
+    <elf-symbol name='call_rcu_before_fork_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_data_free_qsbr -->
+    <elf-symbol name='call_rcu_data_free_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_qsbr -->
+    <elf-symbol name='call_rcu_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_qsbr -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_call_rcu_data_qsbr -->
+    <elf-symbol name='create_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- defer_rcu_qsbr -->
+    <elf-symbol name='defer_rcu_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data -->
+    <elf-symbol name='free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_data_qsbr -->
+    <elf-symbol name='get_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_thread_qsbr -->
+    <elf-symbol name='get_call_rcu_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_qsbr -->
+    <elf-symbol name='get_cpu_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_qsbr -->
+    <elf-symbol name='get_default_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_qsbr -->
+    <elf-symbol name='get_thread_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_barrier_qsbr -->
+    <elf-symbol name='rcu_barrier_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_qsbr -->
+    <elf-symbol name='rcu_defer_barrier_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_qsbr -->
+    <elf-symbol name='rcu_defer_barrier_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_exit_qsbr -->
+    <elf-symbol name='rcu_defer_exit_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_qsbr -->
+    <elf-symbol name='rcu_defer_register_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_qsbr -->
+    <elf-symbol name='rcu_defer_unregister_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_exit_qsbr -->
+    <elf-symbol name='rcu_exit_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_quiescent_state_qsbr -->
+    <elf-symbol name='rcu_quiescent_state_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_lock_qsbr -->
+    <elf-symbol name='rcu_read_lock_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_ongoing_qsbr -->
+    <elf-symbol name='rcu_read_ongoing_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_unlock_qsbr -->
+    <elf-symbol name='rcu_read_unlock_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_register_thread_qsbr -->
+    <elf-symbol name='rcu_register_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_thread_offline_qsbr -->
+    <elf-symbol name='rcu_thread_offline_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_thread_online_qsbr -->
+    <elf-symbol name='rcu_thread_online_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_unregister_thread_qsbr -->
+    <elf-symbol name='rcu_unregister_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_qsbr -->
+    <elf-symbol name='set_cpu_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_qsbr -->
+    <elf-symbol name='set_thread_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- synchronize_rcu_qsbr -->
+    <elf-symbol name='synchronize_rcu_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_register_rculfhash_atfork_qsbr -->
+    <elf-symbol name='urcu_register_rculfhash_atfork_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_unregister_rculfhash_atfork_qsbr -->
+    <elf-symbol name='urcu_unregister_rculfhash_atfork_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_qsbr -->
+    <elf-symbol name='rcu_flavor_qsbr' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_gp_qsbr -->
+    <elf-symbol name='rcu_gp_qsbr' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_reader_qsbr -->
+    <elf-symbol name='rcu_reader_qsbr' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu-qsbr.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct rcu_gp_qsbr -->
+    <class-decl name='rcu_gp_qsbr' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='68' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_gp_qsbr::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t rcu_gp_qsbr::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='76' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-4' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-3'/>
+    <!-- rcu_gp_qsbr rcu_gp_qsbr -->
+    <var-decl name='rcu_gp_qsbr' type-id='type-id-1' mangled-name='rcu_gp_qsbr' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='79' column='1' elf-symbol-id='rcu_gp_qsbr'/>
+    <!-- struct rcu_reader_qsbr -->
+    <class-decl name='rcu_reader_qsbr' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='81' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_reader_qsbr::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='83' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head rcu_reader_qsbr::node -->
+        <var-decl name='node' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- int rcu_reader_qsbr::waiting -->
+        <var-decl name='waiting' type-id='type-id-4' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1216'>
+        <!-- pthread_t rcu_reader_qsbr::tid -->
+        <var-decl name='tid' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='87' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int rcu_reader_qsbr::registered -->
+        <var-decl name='registered' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='89' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='35' column='1' id='type-id-7'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-10' visibility='default' filepath='../include/urcu/list.h' line='36' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-10' visibility='default' filepath='../include/urcu/list.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-7' size-in-bits='64' id='type-id-10'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-8'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-9'/>
+    <!-- rcu_reader_qsbr rcu_reader_qsbr -->
+    <var-decl name='rcu_reader_qsbr' type-id='type-id-6' mangled-name='rcu_reader_qsbr' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='92' column='1' elf-symbol-id='rcu_reader_qsbr'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../src/urcu-flavor.h' line='40' column='1' id='type-id-11'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-12' visibility='default' filepath='../src/urcu-flavor.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-12' visibility='default' filepath='../src/urcu-flavor.h' line='42' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-12' visibility='default' filepath='../src/urcu-flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-14' visibility='default' filepath='../src/urcu-flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-12' visibility='default' filepath='../src/urcu-flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-15' visibility='default' filepath='../src/urcu-flavor.h' line='48' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-12' visibility='default' filepath='../src/urcu-flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-12' visibility='default' filepath='../src/urcu-flavor.h' line='51' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-12' visibility='default' filepath='../src/urcu-flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-12' visibility='default' filepath='../src/urcu-flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-12' visibility='default' filepath='../src/urcu-flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-16' visibility='default' filepath='../src/urcu-flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-16' visibility='default' filepath='../src/urcu-flavor.h' line='58' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-17'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-12'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../src/urcu-call-rcu.h' line='59' column='1' id='type-id-20'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-21' visibility='default' filepath='../src/urcu-call-rcu.h' line='60' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-22' visibility='default' filepath='../src/urcu-call-rcu.h' line='61' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-23' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-23'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-24'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-25' size-in-bits='64' id='type-id-22'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-14'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-27'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-29'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-30' size-in-bits='64' id='type-id-15'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../src/urcu-flavor.h' line='30' column='1' id='type-id-31'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-29' visibility='default' filepath='../src/urcu-flavor.h' line='31' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-29' visibility='default' filepath='../src/urcu-flavor.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-29' visibility='default' filepath='../src/urcu-flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-27' visibility='default' filepath='../src/urcu-flavor.h' line='34' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-32'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-16'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-11' const='yes' id='type-id-34'/>
+    <!-- const rcu_flavor_struct rcu_flavor_qsbr -->
+    <var-decl name='rcu_flavor_qsbr' type-id='type-id-34' mangled-name='rcu_flavor_qsbr' visibility='default' filepath='../src/urcu-flavor.h' line='79' column='1' elf-symbol-id='rcu_flavor_qsbr'/>
+    <!-- void rcu_defer_exit_qsbr() -->
+    <function-decl name='rcu_defer_exit_qsbr' mangled-name='rcu_defer_exit_qsbr' filepath='src/urcu-defer-impl.h' line='466' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_exit_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void rcu_defer_unregister_thread_qsbr() -->
+    <function-decl name='rcu_defer_unregister_thread_qsbr' mangled-name='rcu_defer_unregister_thread_qsbr' filepath='src/urcu-defer-impl.h' line='448' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_unregister_thread_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int rcu_defer_register_thread_qsbr() -->
+    <function-decl name='rcu_defer_register_thread_qsbr' mangled-name='rcu_defer_register_thread_qsbr' filepath='src/urcu-defer-impl.h' line='426' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_register_thread_qsbr'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void defer_rcu_qsbr(void (void*)*, void*) -->
+    <function-decl name='defer_rcu_qsbr' mangled-name='defer_rcu_qsbr' filepath='src/urcu-defer-impl.h' line='395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_qsbr'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-29' name='fct' filepath='src/urcu-defer-impl.h' line='395' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='p' filepath='src/urcu-defer-impl.h' line='395' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_qsbr() -->
+    <function-decl name='rcu_defer_barrier_qsbr' mangled-name='rcu_defer_barrier_qsbr' filepath='src/urcu-defer-impl.h' line='281' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_thread_qsbr() -->
+    <function-decl name='rcu_defer_barrier_thread_qsbr' mangled-name='rcu_defer_barrier_thread_qsbr' filepath='src/urcu-defer-impl.h' line='261' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_unregister_rculfhash_atfork_qsbr(urcu_atfork*) -->
+    <function-decl name='urcu_unregister_rculfhash_atfork_qsbr' mangled-name='urcu_unregister_rculfhash_atfork_qsbr' filepath='src/urcu-call-rcu-impl.h' line='1011' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_unregister_rculfhash_atfork_qsbr'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-32' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1011' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_register_rculfhash_atfork_qsbr(urcu_atfork*) -->
+    <function-decl name='urcu_register_rculfhash_atfork_qsbr' mangled-name='urcu_register_rculfhash_atfork_qsbr' filepath='src/urcu-call-rcu-impl.h' line='1001' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_register_rculfhash_atfork_qsbr'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-32' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1011' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_child_qsbr() -->
+    <function-decl name='call_rcu_after_fork_child_qsbr' mangled-name='call_rcu_after_fork_child_qsbr' filepath='src/urcu-call-rcu-impl.h' line='959' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_parent_qsbr() -->
+    <function-decl name='call_rcu_after_fork_parent_qsbr' mangled-name='call_rcu_after_fork_parent_qsbr' filepath='src/urcu-call-rcu-impl.h' line='937' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_parent_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void call_rcu_before_fork_qsbr() -->
+    <function-decl name='call_rcu_before_fork_qsbr' mangled-name='call_rcu_before_fork_qsbr' filepath='src/urcu-call-rcu-impl.h' line='910' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_before_fork_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void rcu_barrier_qsbr() -->
+    <function-decl name='rcu_barrier_qsbr' mangled-name='rcu_barrier_qsbr' filepath='src/urcu-call-rcu-impl.h' line='839' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_barrier_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void free_all_cpu_call_rcu_data() -->
+    <function-decl name='free_all_cpu_call_rcu_data' mangled-name='free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='776' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='52' column='1' id='type-id-35'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-36' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='60' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-7' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-23' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-38' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-39'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-40' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-40'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-43'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-45'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-46'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-45' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-44'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-47'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='320' id='type-id-41'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-2' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-42'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-39' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-38'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-35' size-in-bits='64' id='type-id-49'/>
+    <!-- void call_rcu_data_free_qsbr(call_rcu_data*) -->
+    <function-decl name='call_rcu_data_free_qsbr' mangled-name='call_rcu_data_free_qsbr' filepath='src/urcu-call-rcu-impl.h' line='744' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_data_free_qsbr'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='744' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void call_rcu_qsbr(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='call_rcu_qsbr' mangled-name='call_rcu_qsbr' filepath='src/urcu-call-rcu-impl.h' line='706' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_qsbr'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-24' name='head' filepath='src/urcu-call-rcu-impl.h' line='706' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-22' name='func' filepath='src/urcu-call-rcu-impl.h' line='707' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int create_all_cpu_call_rcu_data_qsbr(unsigned long int) -->
+    <function-decl name='create_all_cpu_call_rcu_data_qsbr' mangled-name='create_all_cpu_call_rcu_data_qsbr' filepath='src/urcu-call-rcu-impl.h' line='628' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_qsbr'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='628' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void set_thread_call_rcu_data_qsbr(call_rcu_data*) -->
+    <function-decl name='set_thread_call_rcu_data_qsbr' mangled-name='set_thread_call_rcu_data_qsbr' filepath='src/urcu-call-rcu-impl.h' line='615' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_thread_call_rcu_data_qsbr'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='615' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- call_rcu_data* get_thread_call_rcu_data_qsbr() -->
+    <function-decl name='get_thread_call_rcu_data_qsbr' mangled-name='get_thread_call_rcu_data_qsbr' filepath='src/urcu-call-rcu-impl.h' line='599' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_thread_call_rcu_data_qsbr'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* get_call_rcu_data_qsbr() -->
+    <function-decl name='get_call_rcu_data_qsbr' mangled-name='get_call_rcu_data_qsbr' filepath='src/urcu-call-rcu-impl.h' line='579' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_data_qsbr'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* get_default_call_rcu_data_qsbr() -->
+    <function-decl name='get_default_call_rcu_data_qsbr' mangled-name='get_default_call_rcu_data_qsbr' filepath='src/urcu-call-rcu-impl.h' line='554' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_default_call_rcu_data_qsbr'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int set_cpu_call_rcu_data_qsbr(int, call_rcu_data*) -->
+    <function-decl name='set_cpu_call_rcu_data_qsbr' mangled-name='set_cpu_call_rcu_data_qsbr' filepath='src/urcu-call-rcu-impl.h' line='515' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_cpu_call_rcu_data_qsbr'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='515' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='515' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- call_rcu_data* create_call_rcu_data_qsbr(unsigned long int, int) -->
+    <function-decl name='create_call_rcu_data_qsbr' mangled-name='create_call_rcu_data_qsbr' filepath='src/urcu-call-rcu-impl.h' line='491' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_call_rcu_data_qsbr'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='491' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='492' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t get_call_rcu_thread_qsbr(call_rcu_data*) -->
+    <function-decl name='get_call_rcu_thread_qsbr' mangled-name='get_call_rcu_thread_qsbr' filepath='src/urcu-call-rcu-impl.h' line='473' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_thread_qsbr'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='473' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-8'/>
+    </function-decl>
+    <!-- call_rcu_data* get_cpu_call_rcu_data_qsbr(int) -->
+    <function-decl name='get_cpu_call_rcu_data_qsbr' mangled-name='get_cpu_call_rcu_data_qsbr' filepath='src/urcu-call-rcu-impl.h' line='451' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_qsbr'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='451' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void rcu_exit_qsbr() -->
+    <function-decl name='rcu_exit_qsbr' mangled-name='rcu_exit_qsbr' filepath='src/urcu-qsbr.c' line='491' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_exit_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void rcu_unregister_thread_qsbr() -->
+    <function-decl name='rcu_unregister_thread_qsbr' mangled-name='rcu_unregister_thread_qsbr' filepath='src/urcu-qsbr.c' line='477' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_unregister_thread_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void rcu_register_thread_qsbr() -->
+    <function-decl name='rcu_register_thread_qsbr' mangled-name='rcu_register_thread_qsbr' filepath='src/urcu-qsbr.c' line='464' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_register_thread_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void rcu_thread_online_qsbr() -->
+    <function-decl name='rcu_thread_online_qsbr' mangled-name='rcu_thread_online_qsbr' filepath='src/urcu-qsbr.c' line='459' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_thread_online_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void rcu_thread_offline_qsbr() -->
+    <function-decl name='rcu_thread_offline_qsbr' mangled-name='rcu_thread_offline_qsbr' filepath='src/urcu-qsbr.c' line='454' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_thread_offline_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void rcu_quiescent_state_qsbr() -->
+    <function-decl name='rcu_quiescent_state_qsbr' mangled-name='rcu_quiescent_state_qsbr' filepath='src/urcu-qsbr.c' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_quiescent_state_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int rcu_read_ongoing_qsbr() -->
+    <function-decl name='rcu_read_ongoing_qsbr' mangled-name='rcu_read_ongoing_qsbr' filepath='src/urcu-qsbr.c' line='444' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_ongoing_qsbr'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void rcu_read_unlock_qsbr() -->
+    <function-decl name='rcu_read_unlock_qsbr' mangled-name='rcu_read_unlock_qsbr' filepath='src/urcu-qsbr.c' line='439' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_unlock_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void rcu_read_lock_qsbr() -->
+    <function-decl name='rcu_read_lock_qsbr' mangled-name='rcu_read_lock_qsbr' filepath='src/urcu-qsbr.c' line='434' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_lock_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void synchronize_rcu_qsbr() -->
+    <function-decl name='synchronize_rcu_qsbr' mangled-name='synchronize_rcu_qsbr' filepath='src/urcu-qsbr.c' line='344' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='synchronize_rcu_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-18'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-25'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-24'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-24'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-22'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-33'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-32'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-30'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-29'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-28'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-38' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-9' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-2' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-2' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-42' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-42' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.10/x86_64-pc-linux-gnu/liburcu-signal.so.6.xml b/extras/abi/0.10/x86_64-pc-linux-gnu/liburcu-signal.so.6.xml
new file mode 100644 (file)
index 0000000..4f9ffcc
--- /dev/null
@@ -0,0 +1,858 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-signal.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_child_sig -->
+    <elf-symbol name='call_rcu_after_fork_child_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_sig -->
+    <elf-symbol name='call_rcu_after_fork_parent_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_sig -->
+    <elf-symbol name='call_rcu_before_fork_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_data_free_sig -->
+    <elf-symbol name='call_rcu_data_free_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_sig -->
+    <elf-symbol name='call_rcu_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_sig -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_call_rcu_data_sig -->
+    <elf-symbol name='create_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- defer_rcu_sig -->
+    <elf-symbol name='defer_rcu_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data_sig -->
+    <elf-symbol name='free_all_cpu_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_data_sig -->
+    <elf-symbol name='get_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_thread_sig -->
+    <elf-symbol name='get_call_rcu_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_sig -->
+    <elf-symbol name='get_cpu_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_sig -->
+    <elf-symbol name='get_default_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_sig -->
+    <elf-symbol name='get_thread_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_barrier_sig -->
+    <elf-symbol name='rcu_barrier_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_sig -->
+    <elf-symbol name='rcu_defer_barrier_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_sig -->
+    <elf-symbol name='rcu_defer_barrier_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_exit_sig -->
+    <elf-symbol name='rcu_defer_exit_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_sig -->
+    <elf-symbol name='rcu_defer_register_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_sig -->
+    <elf-symbol name='rcu_defer_unregister_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_exit_sig -->
+    <elf-symbol name='rcu_exit_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_init_sig -->
+    <elf-symbol name='rcu_init_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_lock_sig -->
+    <elf-symbol name='rcu_read_lock_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_ongoing_sig -->
+    <elf-symbol name='rcu_read_ongoing_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_unlock_sig -->
+    <elf-symbol name='rcu_read_unlock_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_register_thread_sig -->
+    <elf-symbol name='rcu_register_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_unregister_thread_sig -->
+    <elf-symbol name='rcu_unregister_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_sig -->
+    <elf-symbol name='set_cpu_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_sig -->
+    <elf-symbol name='set_thread_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- synchronize_rcu_sig -->
+    <elf-symbol name='synchronize_rcu_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_register_rculfhash_atfork_sig -->
+    <elf-symbol name='urcu_register_rculfhash_atfork_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_unregister_rculfhash_atfork_sig -->
+    <elf-symbol name='urcu_unregister_rculfhash_atfork_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_sig -->
+    <elf-symbol name='rcu_flavor_sig' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_gp_sig -->
+    <elf-symbol name='rcu_gp_sig' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_reader_sig -->
+    <elf-symbol name='rcu_reader_sig' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct rcu_gp_sig -->
+    <class-decl name='rcu_gp_sig' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu.h' line='119' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_gp_sig::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu.h' line='127' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t rcu_gp_sig::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu.h' line='129' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-4' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-3'/>
+    <!-- rcu_gp_sig rcu_gp_sig -->
+    <var-decl name='rcu_gp_sig' type-id='type-id-1' mangled-name='rcu_gp_sig' visibility='default' filepath='../include/urcu/static/urcu.h' line='132' column='1' elf-symbol-id='rcu_gp_sig'/>
+    <!-- struct rcu_reader_sig -->
+    <class-decl name='rcu_reader_sig' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu.h' line='134' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_reader_sig::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu.h' line='136' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char rcu_reader_sig::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu.h' line='137' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head rcu_reader_sig::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu.h' line='139' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t rcu_reader_sig::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu.h' line='140' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int rcu_reader_sig::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu.h' line='142' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='35' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='36' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- rcu_reader_sig rcu_reader_sig -->
+    <var-decl name='rcu_reader_sig' type-id='type-id-6' mangled-name='rcu_reader_sig' visibility='default' filepath='../include/urcu/static/urcu.h' line='145' column='1' elf-symbol-id='rcu_reader_sig'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../src/urcu-flavor.h' line='40' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='42' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../src/urcu-flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../src/urcu-flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../src/urcu-flavor.h' line='48' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='51' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../src/urcu-flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../src/urcu-flavor.h' line='58' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../src/urcu-call-rcu.h' line='59' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../src/urcu-call-rcu.h' line='60' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../src/urcu-call-rcu.h' line='61' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../src/urcu-flavor.h' line='30' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../src/urcu-flavor.h' line='31' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../src/urcu-flavor.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../src/urcu-flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../src/urcu-flavor.h' line='34' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct rcu_flavor_sig -->
+    <var-decl name='rcu_flavor_sig' type-id='type-id-35' mangled-name='rcu_flavor_sig' visibility='default' filepath='../src/urcu-flavor.h' line='79' column='1' elf-symbol-id='rcu_flavor_sig'/>
+    <!-- void rcu_defer_exit_sig() -->
+    <function-decl name='rcu_defer_exit_sig' mangled-name='rcu_defer_exit_sig' filepath='src/urcu-defer-impl.h' line='466' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_exit_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_defer_unregister_thread_sig() -->
+    <function-decl name='rcu_defer_unregister_thread_sig' mangled-name='rcu_defer_unregister_thread_sig' filepath='src/urcu-defer-impl.h' line='448' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_unregister_thread_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int rcu_defer_register_thread_sig() -->
+    <function-decl name='rcu_defer_register_thread_sig' mangled-name='rcu_defer_register_thread_sig' filepath='src/urcu-defer-impl.h' line='426' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_register_thread_sig'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void defer_rcu_sig(void (void*)*, void*) -->
+    <function-decl name='defer_rcu_sig' mangled-name='defer_rcu_sig' filepath='src/urcu-defer-impl.h' line='395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_sig'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='395' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='395' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_sig() -->
+    <function-decl name='rcu_defer_barrier_sig' mangled-name='rcu_defer_barrier_sig' filepath='src/urcu-defer-impl.h' line='281' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_thread_sig() -->
+    <function-decl name='rcu_defer_barrier_thread_sig' mangled-name='rcu_defer_barrier_thread_sig' filepath='src/urcu-defer-impl.h' line='261' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_unregister_rculfhash_atfork_sig(urcu_atfork*) -->
+    <function-decl name='urcu_unregister_rculfhash_atfork_sig' mangled-name='urcu_unregister_rculfhash_atfork_sig' filepath='src/urcu-call-rcu-impl.h' line='1011' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_unregister_rculfhash_atfork_sig'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1011' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_register_rculfhash_atfork_sig(urcu_atfork*) -->
+    <function-decl name='urcu_register_rculfhash_atfork_sig' mangled-name='urcu_register_rculfhash_atfork_sig' filepath='src/urcu-call-rcu-impl.h' line='1001' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_register_rculfhash_atfork_sig'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1011' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_child_sig() -->
+    <function-decl name='call_rcu_after_fork_child_sig' mangled-name='call_rcu_after_fork_child_sig' filepath='src/urcu-call-rcu-impl.h' line='959' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_parent_sig() -->
+    <function-decl name='call_rcu_after_fork_parent_sig' mangled-name='call_rcu_after_fork_parent_sig' filepath='src/urcu-call-rcu-impl.h' line='937' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_parent_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void call_rcu_before_fork_sig() -->
+    <function-decl name='call_rcu_before_fork_sig' mangled-name='call_rcu_before_fork_sig' filepath='src/urcu-call-rcu-impl.h' line='910' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_before_fork_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_barrier_sig() -->
+    <function-decl name='rcu_barrier_sig' mangled-name='rcu_barrier_sig' filepath='src/urcu-call-rcu-impl.h' line='839' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_barrier_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void free_all_cpu_call_rcu_data_sig() -->
+    <function-decl name='free_all_cpu_call_rcu_data_sig' mangled-name='free_all_cpu_call_rcu_data_sig' filepath='src/urcu-call-rcu-impl.h' line='776' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_all_cpu_call_rcu_data_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='52' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='60' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-2' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void call_rcu_data_free_sig(call_rcu_data*) -->
+    <function-decl name='call_rcu_data_free_sig' mangled-name='call_rcu_data_free_sig' filepath='src/urcu-call-rcu-impl.h' line='744' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_data_free_sig'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='744' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void call_rcu_sig(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='call_rcu_sig' mangled-name='call_rcu_sig' filepath='src/urcu-call-rcu-impl.h' line='706' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_sig'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='706' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='707' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int create_all_cpu_call_rcu_data_sig(unsigned long int) -->
+    <function-decl name='create_all_cpu_call_rcu_data_sig' mangled-name='create_all_cpu_call_rcu_data_sig' filepath='src/urcu-call-rcu-impl.h' line='628' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_sig'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='628' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void set_thread_call_rcu_data_sig(call_rcu_data*) -->
+    <function-decl name='set_thread_call_rcu_data_sig' mangled-name='set_thread_call_rcu_data_sig' filepath='src/urcu-call-rcu-impl.h' line='615' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_thread_call_rcu_data_sig'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='615' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* get_thread_call_rcu_data_sig() -->
+    <function-decl name='get_thread_call_rcu_data_sig' mangled-name='get_thread_call_rcu_data_sig' filepath='src/urcu-call-rcu-impl.h' line='599' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_thread_call_rcu_data_sig'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* get_call_rcu_data_sig() -->
+    <function-decl name='get_call_rcu_data_sig' mangled-name='get_call_rcu_data_sig' filepath='src/urcu-call-rcu-impl.h' line='579' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_data_sig'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* get_default_call_rcu_data_sig() -->
+    <function-decl name='get_default_call_rcu_data_sig' mangled-name='get_default_call_rcu_data_sig' filepath='src/urcu-call-rcu-impl.h' line='554' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_default_call_rcu_data_sig'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int set_cpu_call_rcu_data_sig(int, call_rcu_data*) -->
+    <function-decl name='set_cpu_call_rcu_data_sig' mangled-name='set_cpu_call_rcu_data_sig' filepath='src/urcu-call-rcu-impl.h' line='515' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_cpu_call_rcu_data_sig'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='515' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='515' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- call_rcu_data* create_call_rcu_data_sig(unsigned long int, int) -->
+    <function-decl name='create_call_rcu_data_sig' mangled-name='create_call_rcu_data_sig' filepath='src/urcu-call-rcu-impl.h' line='491' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_call_rcu_data_sig'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='491' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='492' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t get_call_rcu_thread_sig(call_rcu_data*) -->
+    <function-decl name='get_call_rcu_thread_sig' mangled-name='get_call_rcu_thread_sig' filepath='src/urcu-call-rcu-impl.h' line='473' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_thread_sig'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='473' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* get_cpu_call_rcu_data_sig(int) -->
+    <function-decl name='get_cpu_call_rcu_data_sig' mangled-name='get_cpu_call_rcu_data_sig' filepath='src/urcu-call-rcu-impl.h' line='451' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_sig'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='451' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void rcu_exit_sig() -->
+    <function-decl name='rcu_exit_sig' mangled-name='rcu_exit_sig' filepath='src/urcu.c' line='604' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_exit_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_init_sig() -->
+    <function-decl name='rcu_init_sig' mangled-name='rcu_init_sig' filepath='src/urcu.c' line='587' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_init_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_unregister_thread_sig() -->
+    <function-decl name='rcu_unregister_thread_sig' mangled-name='rcu_unregister_thread_sig' filepath='src/urcu.c' line='527' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_unregister_thread_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_register_thread_sig() -->
+    <function-decl name='rcu_register_thread_sig' mangled-name='rcu_register_thread_sig' filepath='src/urcu.c' line='513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_register_thread_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int rcu_read_ongoing_sig() -->
+    <function-decl name='rcu_read_ongoing_sig' mangled-name='rcu_read_ongoing_sig' filepath='src/urcu.c' line='508' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_ongoing_sig'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void rcu_read_unlock_sig() -->
+    <function-decl name='rcu_read_unlock_sig' mangled-name='rcu_read_unlock_sig' filepath='src/urcu.c' line='503' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_unlock_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_read_lock_sig() -->
+    <function-decl name='rcu_read_lock_sig' mangled-name='rcu_read_lock_sig' filepath='src/urcu.c' line='498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_lock_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void synchronize_rcu_sig() -->
+    <function-decl name='synchronize_rcu_sig' mangled-name='synchronize_rcu_sig' filepath='src/urcu.c' line='377' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='synchronize_rcu_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-2' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-2' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.10/x86_64-pc-linux-gnu/liburcu.so.6.xml b/extras/abi/0.10/x86_64-pc-linux-gnu/liburcu.so.6.xml
new file mode 100644 (file)
index 0000000..566ccbf
--- /dev/null
@@ -0,0 +1,855 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_child_memb -->
+    <elf-symbol name='call_rcu_after_fork_child_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_memb -->
+    <elf-symbol name='call_rcu_after_fork_parent_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_memb -->
+    <elf-symbol name='call_rcu_before_fork_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_data_free_memb -->
+    <elf-symbol name='call_rcu_data_free_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_memb -->
+    <elf-symbol name='call_rcu_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_memb -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_call_rcu_data_memb -->
+    <elf-symbol name='create_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- defer_rcu_memb -->
+    <elf-symbol name='defer_rcu_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data_memb -->
+    <elf-symbol name='free_all_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_data_memb -->
+    <elf-symbol name='get_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_thread_memb -->
+    <elf-symbol name='get_call_rcu_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_memb -->
+    <elf-symbol name='get_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_memb -->
+    <elf-symbol name='get_default_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_memb -->
+    <elf-symbol name='get_thread_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_barrier_memb -->
+    <elf-symbol name='rcu_barrier_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_memb -->
+    <elf-symbol name='rcu_defer_barrier_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_memb -->
+    <elf-symbol name='rcu_defer_barrier_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_exit_memb -->
+    <elf-symbol name='rcu_defer_exit_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_memb -->
+    <elf-symbol name='rcu_defer_register_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_memb -->
+    <elf-symbol name='rcu_defer_unregister_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_init_memb -->
+    <elf-symbol name='rcu_init_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_lock_memb -->
+    <elf-symbol name='rcu_read_lock_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_ongoing_memb -->
+    <elf-symbol name='rcu_read_ongoing_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_unlock_memb -->
+    <elf-symbol name='rcu_read_unlock_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_register_thread_memb -->
+    <elf-symbol name='rcu_register_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_unregister_thread_memb -->
+    <elf-symbol name='rcu_unregister_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_memb -->
+    <elf-symbol name='set_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_memb -->
+    <elf-symbol name='set_thread_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- synchronize_rcu_memb -->
+    <elf-symbol name='synchronize_rcu_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_register_rculfhash_atfork_memb -->
+    <elf-symbol name='urcu_register_rculfhash_atfork_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_unregister_rculfhash_atfork_memb -->
+    <elf-symbol name='urcu_unregister_rculfhash_atfork_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_memb -->
+    <elf-symbol name='rcu_flavor_memb' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_gp_memb -->
+    <elf-symbol name='rcu_gp_memb' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_has_sys_membarrier_memb -->
+    <elf-symbol name='rcu_has_sys_membarrier_memb' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_reader_memb -->
+    <elf-symbol name='rcu_reader_memb' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <!-- int rcu_has_sys_membarrier_memb -->
+    <var-decl name='rcu_has_sys_membarrier_memb' type-id='type-id-1' mangled-name='rcu_has_sys_membarrier_memb' visibility='default' filepath='../include/urcu/static/urcu.h' line='84' column='1' elf-symbol-id='rcu_has_sys_membarrier_memb'/>
+    <!-- struct rcu_gp_memb -->
+    <class-decl name='rcu_gp_memb' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu.h' line='119' column='1' id='type-id-2'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_gp_memb::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu.h' line='127' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t rcu_gp_memb::futex -->
+        <var-decl name='futex' type-id='type-id-4' visibility='default' filepath='../include/urcu/static/urcu.h' line='129' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-1' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-4'/>
+    <!-- rcu_gp_memb rcu_gp_memb -->
+    <var-decl name='rcu_gp_memb' type-id='type-id-2' mangled-name='rcu_gp_memb' visibility='default' filepath='../include/urcu/static/urcu.h' line='132' column='1' elf-symbol-id='rcu_gp_memb'/>
+    <!-- struct rcu_reader_memb -->
+    <class-decl name='rcu_reader_memb' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu.h' line='134' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_reader_memb::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu.h' line='136' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char rcu_reader_memb::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu.h' line='137' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head rcu_reader_memb::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu.h' line='139' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t rcu_reader_memb::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu.h' line='140' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int rcu_reader_memb::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu.h' line='142' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='35' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='36' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- rcu_reader_memb rcu_reader_memb -->
+    <var-decl name='rcu_reader_memb' type-id='type-id-6' mangled-name='rcu_reader_memb' visibility='default' filepath='../include/urcu/static/urcu.h' line='145' column='1' elf-symbol-id='rcu_reader_memb'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../src/urcu-flavor.h' line='40' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='42' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../src/urcu-flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../src/urcu-flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../src/urcu-flavor.h' line='48' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='51' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../src/urcu-flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../src/urcu-flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../src/urcu-flavor.h' line='58' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../src/urcu-call-rcu.h' line='59' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../src/urcu-call-rcu.h' line='60' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../src/urcu-call-rcu.h' line='61' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../src/urcu-flavor.h' line='30' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../src/urcu-flavor.h' line='31' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../src/urcu-flavor.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../src/urcu-flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../src/urcu-flavor.h' line='34' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct rcu_flavor_memb -->
+    <var-decl name='rcu_flavor_memb' type-id='type-id-35' mangled-name='rcu_flavor_memb' visibility='default' filepath='../src/urcu-flavor.h' line='79' column='1' elf-symbol-id='rcu_flavor_memb'/>
+    <!-- void rcu_defer_exit_memb() -->
+    <function-decl name='rcu_defer_exit_memb' mangled-name='rcu_defer_exit_memb' filepath='src/urcu-defer-impl.h' line='466' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_exit_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_defer_unregister_thread_memb() -->
+    <function-decl name='rcu_defer_unregister_thread_memb' mangled-name='rcu_defer_unregister_thread_memb' filepath='src/urcu-defer-impl.h' line='448' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_unregister_thread_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int rcu_defer_register_thread_memb() -->
+    <function-decl name='rcu_defer_register_thread_memb' mangled-name='rcu_defer_register_thread_memb' filepath='src/urcu-defer-impl.h' line='426' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_register_thread_memb'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void defer_rcu_memb(void (void*)*, void*) -->
+    <function-decl name='defer_rcu_memb' mangled-name='defer_rcu_memb' filepath='src/urcu-defer-impl.h' line='395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_memb'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='395' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='395' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_memb() -->
+    <function-decl name='rcu_defer_barrier_memb' mangled-name='rcu_defer_barrier_memb' filepath='src/urcu-defer-impl.h' line='281' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_thread_memb() -->
+    <function-decl name='rcu_defer_barrier_thread_memb' mangled-name='rcu_defer_barrier_thread_memb' filepath='src/urcu-defer-impl.h' line='261' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_unregister_rculfhash_atfork_memb(urcu_atfork*) -->
+    <function-decl name='urcu_unregister_rculfhash_atfork_memb' mangled-name='urcu_unregister_rculfhash_atfork_memb' filepath='src/urcu-call-rcu-impl.h' line='1011' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_unregister_rculfhash_atfork_memb'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1011' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_register_rculfhash_atfork_memb(urcu_atfork*) -->
+    <function-decl name='urcu_register_rculfhash_atfork_memb' mangled-name='urcu_register_rculfhash_atfork_memb' filepath='src/urcu-call-rcu-impl.h' line='1001' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_register_rculfhash_atfork_memb'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1011' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_child_memb() -->
+    <function-decl name='call_rcu_after_fork_child_memb' mangled-name='call_rcu_after_fork_child_memb' filepath='src/urcu-call-rcu-impl.h' line='959' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_parent_memb() -->
+    <function-decl name='call_rcu_after_fork_parent_memb' mangled-name='call_rcu_after_fork_parent_memb' filepath='src/urcu-call-rcu-impl.h' line='937' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_parent_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void call_rcu_before_fork_memb() -->
+    <function-decl name='call_rcu_before_fork_memb' mangled-name='call_rcu_before_fork_memb' filepath='src/urcu-call-rcu-impl.h' line='910' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_before_fork_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_barrier_memb() -->
+    <function-decl name='rcu_barrier_memb' mangled-name='rcu_barrier_memb' filepath='src/urcu-call-rcu-impl.h' line='839' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_barrier_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void free_all_cpu_call_rcu_data_memb() -->
+    <function-decl name='free_all_cpu_call_rcu_data_memb' mangled-name='free_all_cpu_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='776' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_all_cpu_call_rcu_data_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='52' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='60' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-1' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void call_rcu_data_free_memb(call_rcu_data*) -->
+    <function-decl name='call_rcu_data_free_memb' mangled-name='call_rcu_data_free_memb' filepath='src/urcu-call-rcu-impl.h' line='744' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_data_free_memb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='744' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void call_rcu_memb(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='call_rcu_memb' mangled-name='call_rcu_memb' filepath='src/urcu-call-rcu-impl.h' line='706' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_memb'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='706' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='707' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int create_all_cpu_call_rcu_data_memb(unsigned long int) -->
+    <function-decl name='create_all_cpu_call_rcu_data_memb' mangled-name='create_all_cpu_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='628' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_memb'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='628' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void set_thread_call_rcu_data_memb(call_rcu_data*) -->
+    <function-decl name='set_thread_call_rcu_data_memb' mangled-name='set_thread_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='615' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_thread_call_rcu_data_memb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='615' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* get_thread_call_rcu_data_memb() -->
+    <function-decl name='get_thread_call_rcu_data_memb' mangled-name='get_thread_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='599' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_thread_call_rcu_data_memb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* get_call_rcu_data_memb() -->
+    <function-decl name='get_call_rcu_data_memb' mangled-name='get_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='579' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_data_memb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* get_default_call_rcu_data_memb() -->
+    <function-decl name='get_default_call_rcu_data_memb' mangled-name='get_default_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='554' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_default_call_rcu_data_memb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int set_cpu_call_rcu_data_memb(int, call_rcu_data*) -->
+    <function-decl name='set_cpu_call_rcu_data_memb' mangled-name='set_cpu_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='515' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_cpu_call_rcu_data_memb'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='515' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='515' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- call_rcu_data* create_call_rcu_data_memb(unsigned long int, int) -->
+    <function-decl name='create_call_rcu_data_memb' mangled-name='create_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='491' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_call_rcu_data_memb'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='491' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='492' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t get_call_rcu_thread_memb(call_rcu_data*) -->
+    <function-decl name='get_call_rcu_thread_memb' mangled-name='get_call_rcu_thread_memb' filepath='src/urcu-call-rcu-impl.h' line='473' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_thread_memb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='473' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* get_cpu_call_rcu_data_memb(int) -->
+    <function-decl name='get_cpu_call_rcu_data_memb' mangled-name='get_cpu_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='451' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_memb'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='451' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void rcu_init_memb() -->
+    <function-decl name='rcu_init_memb' mangled-name='rcu_init_memb' filepath='src/urcu.c' line='554' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_init_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_unregister_thread_memb() -->
+    <function-decl name='rcu_unregister_thread_memb' mangled-name='rcu_unregister_thread_memb' filepath='src/urcu.c' line='527' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_unregister_thread_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_register_thread_memb() -->
+    <function-decl name='rcu_register_thread_memb' mangled-name='rcu_register_thread_memb' filepath='src/urcu.c' line='513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_register_thread_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int rcu_read_ongoing_memb() -->
+    <function-decl name='rcu_read_ongoing_memb' mangled-name='rcu_read_ongoing_memb' filepath='src/urcu.c' line='508' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_ongoing_memb'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void rcu_read_unlock_memb() -->
+    <function-decl name='rcu_read_unlock_memb' mangled-name='rcu_read_unlock_memb' filepath='src/urcu.c' line='503' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_unlock_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void rcu_read_lock_memb() -->
+    <function-decl name='rcu_read_lock_memb' mangled-name='rcu_read_lock_memb' filepath='src/urcu.c' line='498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_lock_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void synchronize_rcu_memb() -->
+    <function-decl name='synchronize_rcu_memb' mangled-name='synchronize_rcu_memb' filepath='src/urcu.c' line='377' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='synchronize_rcu_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-bp.so.6.xml b/extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-bp.so.6.xml
new file mode 100644 (file)
index 0000000..312bc93
--- /dev/null
@@ -0,0 +1,978 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-bp.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_child_bp -->
+    <elf-symbol name='call_rcu_after_fork_child_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_call_rcu_after_fork_child' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_bp -->
+    <elf-symbol name='call_rcu_after_fork_parent_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_bp -->
+    <elf-symbol name='call_rcu_before_fork_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_bp -->
+    <elf-symbol name='call_rcu_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_call_rcu' is-defined='yes'/>
+    <!-- call_rcu_data_free_bp -->
+    <elf-symbol name='call_rcu_data_free_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_call_rcu_data_free' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_bp -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_create_all_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- create_call_rcu_data_bp -->
+    <elf-symbol name='create_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_create_call_rcu_data' is-defined='yes'/>
+    <!-- defer_rcu_bp -->
+    <elf-symbol name='defer_rcu_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_defer_rcu' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data_bp -->
+    <elf-symbol name='free_all_cpu_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_free_all_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- get_call_rcu_data_bp -->
+    <elf-symbol name='get_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_get_call_rcu_data' is-defined='yes'/>
+    <!-- get_call_rcu_thread_bp -->
+    <elf-symbol name='get_call_rcu_thread_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_bp -->
+    <elf-symbol name='get_cpu_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_bp -->
+    <elf-symbol name='get_default_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_bp -->
+    <elf-symbol name='get_thread_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_barrier_bp -->
+    <elf-symbol name='rcu_barrier_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_barrier' is-defined='yes'/>
+    <!-- rcu_bp_after_fork_child -->
+    <elf-symbol name='rcu_bp_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_after_fork_child' is-defined='yes'/>
+    <!-- rcu_bp_after_fork_parent -->
+    <elf-symbol name='rcu_bp_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_bp_before_fork -->
+    <elf-symbol name='rcu_bp_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_bp_register -->
+    <elf-symbol name='rcu_bp_register' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_register' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym_bp -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_cmpxchg_pointer_sym' is-defined='yes'/>
+    <!-- rcu_defer_barrier_bp -->
+    <elf-symbol name='rcu_defer_barrier_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_defer_barrier' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_bp -->
+    <elf-symbol name='rcu_defer_barrier_thread_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_defer_barrier_thread' is-defined='yes'/>
+    <!-- rcu_defer_exit_bp -->
+    <elf-symbol name='rcu_defer_exit_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_bp -->
+    <elf-symbol name='rcu_defer_register_thread_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_bp -->
+    <elf-symbol name='rcu_defer_unregister_thread_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym_bp -->
+    <elf-symbol name='rcu_dereference_sym_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_dereference_sym' is-defined='yes'/>
+    <!-- rcu_read_lock_bp -->
+    <elf-symbol name='rcu_read_lock_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_ongoing_bp -->
+    <elf-symbol name='rcu_read_ongoing_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_unlock_bp -->
+    <elf-symbol name='rcu_read_unlock_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_read_unlock' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym_bp -->
+    <elf-symbol name='rcu_set_pointer_sym_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym_bp -->
+    <elf-symbol name='rcu_xchg_pointer_sym_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_bp -->
+    <elf-symbol name='set_cpu_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_set_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_bp -->
+    <elf-symbol name='set_thread_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- synchronize_rcu_bp -->
+    <elf-symbol name='synchronize_rcu_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_after_fork_child -->
+    <elf-symbol name='urcu_bp_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_after_fork_parent -->
+    <elf-symbol name='urcu_bp_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_bp_after_fork_parent' is-defined='yes'/>
+    <!-- urcu_bp_barrier -->
+    <elf-symbol name='urcu_bp_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_before_fork -->
+    <elf-symbol name='urcu_bp_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_bp_before_fork' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu -->
+    <elf-symbol name='urcu_bp_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_bp_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_bp_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_after_fork_parent_bp' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu_before_fork -->
+    <elf-symbol name='urcu_bp_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_before_fork_bp' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu_data_free -->
+    <elf-symbol name='urcu_bp_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_cmpxchg_pointer_sym -->
+    <elf-symbol name='urcu_bp_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_bp_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_create_call_rcu_data -->
+    <elf-symbol name='urcu_bp_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_barrier -->
+    <elf-symbol name='urcu_bp_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_barrier_thread -->
+    <elf-symbol name='urcu_bp_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_exit -->
+    <elf-symbol name='urcu_bp_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_exit_bp' is-defined='yes'/>
+    <!-- urcu_bp_defer_rcu -->
+    <elf-symbol name='urcu_bp_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_register_thread -->
+    <elf-symbol name='urcu_bp_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_register_thread_bp' is-defined='yes'/>
+    <!-- urcu_bp_defer_unregister_thread -->
+    <elf-symbol name='urcu_bp_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_unregister_thread_bp' is-defined='yes'/>
+    <!-- urcu_bp_dereference_sym -->
+    <elf-symbol name='urcu_bp_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_bp_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_get_call_rcu_data -->
+    <elf-symbol name='urcu_bp_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_get_call_rcu_thread -->
+    <elf-symbol name='urcu_bp_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_call_rcu_thread_bp' is-defined='yes'/>
+    <!-- urcu_bp_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_bp_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_cpu_call_rcu_data_bp' is-defined='yes'/>
+    <!-- urcu_bp_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_bp_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_default_call_rcu_data_bp' is-defined='yes'/>
+    <!-- urcu_bp_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_bp_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_thread_call_rcu_data_bp' is-defined='yes'/>
+    <!-- urcu_bp_read_lock -->
+    <elf-symbol name='urcu_bp_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_read_lock_bp' is-defined='yes'/>
+    <!-- urcu_bp_read_ongoing -->
+    <elf-symbol name='urcu_bp_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_read_ongoing_bp' is-defined='yes'/>
+    <!-- urcu_bp_read_unlock -->
+    <elf-symbol name='urcu_bp_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_register -->
+    <elf-symbol name='urcu_bp_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_bp_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_bp_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_set_pointer_sym -->
+    <elf-symbol name='urcu_bp_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_set_pointer_sym_bp' is-defined='yes'/>
+    <!-- urcu_bp_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_bp_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='set_thread_call_rcu_data_bp' is-defined='yes'/>
+    <!-- urcu_bp_synchronize_rcu -->
+    <elf-symbol name='urcu_bp_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='synchronize_rcu_bp' is-defined='yes'/>
+    <!-- urcu_bp_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_bp_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_unregister_rculfhash_atfork_bp' is-defined='yes'/>
+    <!-- urcu_bp_xchg_pointer_sym -->
+    <elf-symbol name='urcu_bp_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_xchg_pointer_sym_bp' is-defined='yes'/>
+    <!-- urcu_register_rculfhash_atfork_bp -->
+    <elf-symbol name='urcu_register_rculfhash_atfork_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_register_rculfhash_atfork' is-defined='yes'/>
+    <!-- urcu_unregister_rculfhash_atfork_bp -->
+    <elf-symbol name='urcu_unregister_rculfhash_atfork_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_bp -->
+    <elf-symbol name='rcu_flavor_bp' size='112' type='object-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_flavor' is-defined='yes'/>
+    <!-- rcu_gp_bp -->
+    <elf-symbol name='rcu_gp_bp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_gp' is-defined='yes'/>
+    <!-- rcu_reader_bp -->
+    <elf-symbol name='rcu_reader_bp' size='8' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_flavor -->
+    <elf-symbol name='urcu_bp_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_gp -->
+    <elf-symbol name='urcu_bp_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_has_sys_membarrier -->
+    <elf-symbol name='urcu_bp_has_sys_membarrier' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_reader -->
+    <elf-symbol name='urcu_bp_reader' size='8' type='tls-type' binding='global-binding' visibility='default-visibility' alias='rcu_reader_bp' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu-bp.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <!-- int urcu_bp_has_sys_membarrier -->
+    <var-decl name='urcu_bp_has_sys_membarrier' type-id='type-id-1' mangled-name='urcu_bp_has_sys_membarrier' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='109' column='1' elf-symbol-id='urcu_bp_has_sys_membarrier'/>
+    <!-- struct urcu_bp_gp -->
+    <class-decl name='urcu_bp_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='77' column='1' id='type-id-2'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_bp_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- urcu_bp_gp urcu_bp_gp -->
+    <var-decl name='urcu_bp_gp' type-id='type-id-2' mangled-name='rcu_gp_bp' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='88' column='1' elf-symbol-id='rcu_gp_bp'/>
+    <!-- struct urcu_bp_reader -->
+    <class-decl name='urcu_bp_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='90' column='1' id='type-id-4'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_bp_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='92' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_bp_reader::node -->
+        <var-decl name='node' type-id='type-id-5' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_bp_reader::tid -->
+        <var-decl name='tid' type-id='type-id-6' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='95' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1216'>
+        <!-- int urcu_bp_reader::alloc -->
+        <var-decl name='alloc' type-id='type-id-1' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='96' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-5'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-7' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-7' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-7'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-6'/>
+    <!-- urcu_bp_reader* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-8'/>
+    <!-- urcu_bp_reader* urcu_bp_reader -->
+    <var-decl name='urcu_bp_reader' type-id='type-id-8' mangled-name='urcu_bp_reader' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='104' column='1' elf-symbol-id='urcu_bp_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-9'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-11' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-15'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-16' size-in-bits='64' id='type-id-10'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-11'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-18'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-19' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-20' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-19'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-21'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-22'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-23' size-in-bits='64' id='type-id-20'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-24' size-in-bits='64' id='type-id-12'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-15' size-in-bits='64' id='type-id-25'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-27'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-13'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-29'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-27' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-27' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-27' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-25' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-14'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-9' const='yes' id='type-id-32'/>
+    <!-- const rcu_flavor_struct urcu_bp_flavor -->
+    <var-decl name='urcu_bp_flavor' type-id='type-id-32' mangled-name='rcu_flavor_bp' visibility='default' filepath='../include/urcu/flavor.h' line='90' column='1' elf-symbol-id='rcu_flavor_bp'/>
+    <!-- void urcu_bp_defer_exit() -->
+    <function-decl name='urcu_bp_defer_exit' mangled-name='urcu_bp_defer_exit' filepath='src/urcu-defer-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_defer_unregister_thread() -->
+    <function-decl name='urcu_bp_defer_unregister_thread' mangled-name='urcu_bp_defer_unregister_thread' filepath='src/urcu-defer-impl.h' line='456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_defer_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int urcu_bp_defer_register_thread() -->
+    <function-decl name='urcu_bp_defer_register_thread' mangled-name='urcu_bp_defer_register_thread' filepath='src/urcu-defer-impl.h' line='432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_bp_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_bp_defer_rcu' mangled-name='defer_rcu_bp' filepath='src/urcu-defer-impl.h' line='400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_bp'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-27' name='fct' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='p' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_defer_barrier() -->
+    <function-decl name='urcu_bp_defer_barrier' mangled-name='rcu_defer_barrier_bp' filepath='src/urcu-defer-impl.h' line='284' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_defer_barrier_thread() -->
+    <function-decl name='urcu_bp_defer_barrier_thread' mangled-name='rcu_defer_barrier_thread_bp' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_bp_unregister_rculfhash_atfork' mangled-name='urcu_bp_unregister_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_unregister_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-30' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_bp_register_rculfhash_atfork' mangled-name='urcu_register_rculfhash_atfork_bp' filepath='src/urcu-call-rcu-impl.h' line='1044' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_register_rculfhash_atfork_bp'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-30' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_bp_call_rcu_after_fork_child' mangled-name='call_rcu_after_fork_child_bp' filepath='src/urcu-call-rcu-impl.h' line='1000' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_bp_call_rcu_after_fork_parent' mangled-name='urcu_bp_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='976' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_call_rcu_before_fork() -->
+    <function-decl name='urcu_bp_call_rcu_before_fork' mangled-name='urcu_bp_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='947' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_barrier() -->
+    <function-decl name='urcu_bp_barrier' mangled-name='rcu_barrier_bp' filepath='src/urcu-call-rcu-impl.h' line='874' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_barrier_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_bp_free_all_cpu_call_rcu_data' mangled-name='free_all_cpu_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_all_cpu_call_rcu_data_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-33'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-34' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-35' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-36' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-6' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-1' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-5' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-34'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-35'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-19' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-37' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-38'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-39' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-40' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-39'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-42'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-43'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-45'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-46'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-45' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-44'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-47'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='320' id='type-id-40'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-41'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-38' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-37'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-1' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-49'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-49' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-36'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-50'/>
+    <!-- void urcu_bp_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_bp_call_rcu_data_free' mangled-name='call_rcu_data_free_bp' filepath='src/urcu-call-rcu-impl.h' line='764' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_data_free_bp'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='764' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_bp_call_rcu' mangled-name='call_rcu_bp' filepath='src/urcu-call-rcu-impl.h' line='725' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_bp'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-22' name='head' filepath='src/urcu-call-rcu-impl.h' line='725' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-20' name='func' filepath='src/urcu-call-rcu-impl.h' line='726' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int urcu_bp_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_bp_create_all_cpu_call_rcu_data' mangled-name='create_all_cpu_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_bp'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='645' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_bp_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_bp_set_thread_call_rcu_data' mangled-name='urcu_bp_set_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_set_thread_call_rcu_data'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='630' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_bp_get_thread_call_rcu_data' mangled-name='urcu_bp_get_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_get_thread_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_get_call_rcu_data() -->
+    <function-decl name='urcu_bp_get_call_rcu_data' mangled-name='get_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='590' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_data_bp'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_get_default_call_rcu_data() -->
+    <function-decl name='urcu_bp_get_default_call_rcu_data' mangled-name='urcu_bp_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- int urcu_bp_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_bp_set_cpu_call_rcu_data' mangled-name='set_cpu_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_cpu_call_rcu_data_bp'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_bp_create_call_rcu_data' mangled-name='create_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_call_rcu_data_bp'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='498' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='499' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- pthread_t urcu_bp_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_bp_get_call_rcu_thread' mangled-name='urcu_bp_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='476' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_bp_get_cpu_call_rcu_data' mangled-name='urcu_bp_get_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='452' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_get_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='452' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-25' size-in-bits='64' id='type-id-51'/>
+    <!-- void* urcu_bp_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='urcu_bp_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym_bp' filepath='src/urcu-bp.c' line='774' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym_bp'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='774' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='old' filepath='src/urcu-bp.c' line='774' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='_new' filepath='src/urcu-bp.c' line='774' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* urcu_bp_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='urcu_bp_xchg_pointer_sym' mangled-name='urcu_bp_xchg_pointer_sym' filepath='src/urcu-bp.c' line='766' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='766' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='766' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* urcu_bp_set_pointer_sym(void**, void*) -->
+    <function-decl name='urcu_bp_set_pointer_sym' mangled-name='urcu_bp_set_pointer_sym' filepath='src/urcu-bp.c' line='757' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='757' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='757' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* urcu_bp_dereference_sym(void*) -->
+    <function-decl name='urcu_bp_dereference_sym' mangled-name='rcu_dereference_sym_bp' filepath='src/urcu-bp.c' line='750' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym_bp'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='p' filepath='src/urcu-bp.c' line='750' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void urcu_bp_after_fork_child() -->
+    <function-decl name='urcu_bp_after_fork_child' mangled-name='rcu_bp_after_fork_child' filepath='src/urcu-bp.c' line='735' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_bp_after_fork_child'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_after_fork_parent() -->
+    <function-decl name='urcu_bp_after_fork_parent' mangled-name='urcu_bp_after_fork_parent' filepath='src/urcu-bp.c' line='698' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_before_fork() -->
+    <function-decl name='urcu_bp_before_fork' mangled-name='urcu_bp_before_fork' filepath='src/urcu-bp.c' line='683' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_register() -->
+    <function-decl name='urcu_bp_register' mangled-name='rcu_bp_register' filepath='src/urcu-bp.c' line='538' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_bp_register'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int urcu_bp_read_ongoing() -->
+    <function-decl name='urcu_bp_read_ongoing' mangled-name='urcu_bp_read_ongoing' filepath='src/urcu-bp.c' line='370' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_read_ongoing'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_bp_read_unlock() -->
+    <function-decl name='urcu_bp_read_unlock' mangled-name='rcu_read_unlock_bp' filepath='src/urcu-bp.c' line='364' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_unlock_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_read_lock() -->
+    <function-decl name='urcu_bp_read_lock' mangled-name='urcu_bp_read_lock' filepath='src/urcu-bp.c' line='358' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_read_lock'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_synchronize_rcu() -->
+    <function-decl name='urcu_bp_synchronize_rcu' mangled-name='urcu_bp_synchronize_rcu' filepath='src/urcu-bp.c' line='274' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-17'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-16'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-23'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-22'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-24'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-22'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-20'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-28'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-27'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='774' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='old' filepath='src/urcu-bp.c' line='774' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='_new' filepath='src/urcu-bp.c' line='774' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='766' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='766' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='757' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='757' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='p' filepath='src/urcu-bp.c' line='750' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-37' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-52'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-55' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-53'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-56' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-56'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-59' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-58'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-59'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-42' size-in-bits='64' id='type-id-57'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-60'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='384' id='type-id-54'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-61'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-55'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-52' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-62'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-62' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-63'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-64'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-66' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-41' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-65'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-41' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-66'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-64' const='yes' id='type-id-67'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-67' size-in-bits='64' id='type-id-68'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-68' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-68' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-cds.so.6.xml b/extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-cds.so.6.xml
new file mode 100644 (file)
index 0000000..a085bee
--- /dev/null
@@ -0,0 +1,1480 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-cds.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- __cds_lfs_init -->
+    <elf-symbol name='__cds_lfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_lfs_pop -->
+    <elf-symbol name='__cds_lfs_pop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_lfs_pop_all -->
+    <elf-symbol name='__cds_lfs_pop_all' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _cds_lfht_new -->
+    <elf-symbol name='_cds_lfht_new' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_add -->
+    <elf-symbol name='cds_lfht_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_add_replace -->
+    <elf-symbol name='cds_lfht_add_replace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_add_unique -->
+    <elf-symbol name='cds_lfht_add_unique' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_count_nodes -->
+    <elf-symbol name='cds_lfht_count_nodes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_del -->
+    <elf-symbol name='cds_lfht_del' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_destroy -->
+    <elf-symbol name='cds_lfht_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_first -->
+    <elf-symbol name='cds_lfht_first' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_fls_ulong -->
+    <elf-symbol name='cds_lfht_fls_ulong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_get_count_order_ulong -->
+    <elf-symbol name='cds_lfht_get_count_order_ulong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_is_node_deleted -->
+    <elf-symbol name='cds_lfht_is_node_deleted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_lookup -->
+    <elf-symbol name='cds_lfht_lookup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_next -->
+    <elf-symbol name='cds_lfht_next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_next_duplicate -->
+    <elf-symbol name='cds_lfht_next_duplicate' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_replace -->
+    <elf-symbol name='cds_lfht_replace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_resize -->
+    <elf-symbol name='cds_lfht_resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_dequeue_rcu -->
+    <elf-symbol name='cds_lfq_dequeue_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_destroy_rcu -->
+    <elf-symbol name='cds_lfq_destroy_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_enqueue_rcu -->
+    <elf-symbol name='cds_lfq_enqueue_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_init_rcu -->
+    <elf-symbol name='cds_lfq_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_node_init_rcu -->
+    <elf-symbol name='cds_lfq_node_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_destroy -->
+    <elf-symbol name='cds_lfs_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_empty -->
+    <elf-symbol name='cds_lfs_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_init -->
+    <elf-symbol name='cds_lfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_init_rcu -->
+    <elf-symbol name='cds_lfs_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_node_init -->
+    <elf-symbol name='cds_lfs_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_node_init_rcu -->
+    <elf-symbol name='cds_lfs_node_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_all_blocking -->
+    <elf-symbol name='cds_lfs_pop_all_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_blocking -->
+    <elf-symbol name='cds_lfs_pop_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_lock -->
+    <elf-symbol name='cds_lfs_pop_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_rcu -->
+    <elf-symbol name='cds_lfs_pop_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_unlock -->
+    <elf-symbol name='cds_lfs_pop_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_push -->
+    <elf-symbol name='cds_lfs_push' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_push_rcu -->
+    <elf-symbol name='cds_lfs_push_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_create -->
+    <elf-symbol name='urcu_workqueue_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_create_completion -->
+    <elf-symbol name='urcu_workqueue_create_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_create_worker -->
+    <elf-symbol name='urcu_workqueue_create_worker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_destroy -->
+    <elf-symbol name='urcu_workqueue_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_destroy_completion -->
+    <elf-symbol name='urcu_workqueue_destroy_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_flush_queued_work -->
+    <elf-symbol name='urcu_workqueue_flush_queued_work' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_pause_worker -->
+    <elf-symbol name='urcu_workqueue_pause_worker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_queue_completion -->
+    <elf-symbol name='urcu_workqueue_queue_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_queue_work -->
+    <elf-symbol name='urcu_workqueue_queue_work' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_resume_worker -->
+    <elf-symbol name='urcu_workqueue_resume_worker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_wait_completion -->
+    <elf-symbol name='urcu_workqueue_wait_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_mm_chunk -->
+    <elf-symbol name='cds_lfht_mm_chunk' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_mm_mmap -->
+    <elf-symbol name='cds_lfht_mm_mmap' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_mm_order -->
+    <elf-symbol name='cds_lfht_mm_order' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='rculfqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfq_node_rcu -->
+    <class-decl name='cds_lfq_node_rcu' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/rculfqueue.h' line='35' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfq_node_rcu* cds_lfq_node_rcu::next -->
+        <var-decl name='next' type-id='type-id-2' visibility='default' filepath='../include/urcu/rculfqueue.h' line='36' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int cds_lfq_node_rcu::dummy -->
+        <var-decl name='dummy' type-id='type-id-3' visibility='default' filepath='../include/urcu/rculfqueue.h' line='37' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfq_node_rcu* -->
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-3'/>
+    <!-- struct cds_lfq_queue_rcu -->
+    <class-decl name='cds_lfq_queue_rcu' size-in-bits='192' is-struct='yes' visibility='default' filepath='../include/urcu/rculfqueue.h' line='40' column='1' id='type-id-4'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfq_node_rcu* cds_lfq_queue_rcu::head -->
+        <var-decl name='head' type-id='type-id-2' visibility='default' filepath='../include/urcu/rculfqueue.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_lfq_node_rcu* cds_lfq_queue_rcu::tail -->
+        <var-decl name='tail' type-id='type-id-2' visibility='default' filepath='../include/urcu/rculfqueue.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* cds_lfq_queue_rcu::queue_call_rcu -->
+        <var-decl name='queue_call_rcu' type-id='type-id-5' visibility='default' filepath='../include/urcu/rculfqueue.h' line='42' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-6'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-7'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-8' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-9' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-10' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-10'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-7' size-in-bits='64' id='type-id-11'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-12' size-in-bits='64' id='type-id-9'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-13' size-in-bits='64' id='type-id-5'/>
+    <!-- cds_lfq_queue_rcu* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-14'/>
+    <!-- cds_lfq_node_rcu* cds_lfq_dequeue_rcu(cds_lfq_queue_rcu*) -->
+    <function-decl name='cds_lfq_dequeue_rcu' mangled-name='cds_lfq_dequeue_rcu' filepath='src/rculfqueue.c' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_dequeue_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='56' column='1'/>
+      <!-- cds_lfq_node_rcu* -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void cds_lfq_enqueue_rcu(cds_lfq_queue_rcu*, cds_lfq_node_rcu*) -->
+    <function-decl name='cds_lfq_enqueue_rcu' mangled-name='cds_lfq_enqueue_rcu' filepath='src/rculfqueue.c' line='50' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_enqueue_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='50' column='1'/>
+      <!-- parameter of type 'cds_lfq_node_rcu*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/rculfqueue.c' line='50' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- int cds_lfq_destroy_rcu(cds_lfq_queue_rcu*) -->
+    <function-decl name='cds_lfq_destroy_rcu' mangled-name='cds_lfq_destroy_rcu' filepath='src/rculfqueue.c' line='45' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_destroy_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='45' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- void cds_lfq_init_rcu(cds_lfq_queue_rcu*, void (rcu_head*, void (rcu_head*)*)*) -->
+    <function-decl name='cds_lfq_init_rcu' mangled-name='cds_lfq_init_rcu' filepath='src/rculfqueue.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_init_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='38' column='1'/>
+      <!-- parameter of type 'void (rcu_head*, void (rcu_head*)*)*' -->
+      <parameter type-id='type-id-5' name='queue_call_rcu' filepath='src/rculfqueue.c' line='39' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfq_node_init_rcu(cds_lfq_node_rcu*) -->
+    <function-decl name='cds_lfq_node_init_rcu' mangled-name='cds_lfq_node_init_rcu' filepath='src/rculfqueue.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_node_init_rcu'>
+      <!-- parameter of type 'cds_lfq_node_rcu*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/rculfqueue.c' line='33' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-12'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-11'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-13'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-11'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-9'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfstack.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfs_node_rcu -->
+    <class-decl name='cds_lfs_node_rcu' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/rculfstack.h' line='37' column='1' id='type-id-15'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node_rcu* cds_lfs_node_rcu::next -->
+        <var-decl name='next' type-id='type-id-16' visibility='default' filepath='../include/urcu/rculfstack.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfs_node_rcu* -->
+    <pointer-type-def type-id='type-id-15' size-in-bits='64' id='type-id-16'/>
+    <!-- struct cds_lfs_stack_rcu -->
+    <class-decl name='cds_lfs_stack_rcu' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/rculfstack.h' line='41' column='1' id='type-id-17'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node_rcu* cds_lfs_stack_rcu::head -->
+        <var-decl name='head' type-id='type-id-16' visibility='default' filepath='../include/urcu/rculfstack.h' line='42' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfs_stack_rcu* -->
+    <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-18'/>
+    <!-- cds_lfs_node_rcu* cds_lfs_pop_rcu(cds_lfs_stack_rcu*) -->
+    <function-decl name='cds_lfs_pop_rcu' mangled-name='cds_lfs_pop_rcu' filepath='src/rculfstack.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_rcu'>
+      <!-- parameter of type 'cds_lfs_stack_rcu*' -->
+      <parameter type-id='type-id-18' name='s' filepath='src/rculfstack.c' line='53' column='1'/>
+      <!-- cds_lfs_node_rcu* -->
+      <return type-id='type-id-16'/>
+    </function-decl>
+    <!-- int cds_lfs_push_rcu(cds_lfs_stack_rcu*, cds_lfs_node_rcu*) -->
+    <function-decl name='cds_lfs_push_rcu' mangled-name='cds_lfs_push_rcu' filepath='src/rculfstack.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_push_rcu'>
+      <!-- parameter of type 'cds_lfs_stack_rcu*' -->
+      <parameter type-id='type-id-18' name='s' filepath='src/rculfstack.c' line='47' column='1'/>
+      <!-- parameter of type 'cds_lfs_node_rcu*' -->
+      <parameter type-id='type-id-16' name='node' filepath='src/rculfstack.c' line='48' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- void cds_lfs_init_rcu(cds_lfs_stack_rcu*) -->
+    <function-decl name='cds_lfs_init_rcu' mangled-name='cds_lfs_init_rcu' filepath='src/rculfstack.c' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_init_rcu'>
+      <!-- parameter of type 'cds_lfs_stack_rcu*' -->
+      <parameter type-id='type-id-18' name='s' filepath='src/rculfstack.c' line='42' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_node_init_rcu(cds_lfs_node_rcu*) -->
+    <function-decl name='cds_lfs_node_init_rcu' mangled-name='cds_lfs_node_init_rcu' filepath='src/rculfstack.c' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_node_init_rcu'>
+      <!-- parameter of type 'cds_lfs_node_rcu*' -->
+      <parameter type-id='type-id-16' name='node' filepath='src/rculfstack.c' line='37' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='lfstack.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfs_head -->
+    <class-decl name='cds_lfs_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='69' column='1' id='type-id-19'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node cds_lfs_head::node -->
+        <var-decl name='node' type-id='type-id-20' visibility='default' filepath='../include/urcu/lfstack.h' line='70' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_lfs_node -->
+    <class-decl name='cds_lfs_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='59' column='1' id='type-id-20'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node* cds_lfs_node::next -->
+        <var-decl name='next' type-id='type-id-21' visibility='default' filepath='../include/urcu/lfstack.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfs_node* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-21'/>
+    <!-- cds_lfs_head* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-22'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='87' column='1' id='type-id-23'>
+      <data-member access='private'>
+        <!-- __cds_lfs_stack* __anonymous_union__::_s -->
+        <var-decl name='_s' type-id='type-id-24' visibility='default' filepath='../include/urcu/lfstack.h' line='88' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_lfs_stack* __anonymous_union__::s -->
+        <var-decl name='s' type-id='type-id-25' visibility='default' filepath='../include/urcu/lfstack.h' line='89' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __cds_lfs_stack -->
+    <class-decl name='__cds_lfs_stack' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='73' column='1' id='type-id-26'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_head* __cds_lfs_stack::head -->
+        <var-decl name='head' type-id='type-id-22' visibility='default' filepath='../include/urcu/lfstack.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __cds_lfs_stack* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-24'/>
+    <!-- struct cds_lfs_stack -->
+    <class-decl name='cds_lfs_stack' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='77' column='1' id='type-id-27'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_head* cds_lfs_stack::head -->
+        <var-decl name='head' type-id='type-id-22' visibility='default' filepath='../include/urcu/lfstack.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_lfs_stack::lock -->
+        <var-decl name='lock' type-id='type-id-28' visibility='default' filepath='../include/urcu/lfstack.h' line='79' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-29'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-30' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-31' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-32' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-30'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-3' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-3' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-3' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-34' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-34' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-35' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-33'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-34'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-37' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-37' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-37'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-36' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-35'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-38'/>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-39'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-38' size-in-bits='320' id='type-id-31'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-39' id='type-id-40'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-32'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-29' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-28'/>
+    <!-- cds_lfs_stack* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-25'/>
+    <!-- typedef __anonymous_union__ cds_lfs_stack_ptr_t -->
+    <typedef-decl name='cds_lfs_stack_ptr_t' type-id='type-id-23' filepath='../include/urcu/lfstack.h' line='90' column='1' id='type-id-41'/>
+    <!-- cds_lfs_head* __cds_lfs_pop_all(cds_lfs_stack_ptr_t) -->
+    <function-decl name='__cds_lfs_pop_all' mangled-name='__cds_lfs_pop_all' filepath='src/lfstack.c' line='88' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_lfs_pop_all'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='88' column='1'/>
+      <!-- cds_lfs_head* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_lfs_node* __cds_lfs_pop(cds_lfs_stack_ptr_t) -->
+    <function-decl name='__cds_lfs_pop' mangled-name='__cds_lfs_pop' filepath='src/lfstack.c' line='83' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_lfs_pop'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='83' column='1'/>
+      <!-- cds_lfs_node* -->
+      <return type-id='type-id-21'/>
+    </function-decl>
+    <!-- void cds_lfs_pop_unlock(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_unlock' mangled-name='cds_lfs_pop_unlock' filepath='src/lfstack.c' line='78' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_unlock'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_pop_lock(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_lock' mangled-name='cds_lfs_pop_lock' filepath='src/lfstack.c' line='73' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_lock'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- cds_lfs_head* cds_lfs_pop_all_blocking(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_all_blocking' mangled-name='cds_lfs_pop_all_blocking' filepath='src/lfstack.c' line='68' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_all_blocking'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='68' column='1'/>
+      <!-- cds_lfs_head* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_lfs_node* cds_lfs_pop_blocking(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_blocking' mangled-name='cds_lfs_pop_blocking' filepath='src/lfstack.c' line='63' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_blocking'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='63' column='1'/>
+      <!-- cds_lfs_node* -->
+      <return type-id='type-id-21'/>
+    </function-decl>
+    <!-- bool -->
+    <type-decl name='bool' size-in-bits='8' id='type-id-42'/>
+    <!-- bool cds_lfs_push(cds_lfs_stack_ptr_t, cds_lfs_node*) -->
+    <function-decl name='cds_lfs_push' mangled-name='cds_lfs_push' filepath='src/lfstack.c' line='58' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_push'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='58' column='1'/>
+      <!-- parameter of type 'cds_lfs_node*' -->
+      <parameter type-id='type-id-21' name='node' filepath='src/lfstack.c' line='58' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-42'/>
+    </function-decl>
+    <!-- bool cds_lfs_empty(cds_lfs_stack_ptr_t) -->
+    <function-decl name='cds_lfs_empty' mangled-name='cds_lfs_empty' filepath='src/lfstack.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_empty'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='53' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-42'/>
+    </function-decl>
+    <!-- void __cds_lfs_init(__cds_lfs_stack*) -->
+    <function-decl name='__cds_lfs_init' mangled-name='__cds_lfs_init' filepath='src/lfstack.c' line='48' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_lfs_init'>
+      <!-- parameter of type '__cds_lfs_stack*' -->
+      <parameter type-id='type-id-24' name='s' filepath='src/lfstack.c' line='48' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_destroy(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_destroy' mangled-name='cds_lfs_destroy' filepath='src/lfstack.c' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_destroy'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_init(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_init' mangled-name='cds_lfs_init' filepath='src/lfstack.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_init'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_node_init(cds_lfs_node*) -->
+    <function-decl name='cds_lfs_node_init' mangled-name='cds_lfs_node_init' filepath='src/lfstack.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_node_init'>
+      <!-- parameter of type 'cds_lfs_node*' -->
+      <parameter type-id='type-id-21' name='node' filepath='src/lfstack.c' line='33' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='workqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct urcu_workqueue -->
+    <class-decl name='urcu_workqueue' size-in-bits='2048' is-struct='yes' visibility='default' filepath='src/workqueue.c' line='54' column='1' id='type-id-43'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail urcu_workqueue::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-44' visibility='default' filepath='src/workqueue.c' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head urcu_workqueue::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-45' visibility='default' filepath='src/workqueue.c' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int urcu_workqueue::flags -->
+        <var-decl name='flags' type-id='type-id-39' visibility='default' filepath='src/workqueue.c' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t urcu_workqueue::futex -->
+        <var-decl name='futex' type-id='type-id-46' visibility='default' filepath='src/workqueue.c' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int urcu_workqueue::qlen -->
+        <var-decl name='qlen' type-id='type-id-39' visibility='default' filepath='src/workqueue.c' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t urcu_workqueue::tid -->
+        <var-decl name='tid' type-id='type-id-47' visibility='default' filepath='src/workqueue.c' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int urcu_workqueue::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-3' visibility='default' filepath='src/workqueue.c' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int urcu_workqueue::loop_count -->
+        <var-decl name='loop_count' type-id='type-id-39' visibility='default' filepath='src/workqueue.c' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void* urcu_workqueue::priv -->
+        <var-decl name='priv' type-id='type-id-48' visibility='default' filepath='src/workqueue.c' line='69' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='896'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::grace_period_fct -->
+        <var-decl name='grace_period_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='960'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::initialize_worker_fct -->
+        <var-decl name='initialize_worker_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='71' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::finalize_worker_fct -->
+        <var-decl name='finalize_worker_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1088'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_before_pause_fct -->
+        <var-decl name='worker_before_pause_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_after_resume_fct -->
+        <var-decl name='worker_after_resume_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1216'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_before_wait_fct -->
+        <var-decl name='worker_before_wait_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1280'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_after_wake_up_fct -->
+        <var-decl name='worker_after_wake_up_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='76' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-44'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-10' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-45'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-28' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-50'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-50' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-46'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-39' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-47'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-6' size-in-bits='64' id='type-id-48'/>
+    <!-- urcu_workqueue* -->
+    <pointer-type-def type-id='type-id-43' size-in-bits='64' id='type-id-51'/>
+    <!-- void (urcu_workqueue*, void*)* -->
+    <pointer-type-def type-id='type-id-52' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_workqueue_create_worker(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_create_worker' mangled-name='urcu_workqueue_create_worker' filepath='src/workqueue.c' line='458' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_create_worker'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='458' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_resume_worker(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_resume_worker' mangled-name='urcu_workqueue_resume_worker' filepath='src/workqueue.c' line='451' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_resume_worker'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='451' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_pause_worker(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_pause_worker' mangled-name='urcu_workqueue_pause_worker' filepath='src/workqueue.c' line='440' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_pause_worker'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='451' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_flush_queued_work(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_flush_queued_work' mangled-name='urcu_workqueue_flush_queued_work' filepath='src/workqueue.c' line='427' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_flush_queued_work'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='458' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- struct urcu_workqueue_completion -->
+    <class-decl name='urcu_workqueue_completion' size-in-bits='128' is-struct='yes' visibility='default' filepath='src/workqueue.c' line='79' column='1' id='type-id-53'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int urcu_workqueue_completion::barrier_count -->
+        <var-decl name='barrier_count' type-id='type-id-3' visibility='default' filepath='src/workqueue.c' line='80' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- int32_t urcu_workqueue_completion::futex -->
+        <var-decl name='futex' type-id='type-id-46' visibility='default' filepath='src/workqueue.c' line='81' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- urcu_ref urcu_workqueue_completion::ref -->
+        <var-decl name='ref' type-id='type-id-54' visibility='default' filepath='src/workqueue.c' line='82' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct urcu_ref -->
+    <class-decl name='urcu_ref' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/ref.h' line='23' column='1' id='type-id-54'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- long int urcu_ref::refcount -->
+        <var-decl name='refcount' type-id='type-id-32' visibility='default' filepath='../include/urcu/ref.h' line='24' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_workqueue_completion* -->
+    <pointer-type-def type-id='type-id-53' size-in-bits='64' id='type-id-55'/>
+    <!-- void urcu_workqueue_queue_completion(urcu_workqueue*, urcu_workqueue_completion*) -->
+    <function-decl name='urcu_workqueue_queue_completion' mangled-name='urcu_workqueue_queue_completion' filepath='src/workqueue.c' line='410' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_queue_completion'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='410' column='1'/>
+      <!-- parameter of type 'urcu_workqueue_completion*' -->
+      <parameter type-id='type-id-55' name='completion' filepath='src/workqueue.c' line='411' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_wait_completion(urcu_workqueue_completion*) -->
+    <function-decl name='urcu_workqueue_wait_completion' mangled-name='urcu_workqueue_wait_completion' filepath='src/workqueue.c' line='397' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_wait_completion'>
+      <!-- parameter of type 'urcu_workqueue_completion*' -->
+      <parameter type-id='type-id-55' name='completion' filepath='src/workqueue.c' line='397' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_destroy_completion(urcu_workqueue_completion*) -->
+    <function-decl name='urcu_workqueue_destroy_completion' mangled-name='urcu_workqueue_destroy_completion' filepath='src/workqueue.c' line='392' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_destroy_completion'>
+      <!-- parameter of type 'urcu_workqueue_completion*' -->
+      <parameter type-id='type-id-55' name='completion' filepath='src/workqueue.c' line='392' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- urcu_workqueue_completion* urcu_workqueue_create_completion() -->
+    <function-decl name='urcu_workqueue_create_completion' mangled-name='urcu_workqueue_create_completion' filepath='src/workqueue.c' line='380' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_create_completion'>
+      <!-- urcu_workqueue_completion* -->
+      <return type-id='type-id-55'/>
+    </function-decl>
+    <!-- struct urcu_work -->
+    <class-decl name='urcu_work' size-in-bits='128' is-struct='yes' visibility='default' filepath='src/workqueue.h' line='53' column='1' id='type-id-56'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node urcu_work::next -->
+        <var-decl name='next' type-id='type-id-8' visibility='default' filepath='src/workqueue.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (urcu_work*)* urcu_work::func -->
+        <var-decl name='func' type-id='type-id-57' visibility='default' filepath='src/workqueue.h' line='55' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_work* -->
+    <pointer-type-def type-id='type-id-56' size-in-bits='64' id='type-id-58'/>
+    <!-- void (urcu_work*)* -->
+    <pointer-type-def type-id='type-id-59' size-in-bits='64' id='type-id-57'/>
+    <!-- void urcu_workqueue_queue_work(urcu_workqueue*, urcu_work*, void (urcu_work*)*) -->
+    <function-decl name='urcu_workqueue_queue_work' mangled-name='urcu_workqueue_queue_work' filepath='src/workqueue.c' line='346' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_queue_work'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='346' column='1'/>
+      <!-- parameter of type 'urcu_work*' -->
+      <parameter type-id='type-id-58' name='work' filepath='src/workqueue.c' line='347' column='1'/>
+      <!-- parameter of type 'void (urcu_work*)*' -->
+      <parameter type-id='type-id-57' name='func' filepath='src/workqueue.c' line='348' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_destroy(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_destroy' mangled-name='urcu_workqueue_destroy' filepath='src/workqueue.c' line='334' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_destroy'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='458' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- urcu_workqueue* urcu_workqueue_create(unsigned long int, int, void*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*) -->
+    <function-decl name='urcu_workqueue_create' mangled-name='urcu_workqueue_create' filepath='src/workqueue.c' line='269' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_create'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='flags' filepath='src/workqueue.c' line='269' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='cpu_affinity' filepath='src/workqueue.c' line='270' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='priv' filepath='src/workqueue.c' line='270' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='grace_period_fct' filepath='src/workqueue.c' line='271' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='initialize_worker_fct' filepath='src/workqueue.c' line='272' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='finalize_worker_fct' filepath='src/workqueue.c' line='273' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_before_wait_fct' filepath='src/workqueue.c' line='274' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_after_wake_up_fct' filepath='src/workqueue.c' line='275' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_before_pause_fct' filepath='src/workqueue.c' line='276' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_after_resume_fct' filepath='src/workqueue.c' line='277' column='1'/>
+      <!-- urcu_workqueue* -->
+      <return type-id='type-id-51'/>
+    </function-decl>
+    <!-- void (urcu_work*) -->
+    <function-type size-in-bits='64' id='type-id-59'>
+      <!-- parameter of type 'urcu_work*' -->
+      <parameter type-id='type-id-58'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (urcu_workqueue*, void*) -->
+    <function-type size-in-bits='64' id='type-id-52'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfht -->
+    <class-decl name='cds_lfht' size-in-bits='5248' is-struct='yes' visibility='default' filepath='../src/rculfhash-internal.h' line='70' column='1' id='type-id-60'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int cds_lfht::max_nr_buckets -->
+        <var-decl name='max_nr_buckets' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- const cds_lfht_mm_type* cds_lfht::mm -->
+        <var-decl name='mm' type-id='type-id-61' visibility='default' filepath='../src/rculfhash-internal.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- const rcu_flavor_struct* cds_lfht::flavor -->
+        <var-decl name='flavor' type-id='type-id-62' visibility='default' filepath='../src/rculfhash-internal.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- long int cds_lfht::count -->
+        <var-decl name='count' type-id='type-id-32' visibility='default' filepath='../src/rculfhash-internal.h' line='76' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- pthread_mutex_t cds_lfht::resize_mutex -->
+        <var-decl name='resize_mutex' type-id='type-id-28' visibility='default' filepath='../src/rculfhash-internal.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- pthread_attr_t* cds_lfht::resize_attr -->
+        <var-decl name='resize_attr' type-id='type-id-63' visibility='default' filepath='../src/rculfhash-internal.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- unsigned int cds_lfht::in_progress_destroy -->
+        <var-decl name='in_progress_destroy' type-id='type-id-33' visibility='default' filepath='../src/rculfhash-internal.h' line='87' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- unsigned long int cds_lfht::resize_target -->
+        <var-decl name='resize_target' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='88' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- int cds_lfht::resize_initiated -->
+        <var-decl name='resize_initiated' type-id='type-id-3' visibility='default' filepath='../src/rculfhash-internal.h' line='89' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='800'>
+        <!-- int cds_lfht::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='../src/rculfhash-internal.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- unsigned long int cds_lfht::min_alloc_buckets_order -->
+        <var-decl name='min_alloc_buckets_order' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='95' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='896'>
+        <!-- unsigned long int cds_lfht::min_nr_alloc_buckets -->
+        <var-decl name='min_nr_alloc_buckets' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='96' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='960'>
+        <!-- ht_items_count* cds_lfht::split_count -->
+        <var-decl name='split_count' type-id='type-id-64' visibility='default' filepath='../src/rculfhash-internal.h' line='97' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- unsigned long int cds_lfht::size -->
+        <var-decl name='size' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='102' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1088'>
+        <!-- cds_lfht_node* (cds_lfht*, unsigned long int)* cds_lfht::bucket_at -->
+        <var-decl name='bucket_at' type-id='type-id-65' visibility='default' filepath='../src/rculfhash-internal.h' line='107' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-66' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_lfht_mm_type -->
+    <class-decl name='cds_lfht_mm_type' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/rculfhash.h' line='120' column='1' id='type-id-67'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfht* (unsigned long int, unsigned long int)* cds_lfht_mm_type::alloc_cds_lfht -->
+        <var-decl name='alloc_cds_lfht' type-id='type-id-68' visibility='default' filepath='../include/urcu/rculfhash.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (cds_lfht*, unsigned long int)* cds_lfht_mm_type::alloc_bucket_table -->
+        <var-decl name='alloc_bucket_table' type-id='type-id-69' visibility='default' filepath='../include/urcu/rculfhash.h' line='123' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (cds_lfht*, unsigned long int)* cds_lfht_mm_type::free_bucket_table -->
+        <var-decl name='free_bucket_table' type-id='type-id-69' visibility='default' filepath='../include/urcu/rculfhash.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- cds_lfht_node* (cds_lfht*, unsigned long int)* cds_lfht_mm_type::bucket_at -->
+        <var-decl name='bucket_at' type-id='type-id-65' visibility='default' filepath='../include/urcu/rculfhash.h' line='125' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfht* -->
+    <pointer-type-def type-id='type-id-60' size-in-bits='64' id='type-id-70'/>
+    <!-- cds_lfht* (unsigned long int, unsigned long int)* -->
+    <pointer-type-def type-id='type-id-71' size-in-bits='64' id='type-id-68'/>
+    <!-- void (cds_lfht*, unsigned long int)* -->
+    <pointer-type-def type-id='type-id-72' size-in-bits='64' id='type-id-69'/>
+    <!-- struct cds_lfht_node -->
+    <class-decl name='cds_lfht_node' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/rculfhash.h' line='63' column='1' id='type-id-73'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfht_node* cds_lfht_node::next -->
+        <var-decl name='next' type-id='type-id-74' visibility='default' filepath='../include/urcu/rculfhash.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- unsigned long int cds_lfht_node::reverse_hash -->
+        <var-decl name='reverse_hash' type-id='type-id-39' visibility='default' filepath='../include/urcu/rculfhash.h' line='65' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfht_node* -->
+    <pointer-type-def type-id='type-id-73' size-in-bits='64' id='type-id-74'/>
+    <!-- cds_lfht_node* (cds_lfht*, unsigned long int)* -->
+    <pointer-type-def type-id='type-id-75' size-in-bits='64' id='type-id-65'/>
+    <!-- const cds_lfht_mm_type -->
+    <qualified-type-def type-id='type-id-67' const='yes' id='type-id-76'/>
+    <!-- const cds_lfht_mm_type* -->
+    <pointer-type-def type-id='type-id-76' size-in-bits='64' id='type-id-61'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-77'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-79' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-5' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-80' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-81' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-81' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-82' size-in-bits='64' id='type-id-78'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-83' size-in-bits='64' id='type-id-79'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-84' size-in-bits='64' id='type-id-85'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-86' size-in-bits='64' id='type-id-80'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-87'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-85' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-85' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-85' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-48' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-87' size-in-bits='64' id='type-id-88'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-89' size-in-bits='64' id='type-id-81'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-77' const='yes' id='type-id-90'/>
+    <!-- const rcu_flavor_struct* -->
+    <pointer-type-def type-id='type-id-90' size-in-bits='64' id='type-id-62'/>
+    <!-- union pthread_attr_t -->
+    <union-decl name='pthread_attr_t' size-in-bits='448' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='56' column='1' id='type-id-91'>
+      <data-member access='private'>
+        <!-- char pthread_attr_t::__size[56] -->
+        <var-decl name='__size' type-id='type-id-92' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int pthread_attr_t::__align -->
+        <var-decl name='__align' type-id='type-id-32' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='59' column='1'/>
+      </data-member>
+    </union-decl>
+
+    <!-- char[56] -->
+    <array-type-def dimensions='1' type-id='type-id-38' size-in-bits='448' id='type-id-92'>
+      <!-- <anonymous range>[56] -->
+      <subrange length='56' type-id='type-id-39' id='type-id-93'/>
+
+    </array-type-def>
+    <!-- typedef pthread_attr_t pthread_attr_t -->
+    <typedef-decl name='pthread_attr_t' type-id='type-id-91' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='62' column='1' id='type-id-94'/>
+    <!-- pthread_attr_t* -->
+    <pointer-type-def type-id='type-id-94' size-in-bits='64' id='type-id-63'/>
+    <!-- struct ht_items_count -->
+    <class-decl name='ht_items_count' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/rculfhash.c' line='338' column='1' id='type-id-95'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int ht_items_count::add -->
+        <var-decl name='add' type-id='type-id-39' visibility='default' filepath='src/rculfhash.c' line='339' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- unsigned long int ht_items_count::del -->
+        <var-decl name='del' type-id='type-id-39' visibility='default' filepath='src/rculfhash.c' line='339' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- ht_items_count* -->
+    <pointer-type-def type-id='type-id-95' size-in-bits='64' id='type-id-64'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='4096' is-anonymous='yes' visibility='default' filepath='../src/rculfhash-internal.h' line='113' column='1' id='type-id-66'>
+      <data-member access='private'>
+        <!-- cds_lfht_node* __anonymous_union__::tbl_order[64] -->
+        <var-decl name='tbl_order' type-id='type-id-96' visibility='default' filepath='../src/rculfhash-internal.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_lfht_node* __anonymous_union__::tbl_chunk[1] -->
+        <var-decl name='tbl_chunk' type-id='type-id-97' visibility='default' filepath='../src/rculfhash-internal.h' line='134' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_lfht_node* __anonymous_union__::tbl_mmap -->
+        <var-decl name='tbl_mmap' type-id='type-id-74' visibility='default' filepath='../src/rculfhash-internal.h' line='140' column='1'/>
+      </data-member>
+    </union-decl>
+
+    <!-- cds_lfht_node*[64] -->
+    <array-type-def dimensions='1' type-id='type-id-74' size-in-bits='4096' id='type-id-96'>
+      <!-- <anonymous range>[64] -->
+      <subrange length='64' type-id='type-id-39' id='type-id-98'/>
+
+    </array-type-def>
+
+    <!-- cds_lfht_node*[1] -->
+    <array-type-def dimensions='1' type-id='type-id-74' size-in-bits='64' id='type-id-97'>
+      <!-- <anonymous range>[1] -->
+      <subrange length='1' type-id='type-id-39' id='type-id-99'/>
+
+    </array-type-def>
+    <!-- void cds_lfht_resize(cds_lfht*, unsigned long int) -->
+    <function-decl name='cds_lfht_resize' mangled-name='cds_lfht_resize' filepath='src/rculfhash.c' line='2028' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_resize'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='2028' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='new_size' filepath='src/rculfhash.c' line='2028' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- long int* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-100'/>
+    <!-- unsigned long int* -->
+    <pointer-type-def type-id='type-id-39' size-in-bits='64' id='type-id-101'/>
+    <!-- void cds_lfht_count_nodes(cds_lfht*, long int*, unsigned long int*, long int*) -->
+    <function-decl name='cds_lfht_count_nodes' mangled-name='cds_lfht_count_nodes' filepath='src/rculfhash.c' line='1906' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_count_nodes'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1906' column='1'/>
+      <!-- parameter of type 'long int*' -->
+      <parameter type-id='type-id-100' name='approx_before' filepath='src/rculfhash.c' line='1907' column='1'/>
+      <!-- parameter of type 'unsigned long int*' -->
+      <parameter type-id='type-id-101' name='count' filepath='src/rculfhash.c' line='1908' column='1'/>
+      <!-- parameter of type 'long int*' -->
+      <parameter type-id='type-id-100' name='approx_after' filepath='src/rculfhash.c' line='1909' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- pthread_attr_t** -->
+    <pointer-type-def type-id='type-id-63' size-in-bits='64' id='type-id-102'/>
+    <!-- int cds_lfht_destroy(cds_lfht*, pthread_attr_t**) -->
+    <function-decl name='cds_lfht_destroy' mangled-name='cds_lfht_destroy' filepath='src/rculfhash.c' line='1881' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_destroy'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1881' column='1'/>
+      <!-- parameter of type 'pthread_attr_t**' -->
+      <parameter type-id='type-id-102' name='attr' filepath='src/rculfhash.c' line='1881' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- int cds_lfht_is_node_deleted(cds_lfht_node*) -->
+    <function-decl name='cds_lfht_is_node_deleted' mangled-name='cds_lfht_is_node_deleted' filepath='src/rculfhash.c' line='1838' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_is_node_deleted'>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1838' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- int cds_lfht_del(cds_lfht*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_del' mangled-name='cds_lfht_del' filepath='src/rculfhash.c' line='1822' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_del'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1822' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1822' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- struct cds_lfht_iter -->
+    <class-decl name='cds_lfht_iter' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/rculfhash.h' line='69' column='1' id='type-id-103'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfht_node* cds_lfht_iter::node -->
+        <var-decl name='node' type-id='type-id-74' visibility='default' filepath='../include/urcu/rculfhash.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_lfht_node* cds_lfht_iter::next -->
+        <var-decl name='next' type-id='type-id-74' visibility='default' filepath='../include/urcu/rculfhash.h' line='70' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfht_iter* -->
+    <pointer-type-def type-id='type-id-103' size-in-bits='64' id='type-id-104'/>
+    <!-- int (cds_lfht_node*, void*)* -->
+    <pointer-type-def type-id='type-id-105' size-in-bits='64' id='type-id-106'/>
+    <!-- typedef int (cds_lfht_node*, void*)* cds_lfht_match_fct -->
+    <typedef-decl name='cds_lfht_match_fct' type-id='type-id-106' filepath='../include/urcu/rculfhash.h' line='98' column='1' id='type-id-107'/>
+    <!-- int cds_lfht_replace(cds_lfht*, cds_lfht_iter*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_replace' mangled-name='cds_lfht_replace' filepath='src/rculfhash.c' line='1801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_replace'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1801' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-104' name='old_iter' filepath='src/rculfhash.c' line='1802' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1803' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-107' name='match' filepath='src/rculfhash.c' line='1804' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1805' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='new_node' filepath='src/rculfhash.c' line='1806' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- cds_lfht_node* cds_lfht_add_replace(cds_lfht*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_add_replace' mangled-name='cds_lfht_add_replace' filepath='src/rculfhash.c' line='1778' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_add_replace'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1778' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1779' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-107' name='match' filepath='src/rculfhash.c' line='1780' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1781' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1782' column='1'/>
+      <!-- cds_lfht_node* -->
+      <return type-id='type-id-74'/>
+    </function-decl>
+    <!-- cds_lfht_node* cds_lfht_add_unique(cds_lfht*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_add_unique' mangled-name='cds_lfht_add_unique' filepath='src/rculfhash.c' line='1761' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_add_unique'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1778' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1779' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-107' name='match' filepath='src/rculfhash.c' line='1780' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1781' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1782' column='1'/>
+      <!-- cds_lfht_node* -->
+      <return type-id='type-id-74'/>
+    </function-decl>
+    <!-- void cds_lfht_add(cds_lfht*, unsigned long int, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_add' mangled-name='cds_lfht_add' filepath='src/rculfhash.c' line='1750' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_add'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1750' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1750' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1751' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_first(cds_lfht*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_first' mangled-name='cds_lfht_first' filepath='src/rculfhash.c' line='1739' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_first'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1739' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-104' name='iter' filepath='src/rculfhash.c' line='1739' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_next(cds_lfht*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_next' mangled-name='cds_lfht_next' filepath='src/rculfhash.c' line='1715' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_next'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1715' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-104' name='iter' filepath='src/rculfhash.c' line='1716' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_next_duplicate(cds_lfht*, cds_lfht_match_fct, void*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_next_duplicate' mangled-name='cds_lfht_next_duplicate' filepath='src/rculfhash.c' line='1680' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_next_duplicate'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1680' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-107' name='match' filepath='src/rculfhash.c' line='1681' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1682' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-104' name='iter' filepath='src/rculfhash.c' line='1682' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_lookup(cds_lfht*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_lookup' mangled-name='cds_lfht_lookup' filepath='src/rculfhash.c' line='1640' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_lookup'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1640' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1640' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-107' name='match' filepath='src/rculfhash.c' line='1641' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1641' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-104' name='iter' filepath='src/rculfhash.c' line='1642' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- cds_lfht* _cds_lfht_new(unsigned long int, unsigned long int, unsigned long int, int, const cds_lfht_mm_type*, const rcu_flavor_struct*, pthread_attr_t*) -->
+    <function-decl name='_cds_lfht_new' mangled-name='_cds_lfht_new' filepath='src/rculfhash.c' line='1581' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_cds_lfht_new'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='init_size' filepath='src/rculfhash.c' line='1581' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='min_nr_alloc_buckets' filepath='src/rculfhash.c' line='1582' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='max_nr_buckets' filepath='src/rculfhash.c' line='1583' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/rculfhash.c' line='1584' column='1'/>
+      <!-- parameter of type 'const cds_lfht_mm_type*' -->
+      <parameter type-id='type-id-61' name='mm' filepath='src/rculfhash.c' line='1585' column='1'/>
+      <!-- parameter of type 'const rcu_flavor_struct*' -->
+      <parameter type-id='type-id-62' name='flavor' filepath='src/rculfhash.c' line='1586' column='1'/>
+      <!-- parameter of type 'pthread_attr_t*' -->
+      <parameter type-id='type-id-63' name='attr' filepath='src/rculfhash.c' line='1587' column='1'/>
+      <!-- cds_lfht* -->
+      <return type-id='type-id-70'/>
+    </function-decl>
+    <!-- int cds_lfht_get_count_order_ulong(unsigned long int) -->
+    <function-decl name='cds_lfht_get_count_order_ulong' mangled-name='cds_lfht_get_count_order_ulong' filepath='src/rculfhash.c' line='598' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_get_count_order_ulong'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='x' filepath='src/rculfhash.c' line='598' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- unsigned int cds_lfht_fls_ulong(unsigned long int) -->
+    <function-decl name='cds_lfht_fls_ulong' mangled-name='cds_lfht_fls_ulong' filepath='src/rculfhash.c' line='572' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_fls_ulong'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='x' filepath='src/rculfhash.c' line='572' column='1'/>
+      <!-- unsigned int -->
+      <return type-id='type-id-33'/>
+    </function-decl>
+    <!-- cds_lfht* (unsigned long int, unsigned long int) -->
+    <function-type size-in-bits='64' id='type-id-71'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- cds_lfht* -->
+      <return type-id='type-id-70'/>
+    </function-type>
+    <!-- cds_lfht_node* (cds_lfht*, unsigned long int) -->
+    <function-type size-in-bits='64' id='type-id-75'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- cds_lfht_node* -->
+      <return type-id='type-id-74'/>
+    </function-type>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-83'>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-type>
+    <!-- int (cds_lfht_node*, void*) -->
+    <function-type size-in-bits='64' id='type-id-105'>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-82'>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (cds_lfht*, unsigned long int) -->
+    <function-type size-in-bits='64' id='type-id-72'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-89'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-88'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-86'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-85'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-84'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash-mm-order.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- const cds_lfht_mm_type cds_lfht_mm_order -->
+    <var-decl name='cds_lfht_mm_order' type-id='type-id-76' mangled-name='cds_lfht_mm_order' visibility='default' filepath='../include/urcu/rculfhash.h' line='129' column='1' elf-symbol-id='cds_lfht_mm_order'/>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash-mm-chunk.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- const cds_lfht_mm_type cds_lfht_mm_chunk -->
+    <var-decl name='cds_lfht_mm_chunk' type-id='type-id-76' mangled-name='cds_lfht_mm_chunk' visibility='default' filepath='../include/urcu/rculfhash.h' line='130' column='1' elf-symbol-id='cds_lfht_mm_chunk'/>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash-mm-mmap.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- const cds_lfht_mm_type cds_lfht_mm_mmap -->
+    <var-decl name='cds_lfht_mm_mmap' type-id='type-id-76' mangled-name='cds_lfht_mm_mmap' visibility='default' filepath='../include/urcu/rculfhash.h' line='131' column='1' elf-symbol-id='cds_lfht_mm_mmap'/>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-28' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-108'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-109' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-110' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-111' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-109'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-112' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-113' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-113' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-113' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-112'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-114' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-115' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-114'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-115'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-33' size-in-bits='64' id='type-id-113'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-39' id='type-id-116'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-38' size-in-bits='384' id='type-id-110'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-39' id='type-id-117'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-111'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-108' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-118'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-118' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-119'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-120'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-121' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-122' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-32' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-121'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-32' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-122'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-120' const='yes' id='type-id-123'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-123' size-in-bits='64' id='type-id-124'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-119' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-124' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-119' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-119' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-124' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-119' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-common.so.6.xml b/extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-common.so.6.xml
new file mode 100644 (file)
index 0000000..e7aef91
--- /dev/null
@@ -0,0 +1,910 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-common.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- __cds_wfcq_dequeue_blocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_dequeue_nonblocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_dequeue_with_state_blocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_dequeue_with_state_nonblocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_with_state_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_first_blocking -->
+    <elf-symbol name='__cds_wfcq_first_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_first_nonblocking -->
+    <elf-symbol name='__cds_wfcq_first_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_init -->
+    <elf-symbol name='__cds_wfcq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_next_blocking -->
+    <elf-symbol name='__cds_wfcq_next_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_next_nonblocking -->
+    <elf-symbol name='__cds_wfcq_next_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_splice_blocking -->
+    <elf-symbol name='__cds_wfcq_splice_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_splice_nonblocking -->
+    <elf-symbol name='__cds_wfcq_splice_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfq_dequeue_blocking -->
+    <elf-symbol name='__cds_wfq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_init -->
+    <elf-symbol name='__cds_wfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_all -->
+    <elf-symbol name='__cds_wfs_pop_all' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_blocking -->
+    <elf-symbol name='__cds_wfs_pop_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_nonblocking -->
+    <elf-symbol name='__cds_wfs_pop_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_with_state_blocking -->
+    <elf-symbol name='__cds_wfs_pop_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_with_state_nonblocking -->
+    <elf-symbol name='__cds_wfs_pop_with_state_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_blocking -->
+    <elf-symbol name='cds_wfcq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_lock -->
+    <elf-symbol name='cds_wfcq_dequeue_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_unlock -->
+    <elf-symbol name='cds_wfcq_dequeue_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_with_state_blocking -->
+    <elf-symbol name='cds_wfcq_dequeue_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_destroy -->
+    <elf-symbol name='cds_wfcq_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_empty -->
+    <elf-symbol name='cds_wfcq_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_enqueue -->
+    <elf-symbol name='cds_wfcq_enqueue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_init -->
+    <elf-symbol name='cds_wfcq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_node_init -->
+    <elf-symbol name='cds_wfcq_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_splice_blocking -->
+    <elf-symbol name='cds_wfcq_splice_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_dequeue_blocking -->
+    <elf-symbol name='cds_wfq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_destroy -->
+    <elf-symbol name='cds_wfq_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_enqueue -->
+    <elf-symbol name='cds_wfq_enqueue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_init -->
+    <elf-symbol name='cds_wfq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_node_init -->
+    <elf-symbol name='cds_wfq_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_destroy -->
+    <elf-symbol name='cds_wfs_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_empty -->
+    <elf-symbol name='cds_wfs_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_first -->
+    <elf-symbol name='cds_wfs_first' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_init -->
+    <elf-symbol name='cds_wfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_next_blocking -->
+    <elf-symbol name='cds_wfs_next_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_next_nonblocking -->
+    <elf-symbol name='cds_wfs_next_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_node_init -->
+    <elf-symbol name='cds_wfs_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_all_blocking -->
+    <elf-symbol name='cds_wfs_pop_all_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_blocking -->
+    <elf-symbol name='cds_wfs_pop_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_lock -->
+    <elf-symbol name='cds_wfs_pop_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_unlock -->
+    <elf-symbol name='cds_wfs_pop_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_with_state_blocking -->
+    <elf-symbol name='cds_wfs_pop_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_push -->
+    <elf-symbol name='cds_wfs_push' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='wfqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_wfq_node -->
+    <class-decl name='cds_wfq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfqueue.h' line='48' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfq_node* cds_wfq_node::next -->
+        <var-decl name='next' type-id='type-id-2' visibility='default' filepath='../include/urcu/wfqueue.h' line='49' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfq_node* -->
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' id='type-id-2'/>
+    <!-- struct cds_wfq_queue -->
+    <class-decl name='cds_wfq_queue' size-in-bits='512' is-struct='yes' visibility='default' filepath='../include/urcu/wfqueue.h' line='52' column='1' id='type-id-3'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfq_node* cds_wfq_queue::head -->
+        <var-decl name='head' type-id='type-id-2' visibility='default' filepath='../include/urcu/wfqueue.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfq_node** cds_wfq_queue::tail -->
+        <var-decl name='tail' type-id='type-id-4' visibility='default' filepath='../include/urcu/wfqueue.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- cds_wfq_node cds_wfq_queue::dummy -->
+        <var-decl name='dummy' type-id='type-id-1' visibility='default' filepath='../include/urcu/wfqueue.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- pthread_mutex_t cds_wfq_queue::lock -->
+        <var-decl name='lock' type-id='type-id-5' visibility='default' filepath='../include/urcu/wfqueue.h' line='55' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfq_node** -->
+    <pointer-type-def type-id='type-id-2' size-in-bits='64' id='type-id-4'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-6'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-7' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-7'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-12' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-12' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-13' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-10'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-11'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-12'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-14'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-14' size-in-bits='64' id='type-id-15'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-14' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-13'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-16'/>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-17'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='320' id='type-id-8'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-17' id='type-id-18'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-9'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-6' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-5'/>
+    <!-- cds_wfq_queue* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-19'/>
+    <!-- cds_wfq_node* cds_wfq_dequeue_blocking(cds_wfq_queue*) -->
+    <function-decl name='cds_wfq_dequeue_blocking' mangled-name='cds_wfq_dequeue_blocking' filepath='src/wfqueue.c' line='59' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_dequeue_blocking'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='59' column='1'/>
+      <!-- cds_wfq_node* -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- cds_wfq_node* __cds_wfq_dequeue_blocking(cds_wfq_queue*) -->
+    <function-decl name='__cds_wfq_dequeue_blocking' mangled-name='__cds_wfq_dequeue_blocking' filepath='src/wfqueue.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfq_dequeue_blocking'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='59' column='1'/>
+      <!-- cds_wfq_node* -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-20'/>
+    <!-- void cds_wfq_enqueue(cds_wfq_queue*, cds_wfq_node*) -->
+    <function-decl name='cds_wfq_enqueue' mangled-name='cds_wfq_enqueue' filepath='src/wfqueue.c' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_enqueue'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='49' column='1'/>
+      <!-- parameter of type 'cds_wfq_node*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/wfqueue.c' line='49' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfq_destroy(cds_wfq_queue*) -->
+    <function-decl name='cds_wfq_destroy' mangled-name='cds_wfq_destroy' filepath='src/wfqueue.c' line='44' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_destroy'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='44' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfq_init(cds_wfq_queue*) -->
+    <function-decl name='cds_wfq_init' mangled-name='cds_wfq_init' filepath='src/wfqueue.c' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_init'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='44' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfq_node_init(cds_wfq_node*) -->
+    <function-decl name='cds_wfq_node_init' mangled-name='cds_wfq_node_init' filepath='src/wfqueue.c' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_node_init'>
+      <!-- parameter of type 'cds_wfq_node*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/wfqueue.c' line='34' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='wfcqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-22'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='83' column='1' id='type-id-23'>
+      <data-member access='private'>
+        <!-- __cds_wfcq_head* __anonymous_union__::_h -->
+        <var-decl name='_h' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_wfcq_head* __anonymous_union__::h -->
+        <var-decl name='h' type-id='type-id-25' visibility='default' filepath='../include/urcu/wfcqueue.h' line='85' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __cds_wfcq_head -->
+    <class-decl name='__cds_wfcq_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='68' column='1' id='type-id-26'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node __cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __cds_wfcq_head* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-24'/>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-27'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-5' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_head* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-25'/>
+    <!-- typedef __anonymous_union__ cds_wfcq_head_ptr_t -->
+    <typedef-decl name='cds_wfcq_head_ptr_t' type-id='type-id-23' filepath='../include/urcu/wfcqueue.h' line='86' column='1' id='type-id-28'/>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-29'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_tail* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- cds_wfcq_node* __cds_wfcq_next_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_node*) -->
+    <function-decl name='__cds_wfcq_next_nonblocking' mangled-name='__cds_wfcq_next_nonblocking' filepath='src/wfcqueue.c' line='178' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_next_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='179' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='180' column='1'/>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='181' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_next_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_node*) -->
+    <function-decl name='__cds_wfcq_next_blocking' mangled-name='__cds_wfcq_next_blocking' filepath='src/wfcqueue.c' line='170' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_next_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='179' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='180' column='1'/>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='181' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_first_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_first_nonblocking' mangled-name='__cds_wfcq_first_nonblocking' filepath='src/wfcqueue.c' line='163' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_first_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_first_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_first_blocking' mangled-name='__cds_wfcq_first_blocking' filepath='src/wfcqueue.c' line='156' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_first_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- unnamed&#45;enum&#45;underlying&#45;type -->
+    <type-decl name='unnamed-enum-underlying-type' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-31'/>
+    <!-- enum cds_wfcq_ret -->
+    <enum-decl name='cds_wfcq_ret' filepath='../include/urcu/wfcqueue.h' line='48' column='1' id='type-id-32'>
+      <underlying-type type-id='type-id-31'/>
+      <enumerator name='CDS_WFCQ_RET_WOULDBLOCK' value='-1'/>
+      <enumerator name='CDS_WFCQ_RET_DEST_EMPTY' value='0'/>
+      <enumerator name='CDS_WFCQ_RET_DEST_NON_EMPTY' value='1'/>
+      <enumerator name='CDS_WFCQ_RET_SRC_EMPTY' value='2'/>
+    </enum-decl>
+    <!-- cds_wfcq_ret __cds_wfcq_splice_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_splice_nonblocking' mangled-name='__cds_wfcq_splice_nonblocking' filepath='src/wfcqueue.c' line='146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_splice_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='dest_q_head' filepath='src/wfcqueue.c' line='147' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='dest_q_tail' filepath='src/wfcqueue.c' line='148' column='1'/>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='src_q_head' filepath='src/wfcqueue.c' line='149' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='src_q_tail' filepath='src/wfcqueue.c' line='150' column='1'/>
+      <!-- enum cds_wfcq_ret -->
+      <return type-id='type-id-32'/>
+    </function-decl>
+    <!-- cds_wfcq_ret __cds_wfcq_splice_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_splice_blocking' mangled-name='__cds_wfcq_splice_blocking' filepath='src/wfcqueue.c' line='136' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_splice_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='dest_q_head' filepath='src/wfcqueue.c' line='147' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='dest_q_tail' filepath='src/wfcqueue.c' line='148' column='1'/>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='src_q_head' filepath='src/wfcqueue.c' line='149' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='src_q_tail' filepath='src/wfcqueue.c' line='150' column='1'/>
+      <!-- enum cds_wfcq_ret -->
+      <return type-id='type-id-32'/>
+    </function-decl>
+    <!-- int* -->
+    <pointer-type-def type-id='type-id-10' size-in-bits='64' id='type-id-33'/>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_with_state_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, int*) -->
+    <function-decl name='__cds_wfcq_dequeue_with_state_nonblocking' mangled-name='__cds_wfcq_dequeue_with_state_nonblocking' filepath='src/wfcqueue.c' line='128' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_with_state_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='129' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='130' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfcqueue.c' line='131' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_dequeue_nonblocking' mangled-name='__cds_wfcq_dequeue_nonblocking' filepath='src/wfcqueue.c' line='121' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_with_state_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, int*) -->
+    <function-decl name='__cds_wfcq_dequeue_with_state_blocking' mangled-name='__cds_wfcq_dequeue_with_state_blocking' filepath='src/wfcqueue.c' line='113' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_with_state_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='129' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='130' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfcqueue.c' line='131' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_dequeue_blocking' mangled-name='__cds_wfcq_dequeue_blocking' filepath='src/wfcqueue.c' line='106' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_ret cds_wfcq_splice_blocking(cds_wfcq_head*, cds_wfcq_tail*, cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_splice_blocking' mangled-name='cds_wfcq_splice_blocking' filepath='src/wfcqueue.c' line='96' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_splice_blocking'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='dest_q_head' filepath='src/wfcqueue.c' line='97' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='dest_q_tail' filepath='src/wfcqueue.c' line='98' column='1'/>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='src_q_head' filepath='src/wfcqueue.c' line='99' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='src_q_tail' filepath='src/wfcqueue.c' line='100' column='1'/>
+      <!-- enum cds_wfcq_ret -->
+      <return type-id='type-id-32'/>
+    </function-decl>
+    <!-- cds_wfcq_node* cds_wfcq_dequeue_with_state_blocking(cds_wfcq_head*, cds_wfcq_tail*, int*) -->
+    <function-decl name='cds_wfcq_dequeue_with_state_blocking' mangled-name='cds_wfcq_dequeue_with_state_blocking' filepath='src/wfcqueue.c' line='88' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_with_state_blocking'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='89' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='90' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfcqueue.c' line='91' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* cds_wfcq_dequeue_blocking(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_dequeue_blocking' mangled-name='cds_wfcq_dequeue_blocking' filepath='src/wfcqueue.c' line='81' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_blocking'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='82' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='83' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- void cds_wfcq_dequeue_unlock(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_dequeue_unlock' mangled-name='cds_wfcq_dequeue_unlock' filepath='src/wfcqueue.c' line='75' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_unlock'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_dequeue_lock(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_dequeue_lock' mangled-name='cds_wfcq_dequeue_lock' filepath='src/wfcqueue.c' line='69' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_lock'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- bool -->
+    <type-decl name='bool' size-in-bits='8' id='type-id-34'/>
+    <!-- bool cds_wfcq_enqueue(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_node*) -->
+    <function-decl name='cds_wfcq_enqueue' mangled-name='cds_wfcq_enqueue' filepath='src/wfcqueue.c' line='62' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_enqueue'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='62' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='63' column='1'/>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='64' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <!-- bool cds_wfcq_empty(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_empty' mangled-name='cds_wfcq_empty' filepath='src/wfcqueue.c' line='55' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_empty'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='55' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='56' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <!-- void __cds_wfcq_init(__cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_init' mangled-name='__cds_wfcq_init' filepath='src/wfcqueue.c' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_init'>
+      <!-- parameter of type '__cds_wfcq_head*' -->
+      <parameter type-id='type-id-24' name='head' filepath='src/wfcqueue.c' line='49' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='50' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_destroy(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_destroy' mangled-name='cds_wfcq_destroy' filepath='src/wfcqueue.c' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_destroy'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_init(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_init' mangled-name='cds_wfcq_init' filepath='src/wfcqueue.c' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_init'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_node_init(cds_wfcq_node*) -->
+    <function-decl name='cds_wfcq_node_init' mangled-name='cds_wfcq_node_init' filepath='src/wfcqueue.c' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_node_init'>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='32' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='wfstack.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_wfs_head -->
+    <class-decl name='cds_wfs_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='82' column='1' id='type-id-35'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_node cds_wfs_head::node -->
+        <var-decl name='node' type-id='type-id-36' visibility='default' filepath='../include/urcu/wfstack.h' line='83' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfs_node -->
+    <class-decl name='cds_wfs_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='72' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_node* cds_wfs_node::next -->
+        <var-decl name='next' type-id='type-id-37' visibility='default' filepath='../include/urcu/wfstack.h' line='73' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfs_node* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-37'/>
+    <!-- cds_wfs_head* -->
+    <pointer-type-def type-id='type-id-35' size-in-bits='64' id='type-id-38'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='100' column='1' id='type-id-39'>
+      <data-member access='private'>
+        <!-- __cds_wfs_stack* __anonymous_union__::_s -->
+        <var-decl name='_s' type-id='type-id-40' visibility='default' filepath='../include/urcu/wfstack.h' line='101' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_wfs_stack* __anonymous_union__::s -->
+        <var-decl name='s' type-id='type-id-41' visibility='default' filepath='../include/urcu/wfstack.h' line='102' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __cds_wfs_stack -->
+    <class-decl name='__cds_wfs_stack' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='86' column='1' id='type-id-42'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_head* __cds_wfs_stack::head -->
+        <var-decl name='head' type-id='type-id-38' visibility='default' filepath='../include/urcu/wfstack.h' line='87' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __cds_wfs_stack* -->
+    <pointer-type-def type-id='type-id-42' size-in-bits='64' id='type-id-40'/>
+    <!-- struct cds_wfs_stack -->
+    <class-decl name='cds_wfs_stack' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='90' column='1' id='type-id-43'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_head* cds_wfs_stack::head -->
+        <var-decl name='head' type-id='type-id-38' visibility='default' filepath='../include/urcu/wfstack.h' line='91' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfs_stack::lock -->
+        <var-decl name='lock' type-id='type-id-5' visibility='default' filepath='../include/urcu/wfstack.h' line='92' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfs_stack* -->
+    <pointer-type-def type-id='type-id-43' size-in-bits='64' id='type-id-41'/>
+    <!-- typedef __anonymous_union__ cds_wfs_stack_ptr_t -->
+    <typedef-decl name='cds_wfs_stack_ptr_t' type-id='type-id-39' filepath='../include/urcu/wfstack.h' line='103' column='1' id='type-id-44'/>
+    <!-- cds_wfs_head* __cds_wfs_pop_all(cds_wfs_stack_ptr_t) -->
+    <function-decl name='__cds_wfs_pop_all' mangled-name='__cds_wfs_pop_all' filepath='src/wfstack.c' line='126' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_all'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='126' column='1'/>
+      <!-- cds_wfs_head* -->
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_with_state_nonblocking(cds_wfs_stack_ptr_t, int*) -->
+    <function-decl name='__cds_wfs_pop_with_state_nonblocking' mangled-name='__cds_wfs_pop_with_state_nonblocking' filepath='src/wfstack.c' line='120' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_with_state_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='120' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfstack.c' line='121' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_nonblocking(cds_wfs_stack_ptr_t) -->
+    <function-decl name='__cds_wfs_pop_nonblocking' mangled-name='__cds_wfs_pop_nonblocking' filepath='src/wfstack.c' line='114' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='114' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_with_state_blocking(cds_wfs_stack_ptr_t, int*) -->
+    <function-decl name='__cds_wfs_pop_with_state_blocking' mangled-name='__cds_wfs_pop_with_state_blocking' filepath='src/wfstack.c' line='108' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_with_state_blocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='120' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfstack.c' line='121' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_blocking(cds_wfs_stack_ptr_t) -->
+    <function-decl name='__cds_wfs_pop_blocking' mangled-name='__cds_wfs_pop_blocking' filepath='src/wfstack.c' line='102' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_blocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='114' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- void cds_wfs_pop_unlock(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_unlock' mangled-name='cds_wfs_pop_unlock' filepath='src/wfstack.c' line='97' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_unlock'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_pop_lock(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_lock' mangled-name='cds_wfs_pop_lock' filepath='src/wfstack.c' line='92' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_lock'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_next_nonblocking(cds_wfs_node*) -->
+    <function-decl name='cds_wfs_next_nonblocking' mangled-name='cds_wfs_next_nonblocking' filepath='src/wfstack.c' line='87' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_next_nonblocking'>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='87' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_next_blocking(cds_wfs_node*) -->
+    <function-decl name='cds_wfs_next_blocking' mangled-name='cds_wfs_next_blocking' filepath='src/wfstack.c' line='82' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_next_blocking'>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='87' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_first(cds_wfs_head*) -->
+    <function-decl name='cds_wfs_first' mangled-name='cds_wfs_first' filepath='src/wfstack.c' line='77' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_first'>
+      <!-- parameter of type 'cds_wfs_head*' -->
+      <parameter type-id='type-id-38' name='head' filepath='src/wfstack.c' line='77' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_head* cds_wfs_pop_all_blocking(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_all_blocking' mangled-name='cds_wfs_pop_all_blocking' filepath='src/wfstack.c' line='72' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_all_blocking'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='72' column='1'/>
+      <!-- cds_wfs_head* -->
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_pop_with_state_blocking(cds_wfs_stack*, int*) -->
+    <function-decl name='cds_wfs_pop_with_state_blocking' mangled-name='cds_wfs_pop_with_state_blocking' filepath='src/wfstack.c' line='67' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_with_state_blocking'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='67' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfstack.c' line='67' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_pop_blocking(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_blocking' mangled-name='cds_wfs_pop_blocking' filepath='src/wfstack.c' line='61' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_blocking'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='61' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- int cds_wfs_push(cds_wfs_stack_ptr_t, cds_wfs_node*) -->
+    <function-decl name='cds_wfs_push' mangled-name='cds_wfs_push' filepath='src/wfstack.c' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_push'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='56' column='1'/>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='56' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-10'/>
+    </function-decl>
+    <!-- bool cds_wfs_empty(cds_wfs_stack_ptr_t) -->
+    <function-decl name='cds_wfs_empty' mangled-name='cds_wfs_empty' filepath='src/wfstack.c' line='51' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_empty'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='51' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <!-- void __cds_wfs_init(__cds_wfs_stack*) -->
+    <function-decl name='__cds_wfs_init' mangled-name='__cds_wfs_init' filepath='src/wfstack.c' line='46' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_init'>
+      <!-- parameter of type '__cds_wfs_stack*' -->
+      <parameter type-id='type-id-40' name='s' filepath='src/wfstack.c' line='46' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_destroy(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_destroy' mangled-name='cds_wfs_destroy' filepath='src/wfstack.c' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_destroy'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_init(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_init' mangled-name='cds_wfs_init' filepath='src/wfstack.c' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_init'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_node_init(cds_wfs_node*) -->
+    <function-decl name='cds_wfs_node_init' mangled-name='cds_wfs_node_init' filepath='src/wfstack.c' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_node_init'>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='31' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-5' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-45'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-48' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-49' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-50' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-50' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-50' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-49'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-51' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-51'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-11' size-in-bits='64' id='type-id-50'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-17' id='type-id-53'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='384' id='type-id-47'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-17' id='type-id-54'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-48'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-45' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-55'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-55' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-10' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-56'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-56' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-57'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-57' size-in-bits='64' id='type-id-58'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-59'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-60' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-61' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-9' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-60'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-9' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-61'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-59' const='yes' id='type-id-62'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-62' size-in-bits='64' id='type-id-63'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-10' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-63' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-10'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-10' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-63' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-10'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-mb.so.6.xml b/extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-mb.so.6.xml
new file mode 100644 (file)
index 0000000..400eb0b
--- /dev/null
@@ -0,0 +1,919 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-mb.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_child_mb -->
+    <elf-symbol name='call_rcu_after_fork_child_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_call_rcu_after_fork_child' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_mb -->
+    <elf-symbol name='call_rcu_after_fork_parent_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_call_rcu_after_fork_parent' is-defined='yes'/>
+    <!-- call_rcu_before_fork_mb -->
+    <elf-symbol name='call_rcu_before_fork_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_data_free_mb -->
+    <elf-symbol name='call_rcu_data_free_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_call_rcu_data_free' is-defined='yes'/>
+    <!-- call_rcu_mb -->
+    <elf-symbol name='call_rcu_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_mb -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_create_all_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- create_call_rcu_data_mb -->
+    <elf-symbol name='create_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_create_call_rcu_data' is-defined='yes'/>
+    <!-- defer_rcu_mb -->
+    <elf-symbol name='defer_rcu_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_defer_rcu' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data_mb -->
+    <elf-symbol name='free_all_cpu_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_free_all_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- get_call_rcu_data_mb -->
+    <elf-symbol name='get_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_thread_mb -->
+    <elf-symbol name='get_call_rcu_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_get_call_rcu_thread' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_mb -->
+    <elf-symbol name='get_cpu_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_get_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_mb -->
+    <elf-symbol name='get_default_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_mb -->
+    <elf-symbol name='get_thread_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_get_thread_call_rcu_data' is-defined='yes'/>
+    <!-- rcu_barrier_mb -->
+    <elf-symbol name='rcu_barrier_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_mb -->
+    <elf-symbol name='rcu_defer_barrier_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_defer_barrier' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_mb -->
+    <elf-symbol name='rcu_defer_barrier_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_defer_barrier_thread' is-defined='yes'/>
+    <!-- rcu_defer_exit_mb -->
+    <elf-symbol name='rcu_defer_exit_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_defer_exit' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_mb -->
+    <elf-symbol name='rcu_defer_register_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_defer_register_thread' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_mb -->
+    <elf-symbol name='rcu_defer_unregister_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_init_mb -->
+    <elf-symbol name='rcu_init_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_init' is-defined='yes'/>
+    <!-- rcu_read_lock_mb -->
+    <elf-symbol name='rcu_read_lock_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_read_lock' is-defined='yes'/>
+    <!-- rcu_read_ongoing_mb -->
+    <elf-symbol name='rcu_read_ongoing_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_read_ongoing' is-defined='yes'/>
+    <!-- rcu_read_unlock_mb -->
+    <elf-symbol name='rcu_read_unlock_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_read_unlock' is-defined='yes'/>
+    <!-- rcu_register_thread_mb -->
+    <elf-symbol name='rcu_register_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_unregister_thread_mb -->
+    <elf-symbol name='rcu_unregister_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_mb -->
+    <elf-symbol name='set_cpu_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_mb -->
+    <elf-symbol name='set_thread_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- synchronize_rcu_mb -->
+    <elf-symbol name='synchronize_rcu_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_synchronize_rcu' is-defined='yes'/>
+    <!-- urcu_mb_barrier -->
+    <elf-symbol name='urcu_mb_barrier' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_barrier_mb' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu -->
+    <elf-symbol name='urcu_mb_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_mb' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_mb_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_mb_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu_before_fork -->
+    <elf-symbol name='urcu_mb_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_before_fork_mb' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu_data_free -->
+    <elf-symbol name='urcu_mb_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_mb_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_create_call_rcu_data -->
+    <elf-symbol name='urcu_mb_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_barrier -->
+    <elf-symbol name='urcu_mb_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_barrier_thread -->
+    <elf-symbol name='urcu_mb_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_exit -->
+    <elf-symbol name='urcu_mb_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_rcu -->
+    <elf-symbol name='urcu_mb_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_register_thread -->
+    <elf-symbol name='urcu_mb_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_unregister_thread -->
+    <elf-symbol name='urcu_mb_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_unregister_thread_mb' is-defined='yes'/>
+    <!-- urcu_mb_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_mb_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_get_call_rcu_data -->
+    <elf-symbol name='urcu_mb_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_call_rcu_data_mb' is-defined='yes'/>
+    <!-- urcu_mb_get_call_rcu_thread -->
+    <elf-symbol name='urcu_mb_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_mb_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_mb_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_default_call_rcu_data_mb' is-defined='yes'/>
+    <!-- urcu_mb_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_mb_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_init -->
+    <elf-symbol name='urcu_mb_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_read_lock -->
+    <elf-symbol name='urcu_mb_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_read_ongoing -->
+    <elf-symbol name='urcu_mb_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_read_unlock -->
+    <elf-symbol name='urcu_mb_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_mb_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_register_rculfhash_atfork_mb' is-defined='yes'/>
+    <!-- urcu_mb_register_thread -->
+    <elf-symbol name='urcu_mb_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_register_thread_mb' is-defined='yes'/>
+    <!-- urcu_mb_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_mb_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='set_cpu_call_rcu_data_mb' is-defined='yes'/>
+    <!-- urcu_mb_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_mb_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='set_thread_call_rcu_data_mb' is-defined='yes'/>
+    <!-- urcu_mb_synchronize_rcu -->
+    <elf-symbol name='urcu_mb_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_mb_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_unregister_thread -->
+    <elf-symbol name='urcu_mb_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_unregister_thread_mb' is-defined='yes'/>
+    <!-- urcu_register_rculfhash_atfork_mb -->
+    <elf-symbol name='urcu_register_rculfhash_atfork_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_unregister_rculfhash_atfork_mb -->
+    <elf-symbol name='urcu_unregister_rculfhash_atfork_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_unregister_rculfhash_atfork' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_mb -->
+    <elf-symbol name='rcu_flavor_mb' size='112' type='object-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_flavor' is-defined='yes'/>
+    <!-- rcu_gp_mb -->
+    <elf-symbol name='rcu_gp_mb' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_reader_mb -->
+    <elf-symbol name='rcu_reader_mb' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_flavor -->
+    <elf-symbol name='urcu_mb_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_gp -->
+    <elf-symbol name='urcu_mb_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' alias='rcu_gp_mb' is-defined='yes'/>
+    <!-- urcu_mb_reader -->
+    <elf-symbol name='urcu_mb_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' alias='rcu_reader_mb' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='67' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='77' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-4' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-3'/>
+    <!-- urcu_gp urcu_mb_gp -->
+    <var-decl name='urcu_mb_gp' type-id='type-id-1' mangled-name='urcu_mb_gp' visibility='default' filepath='../include/urcu/static/urcu-mb.h' line='60' column='1' elf-symbol-id='urcu_mb_gp'/>
+    <!-- struct urcu_reader -->
+    <class-decl name='urcu_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='80' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char urcu_reader::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='83' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_reader::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_reader::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_reader::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='88' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- urcu_reader urcu_mb_reader -->
+    <var-decl name='urcu_mb_reader' type-id='type-id-6' mangled-name='urcu_mb_reader' visibility='default' filepath='../include/urcu/static/urcu-mb.h' line='62' column='1' elf-symbol-id='urcu_mb_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct urcu_mb_flavor -->
+    <var-decl name='urcu_mb_flavor' type-id='type-id-35' mangled-name='rcu_flavor_mb' visibility='default' filepath='../include/urcu/flavor.h' line='90' column='1' elf-symbol-id='rcu_flavor_mb'/>
+    <!-- void urcu_mb_defer_exit() -->
+    <function-decl name='urcu_mb_defer_exit' mangled-name='rcu_defer_exit_mb' filepath='src/urcu-defer-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_exit_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_defer_unregister_thread() -->
+    <function-decl name='urcu_mb_defer_unregister_thread' mangled-name='urcu_mb_defer_unregister_thread' filepath='src/urcu-defer-impl.h' line='456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_defer_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_mb_defer_register_thread() -->
+    <function-decl name='urcu_mb_defer_register_thread' mangled-name='rcu_defer_register_thread_mb' filepath='src/urcu-defer-impl.h' line='432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_register_thread_mb'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_mb_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_mb_defer_rcu' mangled-name='defer_rcu_mb' filepath='src/urcu-defer-impl.h' line='400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_mb'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_defer_barrier() -->
+    <function-decl name='urcu_mb_defer_barrier' mangled-name='rcu_defer_barrier_mb' filepath='src/urcu-defer-impl.h' line='284' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_defer_barrier_thread() -->
+    <function-decl name='urcu_mb_defer_barrier_thread' mangled-name='rcu_defer_barrier_thread_mb' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_mb_unregister_rculfhash_atfork' mangled-name='urcu_unregister_rculfhash_atfork_mb' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_unregister_rculfhash_atfork_mb'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_mb_register_rculfhash_atfork' mangled-name='urcu_mb_register_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1044' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_register_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_mb_call_rcu_after_fork_child' mangled-name='call_rcu_after_fork_child_mb' filepath='src/urcu-call-rcu-impl.h' line='1000' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_mb_call_rcu_after_fork_parent' mangled-name='call_rcu_after_fork_parent_mb' filepath='src/urcu-call-rcu-impl.h' line='976' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_parent_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_call_rcu_before_fork() -->
+    <function-decl name='urcu_mb_call_rcu_before_fork' mangled-name='urcu_mb_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='947' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_barrier() -->
+    <function-decl name='urcu_mb_barrier' mangled-name='urcu_mb_barrier' filepath='src/urcu-call-rcu-impl.h' line='874' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_mb_free_all_cpu_call_rcu_data' mangled-name='free_all_cpu_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_all_cpu_call_rcu_data_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-2' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_mb_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_mb_call_rcu_data_free' mangled-name='call_rcu_data_free_mb' filepath='src/urcu-call-rcu-impl.h' line='764' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_data_free_mb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='764' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_mb_call_rcu' mangled-name='urcu_mb_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='725' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='725' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='726' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_mb_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_mb_create_all_cpu_call_rcu_data' mangled-name='create_all_cpu_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_mb'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='645' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_mb_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_mb_set_thread_call_rcu_data' mangled-name='urcu_mb_set_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_set_thread_call_rcu_data'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='630' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_mb_get_thread_call_rcu_data' mangled-name='get_thread_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_thread_call_rcu_data_mb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_get_call_rcu_data() -->
+    <function-decl name='urcu_mb_get_call_rcu_data' mangled-name='urcu_mb_get_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='590' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_get_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_get_default_call_rcu_data() -->
+    <function-decl name='urcu_mb_get_default_call_rcu_data' mangled-name='urcu_mb_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_mb_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_mb_set_cpu_call_rcu_data' mangled-name='urcu_mb_set_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_set_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_mb_create_call_rcu_data' mangled-name='create_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_call_rcu_data_mb'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='498' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='499' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_mb_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_mb_get_call_rcu_thread' mangled-name='get_call_rcu_thread_mb' filepath='src/urcu-call-rcu-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_thread_mb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='476' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_mb_get_cpu_call_rcu_data' mangled-name='get_cpu_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='452' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_mb'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='452' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_mb_unregister_thread() -->
+    <function-decl name='urcu_mb_unregister_thread' mangled-name='urcu_mb_unregister_thread' filepath='src/urcu.c' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_register_thread() -->
+    <function-decl name='urcu_mb_register_thread' mangled-name='urcu_mb_register_thread' filepath='src/urcu.c' line='547' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_mb_read_ongoing() -->
+    <function-decl name='urcu_mb_read_ongoing' mangled-name='rcu_read_ongoing_mb' filepath='src/urcu.c' line='540' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_ongoing_mb'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_mb_read_unlock() -->
+    <function-decl name='urcu_mb_read_unlock' mangled-name='rcu_read_unlock_mb' filepath='src/urcu.c' line='533' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_unlock_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_read_lock() -->
+    <function-decl name='urcu_mb_read_lock' mangled-name='rcu_read_lock_mb' filepath='src/urcu.c' line='526' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_lock_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_synchronize_rcu() -->
+    <function-decl name='urcu_mb_synchronize_rcu' mangled-name='synchronize_rcu_mb' filepath='src/urcu.c' line='403' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='synchronize_rcu_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_init() -->
+    <function-decl name='urcu_mb_init' mangled-name='rcu_init_mb' filepath='src/urcu.c' line='105' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_init_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-2' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-2' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-memb.so.6.xml b/extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-memb.so.6.xml
new file mode 100644 (file)
index 0000000..e22c578
--- /dev/null
@@ -0,0 +1,925 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-memb.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_child_memb -->
+    <elf-symbol name='call_rcu_after_fork_child_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_call_rcu_after_fork_child' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_memb -->
+    <elf-symbol name='call_rcu_after_fork_parent_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_memb -->
+    <elf-symbol name='call_rcu_before_fork_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_data_free_memb -->
+    <elf-symbol name='call_rcu_data_free_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_memb -->
+    <elf-symbol name='call_rcu_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_memb -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_create_all_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- create_call_rcu_data_memb -->
+    <elf-symbol name='create_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- defer_rcu_memb -->
+    <elf-symbol name='defer_rcu_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_defer_rcu' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data_memb -->
+    <elf-symbol name='free_all_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_data_memb -->
+    <elf-symbol name='get_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_get_call_rcu_data' is-defined='yes'/>
+    <!-- get_call_rcu_thread_memb -->
+    <elf-symbol name='get_call_rcu_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_memb -->
+    <elf-symbol name='get_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_get_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_memb -->
+    <elf-symbol name='get_default_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_memb -->
+    <elf-symbol name='get_thread_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_get_thread_call_rcu_data' is-defined='yes'/>
+    <!-- rcu_barrier_memb -->
+    <elf-symbol name='rcu_barrier_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_barrier' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_memb -->
+    <elf-symbol name='rcu_defer_barrier_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_defer_barrier' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_memb -->
+    <elf-symbol name='rcu_defer_barrier_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_defer_barrier_thread' is-defined='yes'/>
+    <!-- rcu_defer_exit_memb -->
+    <elf-symbol name='rcu_defer_exit_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_memb -->
+    <elf-symbol name='rcu_defer_register_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_memb -->
+    <elf-symbol name='rcu_defer_unregister_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_defer_unregister_thread' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_init_memb -->
+    <elf-symbol name='rcu_init_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_init' is-defined='yes'/>
+    <!-- rcu_read_lock_memb -->
+    <elf-symbol name='rcu_read_lock_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_read_lock' is-defined='yes'/>
+    <!-- rcu_read_ongoing_memb -->
+    <elf-symbol name='rcu_read_ongoing_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_unlock_memb -->
+    <elf-symbol name='rcu_read_unlock_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_register_thread_memb -->
+    <elf-symbol name='rcu_register_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_unregister_thread_memb -->
+    <elf-symbol name='rcu_unregister_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_memb -->
+    <elf-symbol name='set_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_memb -->
+    <elf-symbol name='set_thread_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_set_thread_call_rcu_data' is-defined='yes'/>
+    <!-- synchronize_rcu_memb -->
+    <elf-symbol name='synchronize_rcu_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_barrier -->
+    <elf-symbol name='urcu_memb_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu -->
+    <elf-symbol name='urcu_memb_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_memb' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_memb_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_memb_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_after_fork_parent_memb' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_before_fork -->
+    <elf-symbol name='urcu_memb_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_before_fork_memb' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_data_free -->
+    <elf-symbol name='urcu_memb_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_data_free_memb' is-defined='yes'/>
+    <!-- urcu_memb_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_create_call_rcu_data -->
+    <elf-symbol name='urcu_memb_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='create_call_rcu_data_memb' is-defined='yes'/>
+    <!-- urcu_memb_defer_barrier -->
+    <elf-symbol name='urcu_memb_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_barrier_thread -->
+    <elf-symbol name='urcu_memb_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_exit -->
+    <elf-symbol name='urcu_memb_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_exit_memb' is-defined='yes'/>
+    <!-- urcu_memb_defer_rcu -->
+    <elf-symbol name='urcu_memb_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_register_thread -->
+    <elf-symbol name='urcu_memb_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_register_thread_memb' is-defined='yes'/>
+    <!-- urcu_memb_defer_unregister_thread -->
+    <elf-symbol name='urcu_memb_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='free_all_cpu_call_rcu_data_memb' is-defined='yes'/>
+    <!-- urcu_memb_get_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_call_rcu_thread -->
+    <elf-symbol name='urcu_memb_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_call_rcu_thread_memb' is-defined='yes'/>
+    <!-- urcu_memb_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_default_call_rcu_data_memb' is-defined='yes'/>
+    <!-- urcu_memb_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_init -->
+    <elf-symbol name='urcu_memb_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_lock -->
+    <elf-symbol name='urcu_memb_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_ongoing -->
+    <elf-symbol name='urcu_memb_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_read_ongoing_memb' is-defined='yes'/>
+    <!-- urcu_memb_read_unlock -->
+    <elf-symbol name='urcu_memb_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_read_unlock_memb' is-defined='yes'/>
+    <!-- urcu_memb_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_memb_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_register_thread -->
+    <elf-symbol name='urcu_memb_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_register_thread_memb' is-defined='yes'/>
+    <!-- urcu_memb_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='set_cpu_call_rcu_data_memb' is-defined='yes'/>
+    <!-- urcu_memb_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_memb_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_synchronize_rcu -->
+    <elf-symbol name='urcu_memb_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='synchronize_rcu_memb' is-defined='yes'/>
+    <!-- urcu_memb_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_memb_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_unregister_rculfhash_atfork_memb' is-defined='yes'/>
+    <!-- urcu_memb_unregister_thread -->
+    <elf-symbol name='urcu_memb_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_unregister_thread_memb' is-defined='yes'/>
+    <!-- urcu_register_rculfhash_atfork_memb -->
+    <elf-symbol name='urcu_register_rculfhash_atfork_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_register_rculfhash_atfork' is-defined='yes'/>
+    <!-- urcu_unregister_rculfhash_atfork_memb -->
+    <elf-symbol name='urcu_unregister_rculfhash_atfork_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_memb -->
+    <elf-symbol name='rcu_flavor_memb' size='112' type='object-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_flavor' is-defined='yes'/>
+    <!-- rcu_gp_memb -->
+    <elf-symbol name='rcu_gp_memb' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_has_sys_membarrier_memb -->
+    <elf-symbol name='rcu_has_sys_membarrier_memb' size='4' type='object-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_has_sys_membarrier' is-defined='yes'/>
+    <!-- rcu_reader_memb -->
+    <elf-symbol name='rcu_reader_memb' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_flavor -->
+    <elf-symbol name='urcu_memb_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_gp -->
+    <elf-symbol name='urcu_memb_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' alias='rcu_gp_memb' is-defined='yes'/>
+    <!-- urcu_memb_has_sys_membarrier -->
+    <elf-symbol name='urcu_memb_has_sys_membarrier' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_reader -->
+    <elf-symbol name='urcu_memb_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' alias='rcu_reader_memb' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <!-- int urcu_memb_has_sys_membarrier -->
+    <var-decl name='urcu_memb_has_sys_membarrier' type-id='type-id-1' mangled-name='rcu_has_sys_membarrier_memb' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='72' column='1' elf-symbol-id='rcu_has_sys_membarrier_memb'/>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='67' column='1' id='type-id-2'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-4' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='77' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-1' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-4'/>
+    <!-- urcu_gp urcu_memb_gp -->
+    <var-decl name='urcu_memb_gp' type-id='type-id-2' mangled-name='urcu_memb_gp' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='83' column='1' elf-symbol-id='urcu_memb_gp'/>
+    <!-- struct urcu_reader -->
+    <class-decl name='urcu_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='80' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char urcu_reader::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='83' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_reader::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_reader::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_reader::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='88' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- urcu_reader urcu_memb_reader -->
+    <var-decl name='urcu_memb_reader' type-id='type-id-6' mangled-name='urcu_memb_reader' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='85' column='1' elf-symbol-id='urcu_memb_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct urcu_memb_flavor -->
+    <var-decl name='urcu_memb_flavor' type-id='type-id-35' mangled-name='rcu_flavor_memb' visibility='default' filepath='../include/urcu/flavor.h' line='90' column='1' elf-symbol-id='rcu_flavor_memb'/>
+    <!-- void urcu_memb_defer_exit() -->
+    <function-decl name='urcu_memb_defer_exit' mangled-name='urcu_memb_defer_exit' filepath='src/urcu-defer-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_unregister_thread() -->
+    <function-decl name='urcu_memb_defer_unregister_thread' mangled-name='rcu_defer_unregister_thread_memb' filepath='src/urcu-defer-impl.h' line='456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_unregister_thread_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_defer_register_thread() -->
+    <function-decl name='urcu_memb_defer_register_thread' mangled-name='urcu_memb_defer_register_thread' filepath='src/urcu-defer-impl.h' line='432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_memb_defer_rcu' mangled-name='defer_rcu_memb' filepath='src/urcu-defer-impl.h' line='400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_memb'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_barrier() -->
+    <function-decl name='urcu_memb_defer_barrier' mangled-name='rcu_defer_barrier_memb' filepath='src/urcu-defer-impl.h' line='284' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_barrier_thread() -->
+    <function-decl name='urcu_memb_defer_barrier_thread' mangled-name='rcu_defer_barrier_thread_memb' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_memb_unregister_rculfhash_atfork' mangled-name='urcu_memb_unregister_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_unregister_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_memb_register_rculfhash_atfork' mangled-name='urcu_register_rculfhash_atfork_memb' filepath='src/urcu-call-rcu-impl.h' line='1044' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_register_rculfhash_atfork_memb'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_memb_call_rcu_after_fork_child' mangled-name='call_rcu_after_fork_child_memb' filepath='src/urcu-call-rcu-impl.h' line='1000' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_memb_call_rcu_after_fork_parent' mangled-name='urcu_memb_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='976' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_before_fork() -->
+    <function-decl name='urcu_memb_call_rcu_before_fork' mangled-name='urcu_memb_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='947' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_barrier() -->
+    <function-decl name='urcu_memb_barrier' mangled-name='rcu_barrier_memb' filepath='src/urcu-call-rcu-impl.h' line='874' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_barrier_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_memb_free_all_cpu_call_rcu_data' mangled-name='urcu_memb_free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-1' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_memb_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_memb_call_rcu_data_free' mangled-name='urcu_memb_call_rcu_data_free' filepath='src/urcu-call-rcu-impl.h' line='764' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_data_free'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='764' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_memb_call_rcu' mangled-name='urcu_memb_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='725' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='725' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='726' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_memb_create_all_cpu_call_rcu_data' mangled-name='create_all_cpu_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_memb'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='645' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_memb_set_thread_call_rcu_data' mangled-name='set_thread_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_thread_call_rcu_data_memb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='630' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_thread_call_rcu_data' mangled-name='get_thread_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_thread_call_rcu_data_memb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_call_rcu_data' mangled-name='get_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='590' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_data_memb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_default_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_default_call_rcu_data' mangled-name='urcu_memb_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_memb_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_memb_set_cpu_call_rcu_data' mangled-name='urcu_memb_set_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_set_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_memb_create_call_rcu_data' mangled-name='urcu_memb_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='498' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='499' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_memb_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_memb_get_call_rcu_thread' mangled-name='urcu_memb_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='476' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_memb_get_cpu_call_rcu_data' mangled-name='get_cpu_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='452' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_memb'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='452' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_memb_init() -->
+    <function-decl name='urcu_memb_init' mangled-name='rcu_init_memb' filepath='src/urcu.c' line='613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_init_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_unregister_thread() -->
+    <function-decl name='urcu_memb_unregister_thread' mangled-name='urcu_memb_unregister_thread' filepath='src/urcu.c' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_register_thread() -->
+    <function-decl name='urcu_memb_register_thread' mangled-name='urcu_memb_register_thread' filepath='src/urcu.c' line='547' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_read_ongoing() -->
+    <function-decl name='urcu_memb_read_ongoing' mangled-name='urcu_memb_read_ongoing' filepath='src/urcu.c' line='540' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_ongoing'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_read_unlock() -->
+    <function-decl name='urcu_memb_read_unlock' mangled-name='urcu_memb_read_unlock' filepath='src/urcu.c' line='533' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_unlock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_read_lock() -->
+    <function-decl name='urcu_memb_read_lock' mangled-name='rcu_read_lock_memb' filepath='src/urcu.c' line='526' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_lock_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_synchronize_rcu() -->
+    <function-decl name='urcu_memb_synchronize_rcu' mangled-name='urcu_memb_synchronize_rcu' filepath='src/urcu.c' line='403' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-qsbr.so.6.xml b/extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-qsbr.so.6.xml
new file mode 100644 (file)
index 0000000..f0b9ce6
--- /dev/null
@@ -0,0 +1,946 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-qsbr.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_child_qsbr -->
+    <elf-symbol name='call_rcu_after_fork_child_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_call_rcu_after_fork_child' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_qsbr -->
+    <elf-symbol name='call_rcu_after_fork_parent_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_qsbr -->
+    <elf-symbol name='call_rcu_before_fork_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_call_rcu_before_fork' is-defined='yes'/>
+    <!-- call_rcu_data_free_qsbr -->
+    <elf-symbol name='call_rcu_data_free_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_qsbr -->
+    <elf-symbol name='call_rcu_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_qsbr -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_call_rcu_data_qsbr -->
+    <elf-symbol name='create_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- defer_rcu_qsbr -->
+    <elf-symbol name='defer_rcu_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_defer_rcu' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data -->
+    <elf-symbol name='free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_free_all_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- get_call_rcu_data_qsbr -->
+    <elf-symbol name='get_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_get_call_rcu_data' is-defined='yes'/>
+    <!-- get_call_rcu_thread_qsbr -->
+    <elf-symbol name='get_call_rcu_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_qsbr -->
+    <elf-symbol name='get_cpu_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_get_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_qsbr -->
+    <elf-symbol name='get_default_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_qsbr -->
+    <elf-symbol name='get_thread_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_barrier_qsbr -->
+    <elf-symbol name='rcu_barrier_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_qsbr -->
+    <elf-symbol name='rcu_defer_barrier_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_defer_barrier' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_qsbr -->
+    <elf-symbol name='rcu_defer_barrier_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_defer_barrier_thread' is-defined='yes'/>
+    <!-- rcu_defer_exit_qsbr -->
+    <elf-symbol name='rcu_defer_exit_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_qsbr -->
+    <elf-symbol name='rcu_defer_register_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_qsbr -->
+    <elf-symbol name='rcu_defer_unregister_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_exit_qsbr -->
+    <elf-symbol name='rcu_exit_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_quiescent_state_qsbr -->
+    <elf-symbol name='rcu_quiescent_state_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_lock_qsbr -->
+    <elf-symbol name='rcu_read_lock_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_read_lock' is-defined='yes'/>
+    <!-- rcu_read_ongoing_qsbr -->
+    <elf-symbol name='rcu_read_ongoing_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_read_ongoing' is-defined='yes'/>
+    <!-- rcu_read_unlock_qsbr -->
+    <elf-symbol name='rcu_read_unlock_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_register_thread_qsbr -->
+    <elf-symbol name='rcu_register_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_thread_offline_qsbr -->
+    <elf-symbol name='rcu_thread_offline_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_thread_online_qsbr -->
+    <elf-symbol name='rcu_thread_online_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_unregister_thread_qsbr -->
+    <elf-symbol name='rcu_unregister_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_qsbr -->
+    <elf-symbol name='set_cpu_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_set_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_qsbr -->
+    <elf-symbol name='set_thread_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_set_thread_call_rcu_data' is-defined='yes'/>
+    <!-- synchronize_rcu_qsbr -->
+    <elf-symbol name='synchronize_rcu_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_barrier -->
+    <elf-symbol name='urcu_qsbr_barrier' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_barrier_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu -->
+    <elf-symbol name='urcu_qsbr_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_qsbr_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_qsbr_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_after_fork_parent_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu_before_fork -->
+    <elf-symbol name='urcu_qsbr_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu_data_free -->
+    <elf-symbol name='urcu_qsbr_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_data_free_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='create_all_cpu_call_rcu_data_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_create_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='create_call_rcu_data_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_barrier -->
+    <elf-symbol name='urcu_qsbr_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_barrier_thread -->
+    <elf-symbol name='urcu_qsbr_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_exit -->
+    <elf-symbol name='urcu_qsbr_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_exit_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_rcu -->
+    <elf-symbol name='urcu_qsbr_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_register_thread -->
+    <elf-symbol name='urcu_qsbr_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_register_thread_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_unregister_thread -->
+    <elf-symbol name='urcu_qsbr_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_unregister_thread_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_exit -->
+    <elf-symbol name='urcu_qsbr_exit' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_exit_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_get_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_get_call_rcu_thread -->
+    <elf-symbol name='urcu_qsbr_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_call_rcu_thread_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_default_call_rcu_data_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_thread_call_rcu_data_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_quiescent_state -->
+    <elf-symbol name='urcu_qsbr_quiescent_state' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_quiescent_state_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_read_lock -->
+    <elf-symbol name='urcu_qsbr_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_read_ongoing -->
+    <elf-symbol name='urcu_qsbr_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_read_unlock -->
+    <elf-symbol name='urcu_qsbr_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_read_unlock_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_qsbr_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_register_thread -->
+    <elf-symbol name='urcu_qsbr_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_register_thread_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_synchronize_rcu -->
+    <elf-symbol name='urcu_qsbr_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='synchronize_rcu_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_thread_offline -->
+    <elf-symbol name='urcu_qsbr_thread_offline' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_thread_offline_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_thread_online -->
+    <elf-symbol name='urcu_qsbr_thread_online' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_thread_online_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_qsbr_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_unregister_thread -->
+    <elf-symbol name='urcu_qsbr_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_unregister_thread_qsbr' is-defined='yes'/>
+    <!-- urcu_register_rculfhash_atfork_qsbr -->
+    <elf-symbol name='urcu_register_rculfhash_atfork_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_register_rculfhash_atfork' is-defined='yes'/>
+    <!-- urcu_unregister_rculfhash_atfork_qsbr -->
+    <elf-symbol name='urcu_unregister_rculfhash_atfork_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_unregister_rculfhash_atfork' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_qsbr -->
+    <elf-symbol name='rcu_flavor_qsbr' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_gp_qsbr -->
+    <elf-symbol name='rcu_gp_qsbr' size='128' type='object-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_gp' is-defined='yes'/>
+    <!-- rcu_reader_qsbr -->
+    <elf-symbol name='rcu_reader_qsbr' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_flavor -->
+    <elf-symbol name='urcu_qsbr_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' alias='rcu_flavor_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_gp -->
+    <elf-symbol name='urcu_qsbr_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_reader -->
+    <elf-symbol name='urcu_qsbr_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' alias='rcu_reader_qsbr' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu-qsbr.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='67' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='77' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-4' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-3'/>
+    <!-- urcu_gp urcu_qsbr_gp -->
+    <var-decl name='urcu_qsbr_gp' type-id='type-id-1' mangled-name='rcu_gp_qsbr' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='63' column='1' elf-symbol-id='rcu_gp_qsbr'/>
+    <!-- struct urcu_qsbr_reader -->
+    <class-decl name='urcu_qsbr_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='65' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_qsbr_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_qsbr_reader::node -->
+        <var-decl name='node' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- int urcu_qsbr_reader::waiting -->
+        <var-decl name='waiting' type-id='type-id-4' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1216'>
+        <!-- pthread_t urcu_qsbr_reader::tid -->
+        <var-decl name='tid' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='71' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_qsbr_reader::registered -->
+        <var-decl name='registered' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='73' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-7'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-10' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-10' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-7' size-in-bits='64' id='type-id-10'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-8'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-9'/>
+    <!-- urcu_qsbr_reader urcu_qsbr_reader -->
+    <var-decl name='urcu_qsbr_reader' type-id='type-id-6' mangled-name='urcu_qsbr_reader' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='76' column='1' elf-symbol-id='urcu_qsbr_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-11'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-17'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-12'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-20'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-21' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-23' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-23'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-24'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-25' size-in-bits='64' id='type-id-22'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-14'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-27'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-29'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-30' size-in-bits='64' id='type-id-15'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-31'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-29' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-29' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-29' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-27' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-32'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-16'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-11' const='yes' id='type-id-34'/>
+    <!-- const rcu_flavor_struct urcu_qsbr_flavor -->
+    <var-decl name='urcu_qsbr_flavor' type-id='type-id-34' mangled-name='urcu_qsbr_flavor' visibility='default' filepath='../include/urcu/flavor.h' line='90' column='1' elf-symbol-id='urcu_qsbr_flavor'/>
+    <!-- void urcu_qsbr_defer_exit() -->
+    <function-decl name='urcu_qsbr_defer_exit' mangled-name='urcu_qsbr_defer_exit' filepath='src/urcu-defer-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_defer_unregister_thread() -->
+    <function-decl name='urcu_qsbr_defer_unregister_thread' mangled-name='urcu_qsbr_defer_unregister_thread' filepath='src/urcu-defer-impl.h' line='456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_defer_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int urcu_qsbr_defer_register_thread() -->
+    <function-decl name='urcu_qsbr_defer_register_thread' mangled-name='urcu_qsbr_defer_register_thread' filepath='src/urcu-defer-impl.h' line='432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_qsbr_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_qsbr_defer_rcu' mangled-name='defer_rcu_qsbr' filepath='src/urcu-defer-impl.h' line='400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_qsbr'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-29' name='fct' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='p' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_defer_barrier() -->
+    <function-decl name='urcu_qsbr_defer_barrier' mangled-name='rcu_defer_barrier_qsbr' filepath='src/urcu-defer-impl.h' line='284' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_defer_barrier_thread() -->
+    <function-decl name='urcu_qsbr_defer_barrier_thread' mangled-name='rcu_defer_barrier_thread_qsbr' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_qsbr_unregister_rculfhash_atfork' mangled-name='urcu_unregister_rculfhash_atfork_qsbr' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_unregister_rculfhash_atfork_qsbr'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-32' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_qsbr_register_rculfhash_atfork' mangled-name='urcu_register_rculfhash_atfork_qsbr' filepath='src/urcu-call-rcu-impl.h' line='1044' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_register_rculfhash_atfork_qsbr'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-32' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_qsbr_call_rcu_after_fork_child' mangled-name='call_rcu_after_fork_child_qsbr' filepath='src/urcu-call-rcu-impl.h' line='1000' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_qsbr_call_rcu_after_fork_parent' mangled-name='urcu_qsbr_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='976' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_call_rcu_before_fork() -->
+    <function-decl name='urcu_qsbr_call_rcu_before_fork' mangled-name='call_rcu_before_fork_qsbr' filepath='src/urcu-call-rcu-impl.h' line='947' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_before_fork_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_barrier() -->
+    <function-decl name='urcu_qsbr_barrier' mangled-name='urcu_qsbr_barrier' filepath='src/urcu-call-rcu-impl.h' line='874' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_barrier'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_qsbr_free_all_cpu_call_rcu_data' mangled-name='free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-35'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-36' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-7' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-23' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-38' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-39'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-40' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-40'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-43'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-45'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-46'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-45' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-44'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-47'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='320' id='type-id-41'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-2' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-42'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-39' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-38'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-35' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_qsbr_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_qsbr_call_rcu_data_free' mangled-name='urcu_qsbr_call_rcu_data_free' filepath='src/urcu-call-rcu-impl.h' line='764' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_call_rcu_data_free'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='764' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_qsbr_call_rcu' mangled-name='urcu_qsbr_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='725' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-24' name='head' filepath='src/urcu-call-rcu-impl.h' line='725' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-22' name='func' filepath='src/urcu-call-rcu-impl.h' line='726' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int urcu_qsbr_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_qsbr_create_all_cpu_call_rcu_data' mangled-name='urcu_qsbr_create_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_create_all_cpu_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='645' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_qsbr_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_qsbr_set_thread_call_rcu_data' mangled-name='set_thread_call_rcu_data_qsbr' filepath='src/urcu-call-rcu-impl.h' line='630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_thread_call_rcu_data_qsbr'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='630' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_qsbr_get_thread_call_rcu_data' mangled-name='urcu_qsbr_get_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_get_thread_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_get_call_rcu_data() -->
+    <function-decl name='urcu_qsbr_get_call_rcu_data' mangled-name='get_call_rcu_data_qsbr' filepath='src/urcu-call-rcu-impl.h' line='590' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_data_qsbr'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_get_default_call_rcu_data() -->
+    <function-decl name='urcu_qsbr_get_default_call_rcu_data' mangled-name='urcu_qsbr_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_qsbr_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_qsbr_set_cpu_call_rcu_data' mangled-name='set_cpu_call_rcu_data_qsbr' filepath='src/urcu-call-rcu-impl.h' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_cpu_call_rcu_data_qsbr'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_qsbr_create_call_rcu_data' mangled-name='urcu_qsbr_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='498' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='499' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_qsbr_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_qsbr_get_call_rcu_thread' mangled-name='urcu_qsbr_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='476' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-8'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_qsbr_get_cpu_call_rcu_data' mangled-name='get_cpu_call_rcu_data_qsbr' filepath='src/urcu-call-rcu-impl.h' line='452' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_qsbr'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='452' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_qsbr_exit() -->
+    <function-decl name='urcu_qsbr_exit' mangled-name='urcu_qsbr_exit' filepath='src/urcu-qsbr.c' line='512' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_exit'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_unregister_thread() -->
+    <function-decl name='urcu_qsbr_unregister_thread' mangled-name='urcu_qsbr_unregister_thread' filepath='src/urcu-qsbr.c' line='496' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_register_thread() -->
+    <function-decl name='urcu_qsbr_register_thread' mangled-name='urcu_qsbr_register_thread' filepath='src/urcu-qsbr.c' line='481' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_thread_online() -->
+    <function-decl name='urcu_qsbr_thread_online' mangled-name='urcu_qsbr_thread_online' filepath='src/urcu-qsbr.c' line='474' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_thread_online'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_thread_offline() -->
+    <function-decl name='urcu_qsbr_thread_offline' mangled-name='urcu_qsbr_thread_offline' filepath='src/urcu-qsbr.c' line='467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_thread_offline'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_quiescent_state() -->
+    <function-decl name='urcu_qsbr_quiescent_state' mangled-name='urcu_qsbr_quiescent_state' filepath='src/urcu-qsbr.c' line='460' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_quiescent_state'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int urcu_qsbr_read_ongoing() -->
+    <function-decl name='urcu_qsbr_read_ongoing' mangled-name='rcu_read_ongoing_qsbr' filepath='src/urcu-qsbr.c' line='453' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_ongoing_qsbr'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_qsbr_read_unlock() -->
+    <function-decl name='urcu_qsbr_read_unlock' mangled-name='urcu_qsbr_read_unlock' filepath='src/urcu-qsbr.c' line='447' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_read_unlock'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_read_lock() -->
+    <function-decl name='urcu_qsbr_read_lock' mangled-name='rcu_read_lock_qsbr' filepath='src/urcu-qsbr.c' line='441' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_lock_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_synchronize_rcu() -->
+    <function-decl name='urcu_qsbr_synchronize_rcu' mangled-name='urcu_qsbr_synchronize_rcu' filepath='src/urcu-qsbr.c' line='349' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-18'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-25'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-24'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-24'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-22'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-33'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-32'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-30'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-29'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-28'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-38' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-9' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-2' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-2' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-42' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-42' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-signal.so.6.xml b/extras/abi/0.11/x86_64-pc-linux-gnu/liburcu-signal.so.6.xml
new file mode 100644 (file)
index 0000000..feaa997
--- /dev/null
@@ -0,0 +1,928 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-signal.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_child_sig -->
+    <elf-symbol name='call_rcu_after_fork_child_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_call_rcu_after_fork_child' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_sig -->
+    <elf-symbol name='call_rcu_after_fork_parent_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_sig -->
+    <elf-symbol name='call_rcu_before_fork_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_call_rcu_before_fork' is-defined='yes'/>
+    <!-- call_rcu_data_free_sig -->
+    <elf-symbol name='call_rcu_data_free_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_call_rcu_data_free' is-defined='yes'/>
+    <!-- call_rcu_sig -->
+    <elf-symbol name='call_rcu_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_sig -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_create_all_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- create_call_rcu_data_sig -->
+    <elf-symbol name='create_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- defer_rcu_sig -->
+    <elf-symbol name='defer_rcu_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data_sig -->
+    <elf-symbol name='free_all_cpu_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_data_sig -->
+    <elf-symbol name='get_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_thread_sig -->
+    <elf-symbol name='get_call_rcu_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_get_call_rcu_thread' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_sig -->
+    <elf-symbol name='get_cpu_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_get_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_sig -->
+    <elf-symbol name='get_default_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_sig -->
+    <elf-symbol name='get_thread_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_barrier_sig -->
+    <elf-symbol name='rcu_barrier_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_sig -->
+    <elf-symbol name='rcu_defer_barrier_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_defer_barrier' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_sig -->
+    <elf-symbol name='rcu_defer_barrier_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_defer_barrier_thread' is-defined='yes'/>
+    <!-- rcu_defer_exit_sig -->
+    <elf-symbol name='rcu_defer_exit_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_defer_exit' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_sig -->
+    <elf-symbol name='rcu_defer_register_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_sig -->
+    <elf-symbol name='rcu_defer_unregister_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_defer_unregister_thread' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_exit_sig -->
+    <elf-symbol name='rcu_exit_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_init_sig -->
+    <elf-symbol name='rcu_init_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_init' is-defined='yes'/>
+    <!-- rcu_read_lock_sig -->
+    <elf-symbol name='rcu_read_lock_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_ongoing_sig -->
+    <elf-symbol name='rcu_read_ongoing_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_read_ongoing' is-defined='yes'/>
+    <!-- rcu_read_unlock_sig -->
+    <elf-symbol name='rcu_read_unlock_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_read_unlock' is-defined='yes'/>
+    <!-- rcu_register_thread_sig -->
+    <elf-symbol name='rcu_register_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_unregister_thread_sig -->
+    <elf-symbol name='rcu_unregister_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_sig -->
+    <elf-symbol name='set_cpu_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_set_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_sig -->
+    <elf-symbol name='set_thread_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- synchronize_rcu_sig -->
+    <elf-symbol name='synchronize_rcu_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_register_rculfhash_atfork_sig -->
+    <elf-symbol name='urcu_register_rculfhash_atfork_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_barrier -->
+    <elf-symbol name='urcu_signal_barrier' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_barrier_sig' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu -->
+    <elf-symbol name='urcu_signal_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_sig' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_signal_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_signal_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_after_fork_parent_sig' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu_before_fork -->
+    <elf-symbol name='urcu_signal_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu_data_free -->
+    <elf-symbol name='urcu_signal_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_signal_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_create_call_rcu_data -->
+    <elf-symbol name='urcu_signal_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='create_call_rcu_data_sig' is-defined='yes'/>
+    <!-- urcu_signal_defer_barrier -->
+    <elf-symbol name='urcu_signal_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_defer_barrier_thread -->
+    <elf-symbol name='urcu_signal_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_defer_exit -->
+    <elf-symbol name='urcu_signal_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_defer_rcu -->
+    <elf-symbol name='urcu_signal_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='defer_rcu_sig' is-defined='yes'/>
+    <!-- urcu_signal_defer_register_thread -->
+    <elf-symbol name='urcu_signal_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_register_thread_sig' is-defined='yes'/>
+    <!-- urcu_signal_defer_unregister_thread -->
+    <elf-symbol name='urcu_signal_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_exit -->
+    <elf-symbol name='urcu_signal_exit' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_exit_sig' is-defined='yes'/>
+    <!-- urcu_signal_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_signal_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='free_all_cpu_call_rcu_data_sig' is-defined='yes'/>
+    <!-- urcu_signal_get_call_rcu_data -->
+    <elf-symbol name='urcu_signal_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_call_rcu_data_sig' is-defined='yes'/>
+    <!-- urcu_signal_get_call_rcu_thread -->
+    <elf-symbol name='urcu_signal_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_signal_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_signal_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_default_call_rcu_data_sig' is-defined='yes'/>
+    <!-- urcu_signal_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_signal_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_thread_call_rcu_data_sig' is-defined='yes'/>
+    <!-- urcu_signal_init -->
+    <elf-symbol name='urcu_signal_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_read_lock -->
+    <elf-symbol name='urcu_signal_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_read_lock_sig' is-defined='yes'/>
+    <!-- urcu_signal_read_ongoing -->
+    <elf-symbol name='urcu_signal_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_read_unlock -->
+    <elf-symbol name='urcu_signal_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_signal_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_register_rculfhash_atfork_sig' is-defined='yes'/>
+    <!-- urcu_signal_register_thread -->
+    <elf-symbol name='urcu_signal_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_register_thread_sig' is-defined='yes'/>
+    <!-- urcu_signal_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_signal_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_signal_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='set_thread_call_rcu_data_sig' is-defined='yes'/>
+    <!-- urcu_signal_synchronize_rcu -->
+    <elf-symbol name='urcu_signal_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='synchronize_rcu_sig' is-defined='yes'/>
+    <!-- urcu_signal_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_signal_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_unregister_thread -->
+    <elf-symbol name='urcu_signal_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_unregister_thread_sig' is-defined='yes'/>
+    <!-- urcu_unregister_rculfhash_atfork_sig -->
+    <elf-symbol name='urcu_unregister_rculfhash_atfork_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_unregister_rculfhash_atfork' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_sig -->
+    <elf-symbol name='rcu_flavor_sig' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_gp_sig -->
+    <elf-symbol name='rcu_gp_sig' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_reader_sig -->
+    <elf-symbol name='rcu_reader_sig' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_flavor -->
+    <elf-symbol name='urcu_signal_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' alias='rcu_flavor_sig' is-defined='yes'/>
+    <!-- urcu_signal_gp -->
+    <elf-symbol name='urcu_signal_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' alias='rcu_gp_sig' is-defined='yes'/>
+    <!-- urcu_signal_reader -->
+    <elf-symbol name='urcu_signal_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' alias='rcu_reader_sig' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='67' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='77' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-4' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-3'/>
+    <!-- urcu_gp urcu_signal_gp -->
+    <var-decl name='urcu_signal_gp' type-id='type-id-1' mangled-name='urcu_signal_gp' visibility='default' filepath='../include/urcu/static/urcu-signal.h' line='61' column='1' elf-symbol-id='urcu_signal_gp'/>
+    <!-- struct urcu_reader -->
+    <class-decl name='urcu_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='80' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char urcu_reader::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='83' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_reader::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_reader::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_reader::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='88' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- urcu_reader urcu_signal_reader -->
+    <var-decl name='urcu_signal_reader' type-id='type-id-6' mangled-name='urcu_signal_reader' visibility='default' filepath='../include/urcu/static/urcu-signal.h' line='63' column='1' elf-symbol-id='urcu_signal_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct urcu_signal_flavor -->
+    <var-decl name='urcu_signal_flavor' type-id='type-id-35' mangled-name='urcu_signal_flavor' visibility='default' filepath='../include/urcu/flavor.h' line='90' column='1' elf-symbol-id='urcu_signal_flavor'/>
+    <!-- void urcu_signal_defer_exit() -->
+    <function-decl name='urcu_signal_defer_exit' mangled-name='rcu_defer_exit_sig' filepath='src/urcu-defer-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_exit_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_defer_unregister_thread() -->
+    <function-decl name='urcu_signal_defer_unregister_thread' mangled-name='rcu_defer_unregister_thread_sig' filepath='src/urcu-defer-impl.h' line='456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_unregister_thread_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_signal_defer_register_thread() -->
+    <function-decl name='urcu_signal_defer_register_thread' mangled-name='urcu_signal_defer_register_thread' filepath='src/urcu-defer-impl.h' line='432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_signal_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_signal_defer_rcu' mangled-name='urcu_signal_defer_rcu' filepath='src/urcu-defer-impl.h' line='400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_defer_rcu'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_defer_barrier() -->
+    <function-decl name='urcu_signal_defer_barrier' mangled-name='rcu_defer_barrier_sig' filepath='src/urcu-defer-impl.h' line='284' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_defer_barrier_thread() -->
+    <function-decl name='urcu_signal_defer_barrier_thread' mangled-name='rcu_defer_barrier_thread_sig' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_signal_unregister_rculfhash_atfork' mangled-name='urcu_unregister_rculfhash_atfork_sig' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_unregister_rculfhash_atfork_sig'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_signal_register_rculfhash_atfork' mangled-name='urcu_signal_register_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1044' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_register_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_signal_call_rcu_after_fork_child' mangled-name='call_rcu_after_fork_child_sig' filepath='src/urcu-call-rcu-impl.h' line='1000' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_signal_call_rcu_after_fork_parent' mangled-name='urcu_signal_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='976' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_call_rcu_before_fork() -->
+    <function-decl name='urcu_signal_call_rcu_before_fork' mangled-name='call_rcu_before_fork_sig' filepath='src/urcu-call-rcu-impl.h' line='947' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_before_fork_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_barrier() -->
+    <function-decl name='urcu_signal_barrier' mangled-name='urcu_signal_barrier' filepath='src/urcu-call-rcu-impl.h' line='874' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_signal_free_all_cpu_call_rcu_data' mangled-name='urcu_signal_free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-2' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_signal_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_signal_call_rcu_data_free' mangled-name='call_rcu_data_free_sig' filepath='src/urcu-call-rcu-impl.h' line='764' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_data_free_sig'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='764' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_signal_call_rcu' mangled-name='urcu_signal_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='725' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='725' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='726' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_signal_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_signal_create_all_cpu_call_rcu_data' mangled-name='create_all_cpu_call_rcu_data_sig' filepath='src/urcu-call-rcu-impl.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_sig'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='645' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_signal_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_signal_set_thread_call_rcu_data' mangled-name='urcu_signal_set_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_set_thread_call_rcu_data'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='630' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_signal_get_thread_call_rcu_data' mangled-name='urcu_signal_get_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_get_thread_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_get_call_rcu_data() -->
+    <function-decl name='urcu_signal_get_call_rcu_data' mangled-name='urcu_signal_get_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='590' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_get_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_get_default_call_rcu_data() -->
+    <function-decl name='urcu_signal_get_default_call_rcu_data' mangled-name='urcu_signal_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_signal_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_signal_set_cpu_call_rcu_data' mangled-name='set_cpu_call_rcu_data_sig' filepath='src/urcu-call-rcu-impl.h' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_cpu_call_rcu_data_sig'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_signal_create_call_rcu_data' mangled-name='urcu_signal_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='498' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='499' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_signal_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_signal_get_call_rcu_thread' mangled-name='get_call_rcu_thread_sig' filepath='src/urcu-call-rcu-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_thread_sig'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='476' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_signal_get_cpu_call_rcu_data' mangled-name='get_cpu_call_rcu_data_sig' filepath='src/urcu-call-rcu-impl.h' line='452' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_sig'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='452' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_signal_exit() -->
+    <function-decl name='urcu_signal_exit' mangled-name='urcu_signal_exit' filepath='src/urcu.c' line='666' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_exit'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_init() -->
+    <function-decl name='urcu_signal_init' mangled-name='rcu_init_sig' filepath='src/urcu.c' line='647' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_init_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_unregister_thread() -->
+    <function-decl name='urcu_signal_unregister_thread' mangled-name='urcu_signal_unregister_thread' filepath='src/urcu.c' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_register_thread() -->
+    <function-decl name='urcu_signal_register_thread' mangled-name='urcu_signal_register_thread' filepath='src/urcu.c' line='547' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_signal_read_ongoing() -->
+    <function-decl name='urcu_signal_read_ongoing' mangled-name='rcu_read_ongoing_sig' filepath='src/urcu.c' line='540' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_ongoing_sig'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_signal_read_unlock() -->
+    <function-decl name='urcu_signal_read_unlock' mangled-name='rcu_read_unlock_sig' filepath='src/urcu.c' line='533' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_unlock_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_read_lock() -->
+    <function-decl name='urcu_signal_read_lock' mangled-name='urcu_signal_read_lock' filepath='src/urcu.c' line='526' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_read_lock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_synchronize_rcu() -->
+    <function-decl name='urcu_signal_synchronize_rcu' mangled-name='urcu_signal_synchronize_rcu' filepath='src/urcu.c' line='403' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-2' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-2' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.11/x86_64-pc-linux-gnu/liburcu.so.6.xml b/extras/abi/0.11/x86_64-pc-linux-gnu/liburcu.so.6.xml
new file mode 100644 (file)
index 0000000..3d42cd2
--- /dev/null
@@ -0,0 +1,925 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_child_memb -->
+    <elf-symbol name='call_rcu_after_fork_child_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_call_rcu_after_fork_child' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_memb -->
+    <elf-symbol name='call_rcu_after_fork_parent_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_memb -->
+    <elf-symbol name='call_rcu_before_fork_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_data_free_memb -->
+    <elf-symbol name='call_rcu_data_free_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_memb -->
+    <elf-symbol name='call_rcu_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_memb -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_create_all_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- create_call_rcu_data_memb -->
+    <elf-symbol name='create_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- defer_rcu_memb -->
+    <elf-symbol name='defer_rcu_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_defer_rcu' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data_memb -->
+    <elf-symbol name='free_all_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_data_memb -->
+    <elf-symbol name='get_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_get_call_rcu_data' is-defined='yes'/>
+    <!-- get_call_rcu_thread_memb -->
+    <elf-symbol name='get_call_rcu_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_memb -->
+    <elf-symbol name='get_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_get_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_memb -->
+    <elf-symbol name='get_default_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_memb -->
+    <elf-symbol name='get_thread_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_get_thread_call_rcu_data' is-defined='yes'/>
+    <!-- rcu_barrier_memb -->
+    <elf-symbol name='rcu_barrier_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_barrier' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_memb -->
+    <elf-symbol name='rcu_defer_barrier_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_defer_barrier' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_memb -->
+    <elf-symbol name='rcu_defer_barrier_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_defer_barrier_thread' is-defined='yes'/>
+    <!-- rcu_defer_exit_memb -->
+    <elf-symbol name='rcu_defer_exit_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_memb -->
+    <elf-symbol name='rcu_defer_register_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_memb -->
+    <elf-symbol name='rcu_defer_unregister_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_defer_unregister_thread' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_init_memb -->
+    <elf-symbol name='rcu_init_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_init' is-defined='yes'/>
+    <!-- rcu_read_lock_memb -->
+    <elf-symbol name='rcu_read_lock_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_read_lock' is-defined='yes'/>
+    <!-- rcu_read_ongoing_memb -->
+    <elf-symbol name='rcu_read_ongoing_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_unlock_memb -->
+    <elf-symbol name='rcu_read_unlock_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_register_thread_memb -->
+    <elf-symbol name='rcu_register_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_unregister_thread_memb -->
+    <elf-symbol name='rcu_unregister_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_memb -->
+    <elf-symbol name='set_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_memb -->
+    <elf-symbol name='set_thread_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_set_thread_call_rcu_data' is-defined='yes'/>
+    <!-- synchronize_rcu_memb -->
+    <elf-symbol name='synchronize_rcu_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_barrier -->
+    <elf-symbol name='urcu_memb_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu -->
+    <elf-symbol name='urcu_memb_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_memb' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_memb_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_memb_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_after_fork_parent_memb' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_before_fork -->
+    <elf-symbol name='urcu_memb_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_before_fork_memb' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_data_free -->
+    <elf-symbol name='urcu_memb_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_data_free_memb' is-defined='yes'/>
+    <!-- urcu_memb_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_create_call_rcu_data -->
+    <elf-symbol name='urcu_memb_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='create_call_rcu_data_memb' is-defined='yes'/>
+    <!-- urcu_memb_defer_barrier -->
+    <elf-symbol name='urcu_memb_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_barrier_thread -->
+    <elf-symbol name='urcu_memb_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_exit -->
+    <elf-symbol name='urcu_memb_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_exit_memb' is-defined='yes'/>
+    <!-- urcu_memb_defer_rcu -->
+    <elf-symbol name='urcu_memb_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_register_thread -->
+    <elf-symbol name='urcu_memb_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_register_thread_memb' is-defined='yes'/>
+    <!-- urcu_memb_defer_unregister_thread -->
+    <elf-symbol name='urcu_memb_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='free_all_cpu_call_rcu_data_memb' is-defined='yes'/>
+    <!-- urcu_memb_get_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_call_rcu_thread -->
+    <elf-symbol name='urcu_memb_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_call_rcu_thread_memb' is-defined='yes'/>
+    <!-- urcu_memb_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_default_call_rcu_data_memb' is-defined='yes'/>
+    <!-- urcu_memb_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_init -->
+    <elf-symbol name='urcu_memb_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_lock -->
+    <elf-symbol name='urcu_memb_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_ongoing -->
+    <elf-symbol name='urcu_memb_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_read_ongoing_memb' is-defined='yes'/>
+    <!-- urcu_memb_read_unlock -->
+    <elf-symbol name='urcu_memb_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_read_unlock_memb' is-defined='yes'/>
+    <!-- urcu_memb_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_memb_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_register_thread -->
+    <elf-symbol name='urcu_memb_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_register_thread_memb' is-defined='yes'/>
+    <!-- urcu_memb_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='set_cpu_call_rcu_data_memb' is-defined='yes'/>
+    <!-- urcu_memb_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_memb_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_synchronize_rcu -->
+    <elf-symbol name='urcu_memb_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='synchronize_rcu_memb' is-defined='yes'/>
+    <!-- urcu_memb_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_memb_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_unregister_rculfhash_atfork_memb' is-defined='yes'/>
+    <!-- urcu_memb_unregister_thread -->
+    <elf-symbol name='urcu_memb_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_unregister_thread_memb' is-defined='yes'/>
+    <!-- urcu_register_rculfhash_atfork_memb -->
+    <elf-symbol name='urcu_register_rculfhash_atfork_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_register_rculfhash_atfork' is-defined='yes'/>
+    <!-- urcu_unregister_rculfhash_atfork_memb -->
+    <elf-symbol name='urcu_unregister_rculfhash_atfork_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_memb -->
+    <elf-symbol name='rcu_flavor_memb' size='112' type='object-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_flavor' is-defined='yes'/>
+    <!-- rcu_gp_memb -->
+    <elf-symbol name='rcu_gp_memb' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_has_sys_membarrier_memb -->
+    <elf-symbol name='rcu_has_sys_membarrier_memb' size='4' type='object-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_has_sys_membarrier' is-defined='yes'/>
+    <!-- rcu_reader_memb -->
+    <elf-symbol name='rcu_reader_memb' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_flavor -->
+    <elf-symbol name='urcu_memb_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_gp -->
+    <elf-symbol name='urcu_memb_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' alias='rcu_gp_memb' is-defined='yes'/>
+    <!-- urcu_memb_has_sys_membarrier -->
+    <elf-symbol name='urcu_memb_has_sys_membarrier' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_reader -->
+    <elf-symbol name='urcu_memb_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' alias='rcu_reader_memb' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <!-- int urcu_memb_has_sys_membarrier -->
+    <var-decl name='urcu_memb_has_sys_membarrier' type-id='type-id-1' mangled-name='rcu_has_sys_membarrier_memb' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='72' column='1' elf-symbol-id='rcu_has_sys_membarrier_memb'/>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='67' column='1' id='type-id-2'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-4' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='77' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-1' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-4'/>
+    <!-- urcu_gp urcu_memb_gp -->
+    <var-decl name='urcu_memb_gp' type-id='type-id-2' mangled-name='urcu_memb_gp' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='83' column='1' elf-symbol-id='urcu_memb_gp'/>
+    <!-- struct urcu_reader -->
+    <class-decl name='urcu_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='80' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char urcu_reader::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='83' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_reader::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_reader::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_reader::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='88' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- urcu_reader urcu_memb_reader -->
+    <var-decl name='urcu_memb_reader' type-id='type-id-6' mangled-name='urcu_memb_reader' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='85' column='1' elf-symbol-id='urcu_memb_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct urcu_memb_flavor -->
+    <var-decl name='urcu_memb_flavor' type-id='type-id-35' mangled-name='rcu_flavor_memb' visibility='default' filepath='../include/urcu/flavor.h' line='90' column='1' elf-symbol-id='rcu_flavor_memb'/>
+    <!-- void urcu_memb_defer_exit() -->
+    <function-decl name='urcu_memb_defer_exit' mangled-name='urcu_memb_defer_exit' filepath='src/urcu-defer-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_unregister_thread() -->
+    <function-decl name='urcu_memb_defer_unregister_thread' mangled-name='rcu_defer_unregister_thread_memb' filepath='src/urcu-defer-impl.h' line='456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_unregister_thread_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_defer_register_thread() -->
+    <function-decl name='urcu_memb_defer_register_thread' mangled-name='urcu_memb_defer_register_thread' filepath='src/urcu-defer-impl.h' line='432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_memb_defer_rcu' mangled-name='defer_rcu_memb' filepath='src/urcu-defer-impl.h' line='400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_memb'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_barrier() -->
+    <function-decl name='urcu_memb_defer_barrier' mangled-name='rcu_defer_barrier_memb' filepath='src/urcu-defer-impl.h' line='284' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_barrier_thread() -->
+    <function-decl name='urcu_memb_defer_barrier_thread' mangled-name='rcu_defer_barrier_thread_memb' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_memb_unregister_rculfhash_atfork' mangled-name='urcu_memb_unregister_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_unregister_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_memb_register_rculfhash_atfork' mangled-name='urcu_register_rculfhash_atfork_memb' filepath='src/urcu-call-rcu-impl.h' line='1044' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_register_rculfhash_atfork_memb'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_memb_call_rcu_after_fork_child' mangled-name='call_rcu_after_fork_child_memb' filepath='src/urcu-call-rcu-impl.h' line='1000' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_memb_call_rcu_after_fork_parent' mangled-name='urcu_memb_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='976' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_before_fork() -->
+    <function-decl name='urcu_memb_call_rcu_before_fork' mangled-name='urcu_memb_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='947' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_barrier() -->
+    <function-decl name='urcu_memb_barrier' mangled-name='rcu_barrier_memb' filepath='src/urcu-call-rcu-impl.h' line='874' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_barrier_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_memb_free_all_cpu_call_rcu_data' mangled-name='urcu_memb_free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-1' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_memb_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_memb_call_rcu_data_free' mangled-name='urcu_memb_call_rcu_data_free' filepath='src/urcu-call-rcu-impl.h' line='764' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_data_free'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='764' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_memb_call_rcu' mangled-name='urcu_memb_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='725' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='725' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='726' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_memb_create_all_cpu_call_rcu_data' mangled-name='create_all_cpu_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_memb'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='645' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_memb_set_thread_call_rcu_data' mangled-name='set_thread_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_thread_call_rcu_data_memb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='630' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_thread_call_rcu_data' mangled-name='get_thread_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_thread_call_rcu_data_memb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_call_rcu_data' mangled-name='get_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='590' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_data_memb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_default_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_default_call_rcu_data' mangled-name='urcu_memb_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_memb_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_memb_set_cpu_call_rcu_data' mangled-name='urcu_memb_set_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_set_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_memb_create_call_rcu_data' mangled-name='urcu_memb_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='498' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='499' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_memb_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_memb_get_call_rcu_thread' mangled-name='urcu_memb_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='476' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_memb_get_cpu_call_rcu_data' mangled-name='get_cpu_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='452' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_memb'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='452' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_memb_init() -->
+    <function-decl name='urcu_memb_init' mangled-name='rcu_init_memb' filepath='src/urcu.c' line='613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_init_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_unregister_thread() -->
+    <function-decl name='urcu_memb_unregister_thread' mangled-name='urcu_memb_unregister_thread' filepath='src/urcu.c' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_register_thread() -->
+    <function-decl name='urcu_memb_register_thread' mangled-name='urcu_memb_register_thread' filepath='src/urcu.c' line='547' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_read_ongoing() -->
+    <function-decl name='urcu_memb_read_ongoing' mangled-name='urcu_memb_read_ongoing' filepath='src/urcu.c' line='540' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_ongoing'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_read_unlock() -->
+    <function-decl name='urcu_memb_read_unlock' mangled-name='urcu_memb_read_unlock' filepath='src/urcu.c' line='533' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_unlock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_read_lock() -->
+    <function-decl name='urcu_memb_read_lock' mangled-name='rcu_read_lock_memb' filepath='src/urcu.c' line='526' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_lock_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_synchronize_rcu() -->
+    <function-decl name='urcu_memb_synchronize_rcu' mangled-name='urcu_memb_synchronize_rcu' filepath='src/urcu.c' line='403' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-bp.so.6.xml b/extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-bp.so.6.xml
new file mode 100644 (file)
index 0000000..df3f029
--- /dev/null
@@ -0,0 +1,985 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-bp.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_child_bp -->
+    <elf-symbol name='call_rcu_after_fork_child_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_call_rcu_after_fork_child' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_bp -->
+    <elf-symbol name='call_rcu_after_fork_parent_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_bp -->
+    <elf-symbol name='call_rcu_before_fork_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_bp -->
+    <elf-symbol name='call_rcu_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_call_rcu' is-defined='yes'/>
+    <!-- call_rcu_data_free_bp -->
+    <elf-symbol name='call_rcu_data_free_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_call_rcu_data_free' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_bp -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_create_all_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- create_call_rcu_data_bp -->
+    <elf-symbol name='create_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_create_call_rcu_data' is-defined='yes'/>
+    <!-- defer_rcu_bp -->
+    <elf-symbol name='defer_rcu_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_defer_rcu' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data_bp -->
+    <elf-symbol name='free_all_cpu_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_free_all_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- get_call_rcu_data_bp -->
+    <elf-symbol name='get_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_get_call_rcu_data' is-defined='yes'/>
+    <!-- get_call_rcu_thread_bp -->
+    <elf-symbol name='get_call_rcu_thread_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_bp -->
+    <elf-symbol name='get_cpu_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_bp -->
+    <elf-symbol name='get_default_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_bp -->
+    <elf-symbol name='get_thread_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_barrier_bp -->
+    <elf-symbol name='rcu_barrier_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_barrier' is-defined='yes'/>
+    <!-- rcu_bp_after_fork_child -->
+    <elf-symbol name='rcu_bp_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_after_fork_child' is-defined='yes'/>
+    <!-- rcu_bp_after_fork_parent -->
+    <elf-symbol name='rcu_bp_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_bp_before_fork -->
+    <elf-symbol name='rcu_bp_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_bp_register -->
+    <elf-symbol name='rcu_bp_register' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_register' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym_bp -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_cmpxchg_pointer_sym' is-defined='yes'/>
+    <!-- rcu_defer_barrier_bp -->
+    <elf-symbol name='rcu_defer_barrier_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_defer_barrier' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_bp -->
+    <elf-symbol name='rcu_defer_barrier_thread_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_defer_barrier_thread' is-defined='yes'/>
+    <!-- rcu_defer_exit_bp -->
+    <elf-symbol name='rcu_defer_exit_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_bp -->
+    <elf-symbol name='rcu_defer_register_thread_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_bp -->
+    <elf-symbol name='rcu_defer_unregister_thread_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym_bp -->
+    <elf-symbol name='rcu_dereference_sym_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_dereference_sym' is-defined='yes'/>
+    <!-- rcu_read_lock_bp -->
+    <elf-symbol name='rcu_read_lock_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_ongoing_bp -->
+    <elf-symbol name='rcu_read_ongoing_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_unlock_bp -->
+    <elf-symbol name='rcu_read_unlock_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_read_unlock' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym_bp -->
+    <elf-symbol name='rcu_set_pointer_sym_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym_bp -->
+    <elf-symbol name='rcu_xchg_pointer_sym_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_bp -->
+    <elf-symbol name='set_cpu_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_set_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_bp -->
+    <elf-symbol name='set_thread_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- synchronize_rcu_bp -->
+    <elf-symbol name='synchronize_rcu_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_after_fork_child -->
+    <elf-symbol name='urcu_bp_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_after_fork_parent -->
+    <elf-symbol name='urcu_bp_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_bp_after_fork_parent' is-defined='yes'/>
+    <!-- urcu_bp_barrier -->
+    <elf-symbol name='urcu_bp_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_before_fork -->
+    <elf-symbol name='urcu_bp_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_bp_before_fork' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu -->
+    <elf-symbol name='urcu_bp_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_bp_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_bp_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_after_fork_parent_bp' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu_before_fork -->
+    <elf-symbol name='urcu_bp_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_before_fork_bp' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu_data_free -->
+    <elf-symbol name='urcu_bp_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_cmpxchg_pointer_sym -->
+    <elf-symbol name='urcu_bp_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_bp_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_create_call_rcu_data -->
+    <elf-symbol name='urcu_bp_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_barrier -->
+    <elf-symbol name='urcu_bp_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_barrier_thread -->
+    <elf-symbol name='urcu_bp_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_exit -->
+    <elf-symbol name='urcu_bp_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_exit_bp' is-defined='yes'/>
+    <!-- urcu_bp_defer_rcu -->
+    <elf-symbol name='urcu_bp_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_register_thread -->
+    <elf-symbol name='urcu_bp_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_register_thread_bp' is-defined='yes'/>
+    <!-- urcu_bp_defer_unregister_thread -->
+    <elf-symbol name='urcu_bp_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_unregister_thread_bp' is-defined='yes'/>
+    <!-- urcu_bp_dereference_sym -->
+    <elf-symbol name='urcu_bp_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_bp_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_get_call_rcu_data -->
+    <elf-symbol name='urcu_bp_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_get_call_rcu_thread -->
+    <elf-symbol name='urcu_bp_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_call_rcu_thread_bp' is-defined='yes'/>
+    <!-- urcu_bp_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_bp_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_cpu_call_rcu_data_bp' is-defined='yes'/>
+    <!-- urcu_bp_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_bp_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_default_call_rcu_data_bp' is-defined='yes'/>
+    <!-- urcu_bp_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_bp_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_thread_call_rcu_data_bp' is-defined='yes'/>
+    <!-- urcu_bp_read_lock -->
+    <elf-symbol name='urcu_bp_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_read_lock_bp' is-defined='yes'/>
+    <!-- urcu_bp_read_ongoing -->
+    <elf-symbol name='urcu_bp_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_read_ongoing_bp' is-defined='yes'/>
+    <!-- urcu_bp_read_unlock -->
+    <elf-symbol name='urcu_bp_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_register -->
+    <elf-symbol name='urcu_bp_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_bp_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_register_thread -->
+    <elf-symbol name='urcu_bp_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_bp_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_set_pointer_sym -->
+    <elf-symbol name='urcu_bp_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_set_pointer_sym_bp' is-defined='yes'/>
+    <!-- urcu_bp_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_bp_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='set_thread_call_rcu_data_bp' is-defined='yes'/>
+    <!-- urcu_bp_synchronize_rcu -->
+    <elf-symbol name='urcu_bp_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='synchronize_rcu_bp' is-defined='yes'/>
+    <!-- urcu_bp_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_bp_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_unregister_rculfhash_atfork_bp' is-defined='yes'/>
+    <!-- urcu_bp_xchg_pointer_sym -->
+    <elf-symbol name='urcu_bp_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_xchg_pointer_sym_bp' is-defined='yes'/>
+    <!-- urcu_register_rculfhash_atfork_bp -->
+    <elf-symbol name='urcu_register_rculfhash_atfork_bp' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_register_rculfhash_atfork' is-defined='yes'/>
+    <!-- urcu_unregister_rculfhash_atfork_bp -->
+    <elf-symbol name='urcu_unregister_rculfhash_atfork_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_bp -->
+    <elf-symbol name='rcu_flavor_bp' size='112' type='object-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_flavor' is-defined='yes'/>
+    <!-- rcu_gp_bp -->
+    <elf-symbol name='rcu_gp_bp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' alias='urcu_bp_gp' is-defined='yes'/>
+    <!-- rcu_reader_bp -->
+    <elf-symbol name='rcu_reader_bp' size='8' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_flavor -->
+    <elf-symbol name='urcu_bp_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_gp -->
+    <elf-symbol name='urcu_bp_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_has_sys_membarrier -->
+    <elf-symbol name='urcu_bp_has_sys_membarrier' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_reader -->
+    <elf-symbol name='urcu_bp_reader' size='8' type='tls-type' binding='global-binding' visibility='default-visibility' alias='rcu_reader_bp' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu-bp.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <!-- int urcu_bp_has_sys_membarrier -->
+    <var-decl name='urcu_bp_has_sys_membarrier' type-id='type-id-1' mangled-name='urcu_bp_has_sys_membarrier' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='109' column='1' elf-symbol-id='urcu_bp_has_sys_membarrier'/>
+    <!-- struct urcu_bp_gp -->
+    <class-decl name='urcu_bp_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='77' column='1' id='type-id-2'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_bp_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- urcu_bp_gp urcu_bp_gp -->
+    <var-decl name='urcu_bp_gp' type-id='type-id-2' mangled-name='rcu_gp_bp' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='88' column='1' elf-symbol-id='rcu_gp_bp'/>
+    <!-- struct urcu_bp_reader -->
+    <class-decl name='urcu_bp_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='90' column='1' id='type-id-4'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_bp_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='92' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_bp_reader::node -->
+        <var-decl name='node' type-id='type-id-5' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_bp_reader::tid -->
+        <var-decl name='tid' type-id='type-id-6' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='95' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1216'>
+        <!-- int urcu_bp_reader::alloc -->
+        <var-decl name='alloc' type-id='type-id-1' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='96' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-5'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-7' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-7' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-7'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-6'/>
+    <!-- urcu_bp_reader* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-8'/>
+    <!-- urcu_bp_reader* urcu_bp_reader -->
+    <var-decl name='urcu_bp_reader' type-id='type-id-8' mangled-name='urcu_bp_reader' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='104' column='1' elf-symbol-id='urcu_bp_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-9'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-11' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-15'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-16' size-in-bits='64' id='type-id-10'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-11'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-18'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-19' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-20' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-19'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-21'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-22'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-23' size-in-bits='64' id='type-id-20'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-24' size-in-bits='64' id='type-id-12'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-15' size-in-bits='64' id='type-id-25'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-27'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-13'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-29'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-27' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-27' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-27' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-25' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-14'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-9' const='yes' id='type-id-32'/>
+    <!-- const rcu_flavor_struct urcu_bp_flavor -->
+    <var-decl name='urcu_bp_flavor' type-id='type-id-32' mangled-name='rcu_flavor_bp' visibility='default' filepath='../include/urcu/flavor.h' line='90' column='1' elf-symbol-id='rcu_flavor_bp'/>
+    <!-- void urcu_bp_defer_exit() -->
+    <function-decl name='urcu_bp_defer_exit' mangled-name='urcu_bp_defer_exit' filepath='src/urcu-defer-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_defer_unregister_thread() -->
+    <function-decl name='urcu_bp_defer_unregister_thread' mangled-name='urcu_bp_defer_unregister_thread' filepath='src/urcu-defer-impl.h' line='456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_defer_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int urcu_bp_defer_register_thread() -->
+    <function-decl name='urcu_bp_defer_register_thread' mangled-name='urcu_bp_defer_register_thread' filepath='src/urcu-defer-impl.h' line='432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_bp_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_bp_defer_rcu' mangled-name='defer_rcu_bp' filepath='src/urcu-defer-impl.h' line='400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_bp'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-27' name='fct' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='p' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_defer_barrier() -->
+    <function-decl name='urcu_bp_defer_barrier' mangled-name='rcu_defer_barrier_bp' filepath='src/urcu-defer-impl.h' line='284' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_defer_barrier_thread() -->
+    <function-decl name='urcu_bp_defer_barrier_thread' mangled-name='rcu_defer_barrier_thread_bp' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_bp_unregister_rculfhash_atfork' mangled-name='urcu_bp_unregister_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_unregister_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-30' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_bp_register_rculfhash_atfork' mangled-name='urcu_register_rculfhash_atfork_bp' filepath='src/urcu-call-rcu-impl.h' line='1044' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_register_rculfhash_atfork_bp'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-30' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_bp_call_rcu_after_fork_child' mangled-name='call_rcu_after_fork_child_bp' filepath='src/urcu-call-rcu-impl.h' line='1000' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_bp_call_rcu_after_fork_parent' mangled-name='urcu_bp_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='976' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_call_rcu_before_fork() -->
+    <function-decl name='urcu_bp_call_rcu_before_fork' mangled-name='urcu_bp_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='947' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_barrier() -->
+    <function-decl name='urcu_bp_barrier' mangled-name='rcu_barrier_bp' filepath='src/urcu-call-rcu-impl.h' line='874' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_barrier_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_bp_free_all_cpu_call_rcu_data' mangled-name='free_all_cpu_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_all_cpu_call_rcu_data_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-33'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-34' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-35' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-36' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-6' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-1' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-5' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-34'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-35'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-19' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-37' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-38'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-39' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-40' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-39'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-42'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-43'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-45'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-46'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-45' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-44'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-47'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='320' id='type-id-40'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-41'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-38' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-37'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-1' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-49'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-49' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-36'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-50'/>
+    <!-- void urcu_bp_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_bp_call_rcu_data_free' mangled-name='call_rcu_data_free_bp' filepath='src/urcu-call-rcu-impl.h' line='764' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_data_free_bp'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='764' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_bp_call_rcu' mangled-name='call_rcu_bp' filepath='src/urcu-call-rcu-impl.h' line='725' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_bp'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-22' name='head' filepath='src/urcu-call-rcu-impl.h' line='725' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-20' name='func' filepath='src/urcu-call-rcu-impl.h' line='726' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int urcu_bp_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_bp_create_all_cpu_call_rcu_data' mangled-name='create_all_cpu_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_bp'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='645' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_bp_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_bp_set_thread_call_rcu_data' mangled-name='urcu_bp_set_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_set_thread_call_rcu_data'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='630' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_bp_get_thread_call_rcu_data' mangled-name='urcu_bp_get_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_get_thread_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_get_call_rcu_data() -->
+    <function-decl name='urcu_bp_get_call_rcu_data' mangled-name='get_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='590' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_data_bp'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_get_default_call_rcu_data() -->
+    <function-decl name='urcu_bp_get_default_call_rcu_data' mangled-name='urcu_bp_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- int urcu_bp_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_bp_set_cpu_call_rcu_data' mangled-name='set_cpu_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_cpu_call_rcu_data_bp'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_bp_create_call_rcu_data' mangled-name='create_call_rcu_data_bp' filepath='src/urcu-call-rcu-impl.h' line='498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_call_rcu_data_bp'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='498' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='499' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- pthread_t urcu_bp_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_bp_get_call_rcu_thread' mangled-name='urcu_bp_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='476' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_bp_get_cpu_call_rcu_data' mangled-name='urcu_bp_get_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='452' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_get_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='452' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-25' size-in-bits='64' id='type-id-51'/>
+    <!-- void* urcu_bp_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='urcu_bp_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym_bp' filepath='src/urcu-bp.c' line='780' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym_bp'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='780' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='old' filepath='src/urcu-bp.c' line='780' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='_new' filepath='src/urcu-bp.c' line='780' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* urcu_bp_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='urcu_bp_xchg_pointer_sym' mangled-name='urcu_bp_xchg_pointer_sym' filepath='src/urcu-bp.c' line='772' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='772' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='772' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* urcu_bp_set_pointer_sym(void**, void*) -->
+    <function-decl name='urcu_bp_set_pointer_sym' mangled-name='urcu_bp_set_pointer_sym' filepath='src/urcu-bp.c' line='763' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='763' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='763' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* urcu_bp_dereference_sym(void*) -->
+    <function-decl name='urcu_bp_dereference_sym' mangled-name='rcu_dereference_sym_bp' filepath='src/urcu-bp.c' line='756' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym_bp'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='p' filepath='src/urcu-bp.c' line='756' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void urcu_bp_after_fork_child() -->
+    <function-decl name='urcu_bp_after_fork_child' mangled-name='rcu_bp_after_fork_child' filepath='src/urcu-bp.c' line='741' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_bp_after_fork_child'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_after_fork_parent() -->
+    <function-decl name='urcu_bp_after_fork_parent' mangled-name='urcu_bp_after_fork_parent' filepath='src/urcu-bp.c' line='704' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_before_fork() -->
+    <function-decl name='urcu_bp_before_fork' mangled-name='urcu_bp_before_fork' filepath='src/urcu-bp.c' line='689' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_register_thread() -->
+    <function-decl name='urcu_bp_register_thread' mangled-name='urcu_bp_register_thread' filepath='src/urcu-bp.c' line='572' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_register() -->
+    <function-decl name='urcu_bp_register' mangled-name='rcu_bp_register' filepath='src/urcu-bp.c' line='538' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_bp_register'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int urcu_bp_read_ongoing() -->
+    <function-decl name='urcu_bp_read_ongoing' mangled-name='urcu_bp_read_ongoing' filepath='src/urcu-bp.c' line='370' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_read_ongoing'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_bp_read_unlock() -->
+    <function-decl name='urcu_bp_read_unlock' mangled-name='rcu_read_unlock_bp' filepath='src/urcu-bp.c' line='364' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_unlock_bp'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_read_lock() -->
+    <function-decl name='urcu_bp_read_lock' mangled-name='urcu_bp_read_lock' filepath='src/urcu-bp.c' line='358' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_read_lock'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_synchronize_rcu() -->
+    <function-decl name='urcu_bp_synchronize_rcu' mangled-name='urcu_bp_synchronize_rcu' filepath='src/urcu-bp.c' line='274' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-17'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-16'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-23'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-22'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-24'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-22'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-20'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-28'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-27'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='780' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='old' filepath='src/urcu-bp.c' line='780' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='_new' filepath='src/urcu-bp.c' line='780' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='772' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='772' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='763' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='763' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='p' filepath='src/urcu-bp.c' line='756' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-37' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-52'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-55' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-53'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-56' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-56'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-59' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-58'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-59'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-42' size-in-bits='64' id='type-id-57'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-60'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='384' id='type-id-54'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-61'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-55'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-52' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-62'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-62' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-63'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-64'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-66' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-41' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-65'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-41' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-66'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-64' const='yes' id='type-id-67'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-67' size-in-bits='64' id='type-id-68'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-68' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-68' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-cds.so.6.xml b/extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-cds.so.6.xml
new file mode 100644 (file)
index 0000000..ccfe923
--- /dev/null
@@ -0,0 +1,1484 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-cds.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- __cds_lfs_init -->
+    <elf-symbol name='__cds_lfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_lfs_pop -->
+    <elf-symbol name='__cds_lfs_pop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_lfs_pop_all -->
+    <elf-symbol name='__cds_lfs_pop_all' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _cds_lfht_new -->
+    <elf-symbol name='_cds_lfht_new' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_add -->
+    <elf-symbol name='cds_lfht_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_add_replace -->
+    <elf-symbol name='cds_lfht_add_replace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_add_unique -->
+    <elf-symbol name='cds_lfht_add_unique' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_count_nodes -->
+    <elf-symbol name='cds_lfht_count_nodes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_del -->
+    <elf-symbol name='cds_lfht_del' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_destroy -->
+    <elf-symbol name='cds_lfht_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_first -->
+    <elf-symbol name='cds_lfht_first' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_fls_ulong -->
+    <elf-symbol name='cds_lfht_fls_ulong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_get_count_order_ulong -->
+    <elf-symbol name='cds_lfht_get_count_order_ulong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_is_node_deleted -->
+    <elf-symbol name='cds_lfht_is_node_deleted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_lookup -->
+    <elf-symbol name='cds_lfht_lookup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_next -->
+    <elf-symbol name='cds_lfht_next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_next_duplicate -->
+    <elf-symbol name='cds_lfht_next_duplicate' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_replace -->
+    <elf-symbol name='cds_lfht_replace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_resize -->
+    <elf-symbol name='cds_lfht_resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_dequeue_rcu -->
+    <elf-symbol name='cds_lfq_dequeue_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_destroy_rcu -->
+    <elf-symbol name='cds_lfq_destroy_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_enqueue_rcu -->
+    <elf-symbol name='cds_lfq_enqueue_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_init_rcu -->
+    <elf-symbol name='cds_lfq_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_node_init_rcu -->
+    <elf-symbol name='cds_lfq_node_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_destroy -->
+    <elf-symbol name='cds_lfs_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_empty -->
+    <elf-symbol name='cds_lfs_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_init -->
+    <elf-symbol name='cds_lfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_init_rcu -->
+    <elf-symbol name='cds_lfs_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_node_init -->
+    <elf-symbol name='cds_lfs_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_node_init_rcu -->
+    <elf-symbol name='cds_lfs_node_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_all_blocking -->
+    <elf-symbol name='cds_lfs_pop_all_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_blocking -->
+    <elf-symbol name='cds_lfs_pop_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_lock -->
+    <elf-symbol name='cds_lfs_pop_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_rcu -->
+    <elf-symbol name='cds_lfs_pop_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_unlock -->
+    <elf-symbol name='cds_lfs_pop_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_push -->
+    <elf-symbol name='cds_lfs_push' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_push_rcu -->
+    <elf-symbol name='cds_lfs_push_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_create -->
+    <elf-symbol name='urcu_workqueue_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_create_completion -->
+    <elf-symbol name='urcu_workqueue_create_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_create_worker -->
+    <elf-symbol name='urcu_workqueue_create_worker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_destroy -->
+    <elf-symbol name='urcu_workqueue_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_destroy_completion -->
+    <elf-symbol name='urcu_workqueue_destroy_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_flush_queued_work -->
+    <elf-symbol name='urcu_workqueue_flush_queued_work' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_pause_worker -->
+    <elf-symbol name='urcu_workqueue_pause_worker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_queue_completion -->
+    <elf-symbol name='urcu_workqueue_queue_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_queue_work -->
+    <elf-symbol name='urcu_workqueue_queue_work' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_resume_worker -->
+    <elf-symbol name='urcu_workqueue_resume_worker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_wait_completion -->
+    <elf-symbol name='urcu_workqueue_wait_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_mm_chunk -->
+    <elf-symbol name='cds_lfht_mm_chunk' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_mm_mmap -->
+    <elf-symbol name='cds_lfht_mm_mmap' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_mm_order -->
+    <elf-symbol name='cds_lfht_mm_order' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='rculfqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfq_node_rcu -->
+    <class-decl name='cds_lfq_node_rcu' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/rculfqueue.h' line='35' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfq_node_rcu* cds_lfq_node_rcu::next -->
+        <var-decl name='next' type-id='type-id-2' visibility='default' filepath='../include/urcu/rculfqueue.h' line='36' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int cds_lfq_node_rcu::dummy -->
+        <var-decl name='dummy' type-id='type-id-3' visibility='default' filepath='../include/urcu/rculfqueue.h' line='37' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfq_node_rcu* -->
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-3'/>
+    <!-- struct cds_lfq_queue_rcu -->
+    <class-decl name='cds_lfq_queue_rcu' size-in-bits='192' is-struct='yes' visibility='default' filepath='../include/urcu/rculfqueue.h' line='40' column='1' id='type-id-4'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfq_node_rcu* cds_lfq_queue_rcu::head -->
+        <var-decl name='head' type-id='type-id-2' visibility='default' filepath='../include/urcu/rculfqueue.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_lfq_node_rcu* cds_lfq_queue_rcu::tail -->
+        <var-decl name='tail' type-id='type-id-2' visibility='default' filepath='../include/urcu/rculfqueue.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* cds_lfq_queue_rcu::queue_call_rcu -->
+        <var-decl name='queue_call_rcu' type-id='type-id-5' visibility='default' filepath='../include/urcu/rculfqueue.h' line='42' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-6'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-7'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-8' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-9' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-10' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-10'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-7' size-in-bits='64' id='type-id-11'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-12' size-in-bits='64' id='type-id-9'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-13' size-in-bits='64' id='type-id-5'/>
+    <!-- cds_lfq_queue_rcu* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-14'/>
+    <!-- cds_lfq_node_rcu* cds_lfq_dequeue_rcu(cds_lfq_queue_rcu*) -->
+    <function-decl name='cds_lfq_dequeue_rcu' mangled-name='cds_lfq_dequeue_rcu' filepath='src/rculfqueue.c' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_dequeue_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='56' column='1'/>
+      <!-- cds_lfq_node_rcu* -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void cds_lfq_enqueue_rcu(cds_lfq_queue_rcu*, cds_lfq_node_rcu*) -->
+    <function-decl name='cds_lfq_enqueue_rcu' mangled-name='cds_lfq_enqueue_rcu' filepath='src/rculfqueue.c' line='50' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_enqueue_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='50' column='1'/>
+      <!-- parameter of type 'cds_lfq_node_rcu*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/rculfqueue.c' line='50' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- int cds_lfq_destroy_rcu(cds_lfq_queue_rcu*) -->
+    <function-decl name='cds_lfq_destroy_rcu' mangled-name='cds_lfq_destroy_rcu' filepath='src/rculfqueue.c' line='45' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_destroy_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='45' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- void cds_lfq_init_rcu(cds_lfq_queue_rcu*, void (rcu_head*, void (rcu_head*)*)*) -->
+    <function-decl name='cds_lfq_init_rcu' mangled-name='cds_lfq_init_rcu' filepath='src/rculfqueue.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_init_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='38' column='1'/>
+      <!-- parameter of type 'void (rcu_head*, void (rcu_head*)*)*' -->
+      <parameter type-id='type-id-5' name='queue_call_rcu' filepath='src/rculfqueue.c' line='39' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfq_node_init_rcu(cds_lfq_node_rcu*) -->
+    <function-decl name='cds_lfq_node_init_rcu' mangled-name='cds_lfq_node_init_rcu' filepath='src/rculfqueue.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_node_init_rcu'>
+      <!-- parameter of type 'cds_lfq_node_rcu*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/rculfqueue.c' line='33' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-12'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-11'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-13'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-11'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-9'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfstack.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfs_node_rcu -->
+    <class-decl name='cds_lfs_node_rcu' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/rculfstack.h' line='37' column='1' id='type-id-15'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node_rcu* cds_lfs_node_rcu::next -->
+        <var-decl name='next' type-id='type-id-16' visibility='default' filepath='../include/urcu/rculfstack.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfs_node_rcu* -->
+    <pointer-type-def type-id='type-id-15' size-in-bits='64' id='type-id-16'/>
+    <!-- struct cds_lfs_stack_rcu -->
+    <class-decl name='cds_lfs_stack_rcu' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/rculfstack.h' line='41' column='1' id='type-id-17'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node_rcu* cds_lfs_stack_rcu::head -->
+        <var-decl name='head' type-id='type-id-16' visibility='default' filepath='../include/urcu/rculfstack.h' line='42' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfs_stack_rcu* -->
+    <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-18'/>
+    <!-- cds_lfs_node_rcu* cds_lfs_pop_rcu(cds_lfs_stack_rcu*) -->
+    <function-decl name='cds_lfs_pop_rcu' mangled-name='cds_lfs_pop_rcu' filepath='src/rculfstack.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_rcu'>
+      <!-- parameter of type 'cds_lfs_stack_rcu*' -->
+      <parameter type-id='type-id-18' name='s' filepath='src/rculfstack.c' line='53' column='1'/>
+      <!-- cds_lfs_node_rcu* -->
+      <return type-id='type-id-16'/>
+    </function-decl>
+    <!-- int cds_lfs_push_rcu(cds_lfs_stack_rcu*, cds_lfs_node_rcu*) -->
+    <function-decl name='cds_lfs_push_rcu' mangled-name='cds_lfs_push_rcu' filepath='src/rculfstack.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_push_rcu'>
+      <!-- parameter of type 'cds_lfs_stack_rcu*' -->
+      <parameter type-id='type-id-18' name='s' filepath='src/rculfstack.c' line='47' column='1'/>
+      <!-- parameter of type 'cds_lfs_node_rcu*' -->
+      <parameter type-id='type-id-16' name='node' filepath='src/rculfstack.c' line='48' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- void cds_lfs_init_rcu(cds_lfs_stack_rcu*) -->
+    <function-decl name='cds_lfs_init_rcu' mangled-name='cds_lfs_init_rcu' filepath='src/rculfstack.c' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_init_rcu'>
+      <!-- parameter of type 'cds_lfs_stack_rcu*' -->
+      <parameter type-id='type-id-18' name='s' filepath='src/rculfstack.c' line='42' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_node_init_rcu(cds_lfs_node_rcu*) -->
+    <function-decl name='cds_lfs_node_init_rcu' mangled-name='cds_lfs_node_init_rcu' filepath='src/rculfstack.c' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_node_init_rcu'>
+      <!-- parameter of type 'cds_lfs_node_rcu*' -->
+      <parameter type-id='type-id-16' name='node' filepath='src/rculfstack.c' line='37' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='lfstack.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfs_head -->
+    <class-decl name='cds_lfs_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='69' column='1' id='type-id-19'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node cds_lfs_head::node -->
+        <var-decl name='node' type-id='type-id-20' visibility='default' filepath='../include/urcu/lfstack.h' line='70' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_lfs_node -->
+    <class-decl name='cds_lfs_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='59' column='1' id='type-id-20'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node* cds_lfs_node::next -->
+        <var-decl name='next' type-id='type-id-21' visibility='default' filepath='../include/urcu/lfstack.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfs_node* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-21'/>
+    <!-- cds_lfs_head* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-22'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='87' column='1' id='type-id-23'>
+      <data-member access='private'>
+        <!-- __cds_lfs_stack* __anonymous_union__::_s -->
+        <var-decl name='_s' type-id='type-id-24' visibility='default' filepath='../include/urcu/lfstack.h' line='88' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_lfs_stack* __anonymous_union__::s -->
+        <var-decl name='s' type-id='type-id-25' visibility='default' filepath='../include/urcu/lfstack.h' line='89' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __cds_lfs_stack -->
+    <class-decl name='__cds_lfs_stack' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='73' column='1' id='type-id-26'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_head* __cds_lfs_stack::head -->
+        <var-decl name='head' type-id='type-id-22' visibility='default' filepath='../include/urcu/lfstack.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __cds_lfs_stack* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-24'/>
+    <!-- struct cds_lfs_stack -->
+    <class-decl name='cds_lfs_stack' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='77' column='1' id='type-id-27'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_head* cds_lfs_stack::head -->
+        <var-decl name='head' type-id='type-id-22' visibility='default' filepath='../include/urcu/lfstack.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_lfs_stack::lock -->
+        <var-decl name='lock' type-id='type-id-28' visibility='default' filepath='../include/urcu/lfstack.h' line='79' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-29'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-30' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-31' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-32' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-30'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-3' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-3' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-3' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-34' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-34' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-35' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-33'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-34'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-37' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-37' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-37'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-36' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-35'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-38'/>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-39'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-38' size-in-bits='320' id='type-id-31'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-39' id='type-id-40'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-32'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-29' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-28'/>
+    <!-- cds_lfs_stack* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-25'/>
+    <!-- typedef __anonymous_union__ cds_lfs_stack_ptr_t -->
+    <typedef-decl name='cds_lfs_stack_ptr_t' type-id='type-id-23' filepath='../include/urcu/lfstack.h' line='90' column='1' id='type-id-41'/>
+    <!-- cds_lfs_head* __cds_lfs_pop_all(cds_lfs_stack_ptr_t) -->
+    <function-decl name='__cds_lfs_pop_all' mangled-name='__cds_lfs_pop_all' filepath='src/lfstack.c' line='88' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_lfs_pop_all'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='88' column='1'/>
+      <!-- cds_lfs_head* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_lfs_node* __cds_lfs_pop(cds_lfs_stack_ptr_t) -->
+    <function-decl name='__cds_lfs_pop' mangled-name='__cds_lfs_pop' filepath='src/lfstack.c' line='83' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_lfs_pop'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='83' column='1'/>
+      <!-- cds_lfs_node* -->
+      <return type-id='type-id-21'/>
+    </function-decl>
+    <!-- void cds_lfs_pop_unlock(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_unlock' mangled-name='cds_lfs_pop_unlock' filepath='src/lfstack.c' line='78' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_unlock'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_pop_lock(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_lock' mangled-name='cds_lfs_pop_lock' filepath='src/lfstack.c' line='73' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_lock'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- cds_lfs_head* cds_lfs_pop_all_blocking(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_all_blocking' mangled-name='cds_lfs_pop_all_blocking' filepath='src/lfstack.c' line='68' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_all_blocking'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='68' column='1'/>
+      <!-- cds_lfs_head* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_lfs_node* cds_lfs_pop_blocking(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_blocking' mangled-name='cds_lfs_pop_blocking' filepath='src/lfstack.c' line='63' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_blocking'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='63' column='1'/>
+      <!-- cds_lfs_node* -->
+      <return type-id='type-id-21'/>
+    </function-decl>
+    <!-- bool -->
+    <type-decl name='bool' size-in-bits='8' id='type-id-42'/>
+    <!-- bool cds_lfs_push(cds_lfs_stack_ptr_t, cds_lfs_node*) -->
+    <function-decl name='cds_lfs_push' mangled-name='cds_lfs_push' filepath='src/lfstack.c' line='58' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_push'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='58' column='1'/>
+      <!-- parameter of type 'cds_lfs_node*' -->
+      <parameter type-id='type-id-21' name='node' filepath='src/lfstack.c' line='58' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-42'/>
+    </function-decl>
+    <!-- bool cds_lfs_empty(cds_lfs_stack_ptr_t) -->
+    <function-decl name='cds_lfs_empty' mangled-name='cds_lfs_empty' filepath='src/lfstack.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_empty'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='53' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-42'/>
+    </function-decl>
+    <!-- void __cds_lfs_init(__cds_lfs_stack*) -->
+    <function-decl name='__cds_lfs_init' mangled-name='__cds_lfs_init' filepath='src/lfstack.c' line='48' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_lfs_init'>
+      <!-- parameter of type '__cds_lfs_stack*' -->
+      <parameter type-id='type-id-24' name='s' filepath='src/lfstack.c' line='48' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_destroy(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_destroy' mangled-name='cds_lfs_destroy' filepath='src/lfstack.c' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_destroy'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_init(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_init' mangled-name='cds_lfs_init' filepath='src/lfstack.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_init'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_node_init(cds_lfs_node*) -->
+    <function-decl name='cds_lfs_node_init' mangled-name='cds_lfs_node_init' filepath='src/lfstack.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_node_init'>
+      <!-- parameter of type 'cds_lfs_node*' -->
+      <parameter type-id='type-id-21' name='node' filepath='src/lfstack.c' line='33' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='workqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct urcu_workqueue -->
+    <class-decl name='urcu_workqueue' size-in-bits='2048' is-struct='yes' visibility='default' filepath='src/workqueue.c' line='54' column='1' id='type-id-43'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail urcu_workqueue::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-44' visibility='default' filepath='src/workqueue.c' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head urcu_workqueue::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-45' visibility='default' filepath='src/workqueue.c' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int urcu_workqueue::flags -->
+        <var-decl name='flags' type-id='type-id-39' visibility='default' filepath='src/workqueue.c' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t urcu_workqueue::futex -->
+        <var-decl name='futex' type-id='type-id-46' visibility='default' filepath='src/workqueue.c' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int urcu_workqueue::qlen -->
+        <var-decl name='qlen' type-id='type-id-39' visibility='default' filepath='src/workqueue.c' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t urcu_workqueue::tid -->
+        <var-decl name='tid' type-id='type-id-47' visibility='default' filepath='src/workqueue.c' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int urcu_workqueue::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-3' visibility='default' filepath='src/workqueue.c' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int urcu_workqueue::loop_count -->
+        <var-decl name='loop_count' type-id='type-id-39' visibility='default' filepath='src/workqueue.c' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void* urcu_workqueue::priv -->
+        <var-decl name='priv' type-id='type-id-48' visibility='default' filepath='src/workqueue.c' line='69' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='896'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::grace_period_fct -->
+        <var-decl name='grace_period_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='960'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::initialize_worker_fct -->
+        <var-decl name='initialize_worker_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='71' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::finalize_worker_fct -->
+        <var-decl name='finalize_worker_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1088'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_before_pause_fct -->
+        <var-decl name='worker_before_pause_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_after_resume_fct -->
+        <var-decl name='worker_after_resume_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1216'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_before_wait_fct -->
+        <var-decl name='worker_before_wait_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1280'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_after_wake_up_fct -->
+        <var-decl name='worker_after_wake_up_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='76' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-44'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-10' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-45'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-28' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-50'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-50' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-46'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-39' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-47'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-6' size-in-bits='64' id='type-id-48'/>
+    <!-- urcu_workqueue* -->
+    <pointer-type-def type-id='type-id-43' size-in-bits='64' id='type-id-51'/>
+    <!-- void (urcu_workqueue*, void*)* -->
+    <pointer-type-def type-id='type-id-52' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_workqueue_create_worker(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_create_worker' mangled-name='urcu_workqueue_create_worker' filepath='src/workqueue.c' line='458' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_create_worker'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='458' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_resume_worker(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_resume_worker' mangled-name='urcu_workqueue_resume_worker' filepath='src/workqueue.c' line='451' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_resume_worker'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='451' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_pause_worker(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_pause_worker' mangled-name='urcu_workqueue_pause_worker' filepath='src/workqueue.c' line='440' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_pause_worker'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='451' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_flush_queued_work(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_flush_queued_work' mangled-name='urcu_workqueue_flush_queued_work' filepath='src/workqueue.c' line='427' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_flush_queued_work'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='458' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- struct urcu_workqueue_completion -->
+    <class-decl name='urcu_workqueue_completion' size-in-bits='128' is-struct='yes' visibility='default' filepath='src/workqueue.c' line='79' column='1' id='type-id-53'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int urcu_workqueue_completion::barrier_count -->
+        <var-decl name='barrier_count' type-id='type-id-3' visibility='default' filepath='src/workqueue.c' line='80' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- int32_t urcu_workqueue_completion::futex -->
+        <var-decl name='futex' type-id='type-id-46' visibility='default' filepath='src/workqueue.c' line='81' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- urcu_ref urcu_workqueue_completion::ref -->
+        <var-decl name='ref' type-id='type-id-54' visibility='default' filepath='src/workqueue.c' line='82' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct urcu_ref -->
+    <class-decl name='urcu_ref' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/ref.h' line='23' column='1' id='type-id-54'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- long int urcu_ref::refcount -->
+        <var-decl name='refcount' type-id='type-id-32' visibility='default' filepath='../include/urcu/ref.h' line='24' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_workqueue_completion* -->
+    <pointer-type-def type-id='type-id-53' size-in-bits='64' id='type-id-55'/>
+    <!-- void urcu_workqueue_queue_completion(urcu_workqueue*, urcu_workqueue_completion*) -->
+    <function-decl name='urcu_workqueue_queue_completion' mangled-name='urcu_workqueue_queue_completion' filepath='src/workqueue.c' line='410' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_queue_completion'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='410' column='1'/>
+      <!-- parameter of type 'urcu_workqueue_completion*' -->
+      <parameter type-id='type-id-55' name='completion' filepath='src/workqueue.c' line='411' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_wait_completion(urcu_workqueue_completion*) -->
+    <function-decl name='urcu_workqueue_wait_completion' mangled-name='urcu_workqueue_wait_completion' filepath='src/workqueue.c' line='397' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_wait_completion'>
+      <!-- parameter of type 'urcu_workqueue_completion*' -->
+      <parameter type-id='type-id-55' name='completion' filepath='src/workqueue.c' line='397' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_destroy_completion(urcu_workqueue_completion*) -->
+    <function-decl name='urcu_workqueue_destroy_completion' mangled-name='urcu_workqueue_destroy_completion' filepath='src/workqueue.c' line='392' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_destroy_completion'>
+      <!-- parameter of type 'urcu_workqueue_completion*' -->
+      <parameter type-id='type-id-55' name='completion' filepath='src/workqueue.c' line='392' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- urcu_workqueue_completion* urcu_workqueue_create_completion() -->
+    <function-decl name='urcu_workqueue_create_completion' mangled-name='urcu_workqueue_create_completion' filepath='src/workqueue.c' line='380' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_create_completion'>
+      <!-- urcu_workqueue_completion* -->
+      <return type-id='type-id-55'/>
+    </function-decl>
+    <!-- struct urcu_work -->
+    <class-decl name='urcu_work' size-in-bits='128' is-struct='yes' visibility='default' filepath='src/workqueue.h' line='53' column='1' id='type-id-56'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node urcu_work::next -->
+        <var-decl name='next' type-id='type-id-8' visibility='default' filepath='src/workqueue.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (urcu_work*)* urcu_work::func -->
+        <var-decl name='func' type-id='type-id-57' visibility='default' filepath='src/workqueue.h' line='55' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_work* -->
+    <pointer-type-def type-id='type-id-56' size-in-bits='64' id='type-id-58'/>
+    <!-- void (urcu_work*)* -->
+    <pointer-type-def type-id='type-id-59' size-in-bits='64' id='type-id-57'/>
+    <!-- void urcu_workqueue_queue_work(urcu_workqueue*, urcu_work*, void (urcu_work*)*) -->
+    <function-decl name='urcu_workqueue_queue_work' mangled-name='urcu_workqueue_queue_work' filepath='src/workqueue.c' line='346' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_queue_work'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='346' column='1'/>
+      <!-- parameter of type 'urcu_work*' -->
+      <parameter type-id='type-id-58' name='work' filepath='src/workqueue.c' line='347' column='1'/>
+      <!-- parameter of type 'void (urcu_work*)*' -->
+      <parameter type-id='type-id-57' name='func' filepath='src/workqueue.c' line='348' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_destroy(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_destroy' mangled-name='urcu_workqueue_destroy' filepath='src/workqueue.c' line='334' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_destroy'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='458' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- urcu_workqueue* urcu_workqueue_create(unsigned long int, int, void*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*) -->
+    <function-decl name='urcu_workqueue_create' mangled-name='urcu_workqueue_create' filepath='src/workqueue.c' line='269' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_create'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='flags' filepath='src/workqueue.c' line='269' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='cpu_affinity' filepath='src/workqueue.c' line='270' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='priv' filepath='src/workqueue.c' line='270' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='grace_period_fct' filepath='src/workqueue.c' line='271' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='initialize_worker_fct' filepath='src/workqueue.c' line='272' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='finalize_worker_fct' filepath='src/workqueue.c' line='273' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_before_wait_fct' filepath='src/workqueue.c' line='274' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_after_wake_up_fct' filepath='src/workqueue.c' line='275' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_before_pause_fct' filepath='src/workqueue.c' line='276' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_after_resume_fct' filepath='src/workqueue.c' line='277' column='1'/>
+      <!-- urcu_workqueue* -->
+      <return type-id='type-id-51'/>
+    </function-decl>
+    <!-- void (urcu_work*) -->
+    <function-type size-in-bits='64' id='type-id-59'>
+      <!-- parameter of type 'urcu_work*' -->
+      <parameter type-id='type-id-58'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (urcu_workqueue*, void*) -->
+    <function-type size-in-bits='64' id='type-id-52'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfht -->
+    <class-decl name='cds_lfht' size-in-bits='5248' is-struct='yes' visibility='default' filepath='../src/rculfhash-internal.h' line='70' column='1' id='type-id-60'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int cds_lfht::max_nr_buckets -->
+        <var-decl name='max_nr_buckets' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- const cds_lfht_mm_type* cds_lfht::mm -->
+        <var-decl name='mm' type-id='type-id-61' visibility='default' filepath='../src/rculfhash-internal.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- const rcu_flavor_struct* cds_lfht::flavor -->
+        <var-decl name='flavor' type-id='type-id-62' visibility='default' filepath='../src/rculfhash-internal.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- long int cds_lfht::count -->
+        <var-decl name='count' type-id='type-id-32' visibility='default' filepath='../src/rculfhash-internal.h' line='76' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- pthread_mutex_t cds_lfht::resize_mutex -->
+        <var-decl name='resize_mutex' type-id='type-id-28' visibility='default' filepath='../src/rculfhash-internal.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- pthread_attr_t* cds_lfht::resize_attr -->
+        <var-decl name='resize_attr' type-id='type-id-63' visibility='default' filepath='../src/rculfhash-internal.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- unsigned int cds_lfht::in_progress_destroy -->
+        <var-decl name='in_progress_destroy' type-id='type-id-33' visibility='default' filepath='../src/rculfhash-internal.h' line='87' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- unsigned long int cds_lfht::resize_target -->
+        <var-decl name='resize_target' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='88' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- int cds_lfht::resize_initiated -->
+        <var-decl name='resize_initiated' type-id='type-id-3' visibility='default' filepath='../src/rculfhash-internal.h' line='89' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='800'>
+        <!-- int cds_lfht::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='../src/rculfhash-internal.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- unsigned long int cds_lfht::min_alloc_buckets_order -->
+        <var-decl name='min_alloc_buckets_order' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='95' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='896'>
+        <!-- unsigned long int cds_lfht::min_nr_alloc_buckets -->
+        <var-decl name='min_nr_alloc_buckets' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='96' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='960'>
+        <!-- ht_items_count* cds_lfht::split_count -->
+        <var-decl name='split_count' type-id='type-id-64' visibility='default' filepath='../src/rculfhash-internal.h' line='97' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- unsigned long int cds_lfht::size -->
+        <var-decl name='size' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='102' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1088'>
+        <!-- cds_lfht_node* (cds_lfht*, unsigned long int)* cds_lfht::bucket_at -->
+        <var-decl name='bucket_at' type-id='type-id-65' visibility='default' filepath='../src/rculfhash-internal.h' line='107' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-66' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_lfht_mm_type -->
+    <class-decl name='cds_lfht_mm_type' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/rculfhash.h' line='120' column='1' id='type-id-67'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfht* (unsigned long int, unsigned long int)* cds_lfht_mm_type::alloc_cds_lfht -->
+        <var-decl name='alloc_cds_lfht' type-id='type-id-68' visibility='default' filepath='../include/urcu/rculfhash.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (cds_lfht*, unsigned long int)* cds_lfht_mm_type::alloc_bucket_table -->
+        <var-decl name='alloc_bucket_table' type-id='type-id-69' visibility='default' filepath='../include/urcu/rculfhash.h' line='123' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (cds_lfht*, unsigned long int)* cds_lfht_mm_type::free_bucket_table -->
+        <var-decl name='free_bucket_table' type-id='type-id-69' visibility='default' filepath='../include/urcu/rculfhash.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- cds_lfht_node* (cds_lfht*, unsigned long int)* cds_lfht_mm_type::bucket_at -->
+        <var-decl name='bucket_at' type-id='type-id-65' visibility='default' filepath='../include/urcu/rculfhash.h' line='125' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfht* -->
+    <pointer-type-def type-id='type-id-60' size-in-bits='64' id='type-id-70'/>
+    <!-- cds_lfht* (unsigned long int, unsigned long int)* -->
+    <pointer-type-def type-id='type-id-71' size-in-bits='64' id='type-id-68'/>
+    <!-- void (cds_lfht*, unsigned long int)* -->
+    <pointer-type-def type-id='type-id-72' size-in-bits='64' id='type-id-69'/>
+    <!-- struct cds_lfht_node -->
+    <class-decl name='cds_lfht_node' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/rculfhash.h' line='63' column='1' id='type-id-73'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfht_node* cds_lfht_node::next -->
+        <var-decl name='next' type-id='type-id-74' visibility='default' filepath='../include/urcu/rculfhash.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- unsigned long int cds_lfht_node::reverse_hash -->
+        <var-decl name='reverse_hash' type-id='type-id-39' visibility='default' filepath='../include/urcu/rculfhash.h' line='65' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfht_node* -->
+    <pointer-type-def type-id='type-id-73' size-in-bits='64' id='type-id-74'/>
+    <!-- cds_lfht_node* (cds_lfht*, unsigned long int)* -->
+    <pointer-type-def type-id='type-id-75' size-in-bits='64' id='type-id-65'/>
+    <!-- const cds_lfht_mm_type -->
+    <qualified-type-def type-id='type-id-67' const='yes' id='type-id-76'/>
+    <!-- const cds_lfht_mm_type* -->
+    <pointer-type-def type-id='type-id-76' size-in-bits='64' id='type-id-61'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-77'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-79' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-5' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-80' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-81' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-81' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-82' size-in-bits='64' id='type-id-78'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-83' size-in-bits='64' id='type-id-79'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-84' size-in-bits='64' id='type-id-85'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-86' size-in-bits='64' id='type-id-80'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-87'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-85' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-85' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-85' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-48' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-87' size-in-bits='64' id='type-id-88'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-89' size-in-bits='64' id='type-id-81'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-77' const='yes' id='type-id-90'/>
+    <!-- const rcu_flavor_struct* -->
+    <pointer-type-def type-id='type-id-90' size-in-bits='64' id='type-id-62'/>
+    <!-- union pthread_attr_t -->
+    <union-decl name='pthread_attr_t' size-in-bits='448' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='56' column='1' id='type-id-91'>
+      <data-member access='private'>
+        <!-- char pthread_attr_t::__size[56] -->
+        <var-decl name='__size' type-id='type-id-92' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int pthread_attr_t::__align -->
+        <var-decl name='__align' type-id='type-id-32' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='59' column='1'/>
+      </data-member>
+    </union-decl>
+
+    <!-- char[56] -->
+    <array-type-def dimensions='1' type-id='type-id-38' size-in-bits='448' id='type-id-92'>
+      <!-- <anonymous range>[56] -->
+      <subrange length='56' type-id='type-id-39' id='type-id-93'/>
+
+    </array-type-def>
+    <!-- typedef pthread_attr_t pthread_attr_t -->
+    <typedef-decl name='pthread_attr_t' type-id='type-id-91' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='62' column='1' id='type-id-94'/>
+    <!-- pthread_attr_t* -->
+    <pointer-type-def type-id='type-id-94' size-in-bits='64' id='type-id-63'/>
+    <!-- struct ht_items_count -->
+    <class-decl name='ht_items_count' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/rculfhash.c' line='338' column='1' id='type-id-95'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int ht_items_count::add -->
+        <var-decl name='add' type-id='type-id-39' visibility='default' filepath='src/rculfhash.c' line='339' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- unsigned long int ht_items_count::del -->
+        <var-decl name='del' type-id='type-id-39' visibility='default' filepath='src/rculfhash.c' line='339' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- ht_items_count* -->
+    <pointer-type-def type-id='type-id-95' size-in-bits='64' id='type-id-64'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='4096' is-anonymous='yes' visibility='default' filepath='../src/rculfhash-internal.h' line='113' column='1' id='type-id-66'>
+      <data-member access='private'>
+        <!-- cds_lfht_node* __anonymous_union__::tbl_order[64] -->
+        <var-decl name='tbl_order' type-id='type-id-96' visibility='default' filepath='../src/rculfhash-internal.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_lfht_node* __anonymous_union__::tbl_chunk[1] -->
+        <var-decl name='tbl_chunk' type-id='type-id-97' visibility='default' filepath='../src/rculfhash-internal.h' line='134' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_lfht_node* __anonymous_union__::tbl_mmap -->
+        <var-decl name='tbl_mmap' type-id='type-id-74' visibility='default' filepath='../src/rculfhash-internal.h' line='140' column='1'/>
+      </data-member>
+    </union-decl>
+
+    <!-- cds_lfht_node*[64] -->
+    <array-type-def dimensions='1' type-id='type-id-74' size-in-bits='4096' id='type-id-96'>
+      <!-- <anonymous range>[64] -->
+      <subrange length='64' type-id='type-id-39' id='type-id-98'/>
+
+    </array-type-def>
+
+    <!-- cds_lfht_node*[1] -->
+    <array-type-def dimensions='1' type-id='type-id-74' size-in-bits='64' id='type-id-97'>
+      <!-- <anonymous range>[1] -->
+      <subrange length='1' type-id='type-id-39' id='type-id-99'/>
+
+    </array-type-def>
+    <!-- void cds_lfht_resize(cds_lfht*, unsigned long int) -->
+    <function-decl name='cds_lfht_resize' mangled-name='cds_lfht_resize' filepath='src/rculfhash.c' line='2028' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_resize'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='2028' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='new_size' filepath='src/rculfhash.c' line='2028' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- long int* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-100'/>
+    <!-- unsigned long int* -->
+    <pointer-type-def type-id='type-id-39' size-in-bits='64' id='type-id-101'/>
+    <!-- void cds_lfht_count_nodes(cds_lfht*, long int*, unsigned long int*, long int*) -->
+    <function-decl name='cds_lfht_count_nodes' mangled-name='cds_lfht_count_nodes' filepath='src/rculfhash.c' line='1906' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_count_nodes'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1906' column='1'/>
+      <!-- parameter of type 'long int*' -->
+      <parameter type-id='type-id-100' name='approx_before' filepath='src/rculfhash.c' line='1907' column='1'/>
+      <!-- parameter of type 'unsigned long int*' -->
+      <parameter type-id='type-id-101' name='count' filepath='src/rculfhash.c' line='1908' column='1'/>
+      <!-- parameter of type 'long int*' -->
+      <parameter type-id='type-id-100' name='approx_after' filepath='src/rculfhash.c' line='1909' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- pthread_attr_t** -->
+    <pointer-type-def type-id='type-id-63' size-in-bits='64' id='type-id-102'/>
+    <!-- int cds_lfht_destroy(cds_lfht*, pthread_attr_t**) -->
+    <function-decl name='cds_lfht_destroy' mangled-name='cds_lfht_destroy' filepath='src/rculfhash.c' line='1881' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_destroy'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1881' column='1'/>
+      <!-- parameter of type 'pthread_attr_t**' -->
+      <parameter type-id='type-id-102' name='attr' filepath='src/rculfhash.c' line='1881' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- const cds_lfht_node -->
+    <qualified-type-def type-id='type-id-73' const='yes' id='type-id-103'/>
+    <!-- const cds_lfht_node* -->
+    <pointer-type-def type-id='type-id-103' size-in-bits='64' id='type-id-104'/>
+    <!-- int cds_lfht_is_node_deleted(const cds_lfht_node*) -->
+    <function-decl name='cds_lfht_is_node_deleted' mangled-name='cds_lfht_is_node_deleted' filepath='src/rculfhash.c' line='1838' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_is_node_deleted'>
+      <!-- parameter of type 'const cds_lfht_node*' -->
+      <parameter type-id='type-id-104' name='node' filepath='src/rculfhash.c' line='1838' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- int cds_lfht_del(cds_lfht*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_del' mangled-name='cds_lfht_del' filepath='src/rculfhash.c' line='1822' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_del'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1822' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1822' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- struct cds_lfht_iter -->
+    <class-decl name='cds_lfht_iter' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/rculfhash.h' line='69' column='1' id='type-id-105'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfht_node* cds_lfht_iter::node -->
+        <var-decl name='node' type-id='type-id-74' visibility='default' filepath='../include/urcu/rculfhash.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_lfht_node* cds_lfht_iter::next -->
+        <var-decl name='next' type-id='type-id-74' visibility='default' filepath='../include/urcu/rculfhash.h' line='70' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfht_iter* -->
+    <pointer-type-def type-id='type-id-105' size-in-bits='64' id='type-id-106'/>
+    <!-- int (cds_lfht_node*, void*)* -->
+    <pointer-type-def type-id='type-id-107' size-in-bits='64' id='type-id-108'/>
+    <!-- typedef int (cds_lfht_node*, void*)* cds_lfht_match_fct -->
+    <typedef-decl name='cds_lfht_match_fct' type-id='type-id-108' filepath='../include/urcu/rculfhash.h' line='98' column='1' id='type-id-109'/>
+    <!-- int cds_lfht_replace(cds_lfht*, cds_lfht_iter*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_replace' mangled-name='cds_lfht_replace' filepath='src/rculfhash.c' line='1801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_replace'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1801' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-106' name='old_iter' filepath='src/rculfhash.c' line='1802' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1803' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-109' name='match' filepath='src/rculfhash.c' line='1804' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1805' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='new_node' filepath='src/rculfhash.c' line='1806' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- cds_lfht_node* cds_lfht_add_replace(cds_lfht*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_add_replace' mangled-name='cds_lfht_add_replace' filepath='src/rculfhash.c' line='1778' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_add_replace'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1778' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1779' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-109' name='match' filepath='src/rculfhash.c' line='1780' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1781' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1782' column='1'/>
+      <!-- cds_lfht_node* -->
+      <return type-id='type-id-74'/>
+    </function-decl>
+    <!-- cds_lfht_node* cds_lfht_add_unique(cds_lfht*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_add_unique' mangled-name='cds_lfht_add_unique' filepath='src/rculfhash.c' line='1761' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_add_unique'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1778' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1779' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-109' name='match' filepath='src/rculfhash.c' line='1780' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1781' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1782' column='1'/>
+      <!-- cds_lfht_node* -->
+      <return type-id='type-id-74'/>
+    </function-decl>
+    <!-- void cds_lfht_add(cds_lfht*, unsigned long int, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_add' mangled-name='cds_lfht_add' filepath='src/rculfhash.c' line='1750' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_add'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1750' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1750' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1751' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_first(cds_lfht*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_first' mangled-name='cds_lfht_first' filepath='src/rculfhash.c' line='1739' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_first'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1739' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-106' name='iter' filepath='src/rculfhash.c' line='1739' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_next(cds_lfht*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_next' mangled-name='cds_lfht_next' filepath='src/rculfhash.c' line='1715' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_next'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1715' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-106' name='iter' filepath='src/rculfhash.c' line='1716' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_next_duplicate(cds_lfht*, cds_lfht_match_fct, void*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_next_duplicate' mangled-name='cds_lfht_next_duplicate' filepath='src/rculfhash.c' line='1680' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_next_duplicate'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1680' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-109' name='match' filepath='src/rculfhash.c' line='1681' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1682' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-106' name='iter' filepath='src/rculfhash.c' line='1682' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_lookup(cds_lfht*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_lookup' mangled-name='cds_lfht_lookup' filepath='src/rculfhash.c' line='1640' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_lookup'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1640' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1640' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-109' name='match' filepath='src/rculfhash.c' line='1641' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1641' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-106' name='iter' filepath='src/rculfhash.c' line='1642' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- cds_lfht* _cds_lfht_new(unsigned long int, unsigned long int, unsigned long int, int, const cds_lfht_mm_type*, const rcu_flavor_struct*, pthread_attr_t*) -->
+    <function-decl name='_cds_lfht_new' mangled-name='_cds_lfht_new' filepath='src/rculfhash.c' line='1581' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_cds_lfht_new'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='init_size' filepath='src/rculfhash.c' line='1581' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='min_nr_alloc_buckets' filepath='src/rculfhash.c' line='1582' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='max_nr_buckets' filepath='src/rculfhash.c' line='1583' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/rculfhash.c' line='1584' column='1'/>
+      <!-- parameter of type 'const cds_lfht_mm_type*' -->
+      <parameter type-id='type-id-61' name='mm' filepath='src/rculfhash.c' line='1585' column='1'/>
+      <!-- parameter of type 'const rcu_flavor_struct*' -->
+      <parameter type-id='type-id-62' name='flavor' filepath='src/rculfhash.c' line='1586' column='1'/>
+      <!-- parameter of type 'pthread_attr_t*' -->
+      <parameter type-id='type-id-63' name='attr' filepath='src/rculfhash.c' line='1587' column='1'/>
+      <!-- cds_lfht* -->
+      <return type-id='type-id-70'/>
+    </function-decl>
+    <!-- int cds_lfht_get_count_order_ulong(unsigned long int) -->
+    <function-decl name='cds_lfht_get_count_order_ulong' mangled-name='cds_lfht_get_count_order_ulong' filepath='src/rculfhash.c' line='598' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_get_count_order_ulong'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='x' filepath='src/rculfhash.c' line='598' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- unsigned int cds_lfht_fls_ulong(unsigned long int) -->
+    <function-decl name='cds_lfht_fls_ulong' mangled-name='cds_lfht_fls_ulong' filepath='src/rculfhash.c' line='572' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_fls_ulong'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='x' filepath='src/rculfhash.c' line='572' column='1'/>
+      <!-- unsigned int -->
+      <return type-id='type-id-33'/>
+    </function-decl>
+    <!-- cds_lfht* (unsigned long int, unsigned long int) -->
+    <function-type size-in-bits='64' id='type-id-71'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- cds_lfht* -->
+      <return type-id='type-id-70'/>
+    </function-type>
+    <!-- cds_lfht_node* (cds_lfht*, unsigned long int) -->
+    <function-type size-in-bits='64' id='type-id-75'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- cds_lfht_node* -->
+      <return type-id='type-id-74'/>
+    </function-type>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-83'>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-type>
+    <!-- int (cds_lfht_node*, void*) -->
+    <function-type size-in-bits='64' id='type-id-107'>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-82'>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (cds_lfht*, unsigned long int) -->
+    <function-type size-in-bits='64' id='type-id-72'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-89'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-88'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-86'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-85'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-84'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash-mm-order.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- const cds_lfht_mm_type cds_lfht_mm_order -->
+    <var-decl name='cds_lfht_mm_order' type-id='type-id-76' mangled-name='cds_lfht_mm_order' visibility='default' filepath='../include/urcu/rculfhash.h' line='129' column='1' elf-symbol-id='cds_lfht_mm_order'/>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash-mm-chunk.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- const cds_lfht_mm_type cds_lfht_mm_chunk -->
+    <var-decl name='cds_lfht_mm_chunk' type-id='type-id-76' mangled-name='cds_lfht_mm_chunk' visibility='default' filepath='../include/urcu/rculfhash.h' line='130' column='1' elf-symbol-id='cds_lfht_mm_chunk'/>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash-mm-mmap.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- const cds_lfht_mm_type cds_lfht_mm_mmap -->
+    <var-decl name='cds_lfht_mm_mmap' type-id='type-id-76' mangled-name='cds_lfht_mm_mmap' visibility='default' filepath='../include/urcu/rculfhash.h' line='131' column='1' elf-symbol-id='cds_lfht_mm_mmap'/>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-28' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-110'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-111' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-112' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-113' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-111'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-114' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-115' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-115' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-115' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-114'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-117' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-116'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-117'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-33' size-in-bits='64' id='type-id-115'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-39' id='type-id-118'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-38' size-in-bits='384' id='type-id-112'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-39' id='type-id-119'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-113'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-110' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-120'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-120' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-121'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-122'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-123' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-124' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-32' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-123'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-32' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-124'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-122' const='yes' id='type-id-125'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-125' size-in-bits='64' id='type-id-126'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-121' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-126' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-121' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-121' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-126' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-121' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-common.so.6.xml b/extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-common.so.6.xml
new file mode 100644 (file)
index 0000000..e7aef91
--- /dev/null
@@ -0,0 +1,910 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-common.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- __cds_wfcq_dequeue_blocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_dequeue_nonblocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_dequeue_with_state_blocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_dequeue_with_state_nonblocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_with_state_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_first_blocking -->
+    <elf-symbol name='__cds_wfcq_first_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_first_nonblocking -->
+    <elf-symbol name='__cds_wfcq_first_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_init -->
+    <elf-symbol name='__cds_wfcq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_next_blocking -->
+    <elf-symbol name='__cds_wfcq_next_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_next_nonblocking -->
+    <elf-symbol name='__cds_wfcq_next_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_splice_blocking -->
+    <elf-symbol name='__cds_wfcq_splice_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_splice_nonblocking -->
+    <elf-symbol name='__cds_wfcq_splice_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfq_dequeue_blocking -->
+    <elf-symbol name='__cds_wfq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_init -->
+    <elf-symbol name='__cds_wfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_all -->
+    <elf-symbol name='__cds_wfs_pop_all' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_blocking -->
+    <elf-symbol name='__cds_wfs_pop_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_nonblocking -->
+    <elf-symbol name='__cds_wfs_pop_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_with_state_blocking -->
+    <elf-symbol name='__cds_wfs_pop_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_with_state_nonblocking -->
+    <elf-symbol name='__cds_wfs_pop_with_state_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_blocking -->
+    <elf-symbol name='cds_wfcq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_lock -->
+    <elf-symbol name='cds_wfcq_dequeue_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_unlock -->
+    <elf-symbol name='cds_wfcq_dequeue_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_with_state_blocking -->
+    <elf-symbol name='cds_wfcq_dequeue_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_destroy -->
+    <elf-symbol name='cds_wfcq_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_empty -->
+    <elf-symbol name='cds_wfcq_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_enqueue -->
+    <elf-symbol name='cds_wfcq_enqueue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_init -->
+    <elf-symbol name='cds_wfcq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_node_init -->
+    <elf-symbol name='cds_wfcq_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_splice_blocking -->
+    <elf-symbol name='cds_wfcq_splice_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_dequeue_blocking -->
+    <elf-symbol name='cds_wfq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_destroy -->
+    <elf-symbol name='cds_wfq_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_enqueue -->
+    <elf-symbol name='cds_wfq_enqueue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_init -->
+    <elf-symbol name='cds_wfq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_node_init -->
+    <elf-symbol name='cds_wfq_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_destroy -->
+    <elf-symbol name='cds_wfs_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_empty -->
+    <elf-symbol name='cds_wfs_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_first -->
+    <elf-symbol name='cds_wfs_first' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_init -->
+    <elf-symbol name='cds_wfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_next_blocking -->
+    <elf-symbol name='cds_wfs_next_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_next_nonblocking -->
+    <elf-symbol name='cds_wfs_next_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_node_init -->
+    <elf-symbol name='cds_wfs_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_all_blocking -->
+    <elf-symbol name='cds_wfs_pop_all_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_blocking -->
+    <elf-symbol name='cds_wfs_pop_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_lock -->
+    <elf-symbol name='cds_wfs_pop_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_unlock -->
+    <elf-symbol name='cds_wfs_pop_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_with_state_blocking -->
+    <elf-symbol name='cds_wfs_pop_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_push -->
+    <elf-symbol name='cds_wfs_push' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='wfqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_wfq_node -->
+    <class-decl name='cds_wfq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfqueue.h' line='48' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfq_node* cds_wfq_node::next -->
+        <var-decl name='next' type-id='type-id-2' visibility='default' filepath='../include/urcu/wfqueue.h' line='49' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfq_node* -->
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' id='type-id-2'/>
+    <!-- struct cds_wfq_queue -->
+    <class-decl name='cds_wfq_queue' size-in-bits='512' is-struct='yes' visibility='default' filepath='../include/urcu/wfqueue.h' line='52' column='1' id='type-id-3'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfq_node* cds_wfq_queue::head -->
+        <var-decl name='head' type-id='type-id-2' visibility='default' filepath='../include/urcu/wfqueue.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfq_node** cds_wfq_queue::tail -->
+        <var-decl name='tail' type-id='type-id-4' visibility='default' filepath='../include/urcu/wfqueue.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- cds_wfq_node cds_wfq_queue::dummy -->
+        <var-decl name='dummy' type-id='type-id-1' visibility='default' filepath='../include/urcu/wfqueue.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- pthread_mutex_t cds_wfq_queue::lock -->
+        <var-decl name='lock' type-id='type-id-5' visibility='default' filepath='../include/urcu/wfqueue.h' line='55' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfq_node** -->
+    <pointer-type-def type-id='type-id-2' size-in-bits='64' id='type-id-4'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-6'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-7' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-7'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-12' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-12' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-13' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-10'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-11'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-12'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-14'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-14' size-in-bits='64' id='type-id-15'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-14' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-13'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-16'/>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-17'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='320' id='type-id-8'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-17' id='type-id-18'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-9'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-6' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-5'/>
+    <!-- cds_wfq_queue* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-19'/>
+    <!-- cds_wfq_node* cds_wfq_dequeue_blocking(cds_wfq_queue*) -->
+    <function-decl name='cds_wfq_dequeue_blocking' mangled-name='cds_wfq_dequeue_blocking' filepath='src/wfqueue.c' line='59' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_dequeue_blocking'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='59' column='1'/>
+      <!-- cds_wfq_node* -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- cds_wfq_node* __cds_wfq_dequeue_blocking(cds_wfq_queue*) -->
+    <function-decl name='__cds_wfq_dequeue_blocking' mangled-name='__cds_wfq_dequeue_blocking' filepath='src/wfqueue.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfq_dequeue_blocking'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='59' column='1'/>
+      <!-- cds_wfq_node* -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-20'/>
+    <!-- void cds_wfq_enqueue(cds_wfq_queue*, cds_wfq_node*) -->
+    <function-decl name='cds_wfq_enqueue' mangled-name='cds_wfq_enqueue' filepath='src/wfqueue.c' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_enqueue'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='49' column='1'/>
+      <!-- parameter of type 'cds_wfq_node*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/wfqueue.c' line='49' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfq_destroy(cds_wfq_queue*) -->
+    <function-decl name='cds_wfq_destroy' mangled-name='cds_wfq_destroy' filepath='src/wfqueue.c' line='44' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_destroy'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='44' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfq_init(cds_wfq_queue*) -->
+    <function-decl name='cds_wfq_init' mangled-name='cds_wfq_init' filepath='src/wfqueue.c' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_init'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='44' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfq_node_init(cds_wfq_node*) -->
+    <function-decl name='cds_wfq_node_init' mangled-name='cds_wfq_node_init' filepath='src/wfqueue.c' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_node_init'>
+      <!-- parameter of type 'cds_wfq_node*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/wfqueue.c' line='34' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='wfcqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-22'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='83' column='1' id='type-id-23'>
+      <data-member access='private'>
+        <!-- __cds_wfcq_head* __anonymous_union__::_h -->
+        <var-decl name='_h' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_wfcq_head* __anonymous_union__::h -->
+        <var-decl name='h' type-id='type-id-25' visibility='default' filepath='../include/urcu/wfcqueue.h' line='85' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __cds_wfcq_head -->
+    <class-decl name='__cds_wfcq_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='68' column='1' id='type-id-26'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node __cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __cds_wfcq_head* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-24'/>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-27'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-5' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_head* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-25'/>
+    <!-- typedef __anonymous_union__ cds_wfcq_head_ptr_t -->
+    <typedef-decl name='cds_wfcq_head_ptr_t' type-id='type-id-23' filepath='../include/urcu/wfcqueue.h' line='86' column='1' id='type-id-28'/>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-29'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_tail* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- cds_wfcq_node* __cds_wfcq_next_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_node*) -->
+    <function-decl name='__cds_wfcq_next_nonblocking' mangled-name='__cds_wfcq_next_nonblocking' filepath='src/wfcqueue.c' line='178' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_next_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='179' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='180' column='1'/>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='181' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_next_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_node*) -->
+    <function-decl name='__cds_wfcq_next_blocking' mangled-name='__cds_wfcq_next_blocking' filepath='src/wfcqueue.c' line='170' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_next_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='179' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='180' column='1'/>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='181' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_first_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_first_nonblocking' mangled-name='__cds_wfcq_first_nonblocking' filepath='src/wfcqueue.c' line='163' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_first_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_first_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_first_blocking' mangled-name='__cds_wfcq_first_blocking' filepath='src/wfcqueue.c' line='156' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_first_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- unnamed&#45;enum&#45;underlying&#45;type -->
+    <type-decl name='unnamed-enum-underlying-type' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-31'/>
+    <!-- enum cds_wfcq_ret -->
+    <enum-decl name='cds_wfcq_ret' filepath='../include/urcu/wfcqueue.h' line='48' column='1' id='type-id-32'>
+      <underlying-type type-id='type-id-31'/>
+      <enumerator name='CDS_WFCQ_RET_WOULDBLOCK' value='-1'/>
+      <enumerator name='CDS_WFCQ_RET_DEST_EMPTY' value='0'/>
+      <enumerator name='CDS_WFCQ_RET_DEST_NON_EMPTY' value='1'/>
+      <enumerator name='CDS_WFCQ_RET_SRC_EMPTY' value='2'/>
+    </enum-decl>
+    <!-- cds_wfcq_ret __cds_wfcq_splice_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_splice_nonblocking' mangled-name='__cds_wfcq_splice_nonblocking' filepath='src/wfcqueue.c' line='146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_splice_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='dest_q_head' filepath='src/wfcqueue.c' line='147' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='dest_q_tail' filepath='src/wfcqueue.c' line='148' column='1'/>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='src_q_head' filepath='src/wfcqueue.c' line='149' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='src_q_tail' filepath='src/wfcqueue.c' line='150' column='1'/>
+      <!-- enum cds_wfcq_ret -->
+      <return type-id='type-id-32'/>
+    </function-decl>
+    <!-- cds_wfcq_ret __cds_wfcq_splice_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_splice_blocking' mangled-name='__cds_wfcq_splice_blocking' filepath='src/wfcqueue.c' line='136' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_splice_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='dest_q_head' filepath='src/wfcqueue.c' line='147' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='dest_q_tail' filepath='src/wfcqueue.c' line='148' column='1'/>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='src_q_head' filepath='src/wfcqueue.c' line='149' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='src_q_tail' filepath='src/wfcqueue.c' line='150' column='1'/>
+      <!-- enum cds_wfcq_ret -->
+      <return type-id='type-id-32'/>
+    </function-decl>
+    <!-- int* -->
+    <pointer-type-def type-id='type-id-10' size-in-bits='64' id='type-id-33'/>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_with_state_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, int*) -->
+    <function-decl name='__cds_wfcq_dequeue_with_state_nonblocking' mangled-name='__cds_wfcq_dequeue_with_state_nonblocking' filepath='src/wfcqueue.c' line='128' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_with_state_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='129' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='130' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfcqueue.c' line='131' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_dequeue_nonblocking' mangled-name='__cds_wfcq_dequeue_nonblocking' filepath='src/wfcqueue.c' line='121' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_with_state_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, int*) -->
+    <function-decl name='__cds_wfcq_dequeue_with_state_blocking' mangled-name='__cds_wfcq_dequeue_with_state_blocking' filepath='src/wfcqueue.c' line='113' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_with_state_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='129' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='130' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfcqueue.c' line='131' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_dequeue_blocking' mangled-name='__cds_wfcq_dequeue_blocking' filepath='src/wfcqueue.c' line='106' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_ret cds_wfcq_splice_blocking(cds_wfcq_head*, cds_wfcq_tail*, cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_splice_blocking' mangled-name='cds_wfcq_splice_blocking' filepath='src/wfcqueue.c' line='96' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_splice_blocking'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='dest_q_head' filepath='src/wfcqueue.c' line='97' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='dest_q_tail' filepath='src/wfcqueue.c' line='98' column='1'/>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='src_q_head' filepath='src/wfcqueue.c' line='99' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='src_q_tail' filepath='src/wfcqueue.c' line='100' column='1'/>
+      <!-- enum cds_wfcq_ret -->
+      <return type-id='type-id-32'/>
+    </function-decl>
+    <!-- cds_wfcq_node* cds_wfcq_dequeue_with_state_blocking(cds_wfcq_head*, cds_wfcq_tail*, int*) -->
+    <function-decl name='cds_wfcq_dequeue_with_state_blocking' mangled-name='cds_wfcq_dequeue_with_state_blocking' filepath='src/wfcqueue.c' line='88' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_with_state_blocking'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='89' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='90' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfcqueue.c' line='91' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* cds_wfcq_dequeue_blocking(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_dequeue_blocking' mangled-name='cds_wfcq_dequeue_blocking' filepath='src/wfcqueue.c' line='81' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_blocking'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='82' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='83' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- void cds_wfcq_dequeue_unlock(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_dequeue_unlock' mangled-name='cds_wfcq_dequeue_unlock' filepath='src/wfcqueue.c' line='75' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_unlock'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_dequeue_lock(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_dequeue_lock' mangled-name='cds_wfcq_dequeue_lock' filepath='src/wfcqueue.c' line='69' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_lock'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- bool -->
+    <type-decl name='bool' size-in-bits='8' id='type-id-34'/>
+    <!-- bool cds_wfcq_enqueue(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_node*) -->
+    <function-decl name='cds_wfcq_enqueue' mangled-name='cds_wfcq_enqueue' filepath='src/wfcqueue.c' line='62' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_enqueue'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='62' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='63' column='1'/>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='64' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <!-- bool cds_wfcq_empty(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_empty' mangled-name='cds_wfcq_empty' filepath='src/wfcqueue.c' line='55' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_empty'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='55' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='56' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <!-- void __cds_wfcq_init(__cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_init' mangled-name='__cds_wfcq_init' filepath='src/wfcqueue.c' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_init'>
+      <!-- parameter of type '__cds_wfcq_head*' -->
+      <parameter type-id='type-id-24' name='head' filepath='src/wfcqueue.c' line='49' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='50' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_destroy(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_destroy' mangled-name='cds_wfcq_destroy' filepath='src/wfcqueue.c' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_destroy'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_init(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_init' mangled-name='cds_wfcq_init' filepath='src/wfcqueue.c' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_init'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_node_init(cds_wfcq_node*) -->
+    <function-decl name='cds_wfcq_node_init' mangled-name='cds_wfcq_node_init' filepath='src/wfcqueue.c' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_node_init'>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='32' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='wfstack.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_wfs_head -->
+    <class-decl name='cds_wfs_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='82' column='1' id='type-id-35'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_node cds_wfs_head::node -->
+        <var-decl name='node' type-id='type-id-36' visibility='default' filepath='../include/urcu/wfstack.h' line='83' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfs_node -->
+    <class-decl name='cds_wfs_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='72' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_node* cds_wfs_node::next -->
+        <var-decl name='next' type-id='type-id-37' visibility='default' filepath='../include/urcu/wfstack.h' line='73' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfs_node* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-37'/>
+    <!-- cds_wfs_head* -->
+    <pointer-type-def type-id='type-id-35' size-in-bits='64' id='type-id-38'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='100' column='1' id='type-id-39'>
+      <data-member access='private'>
+        <!-- __cds_wfs_stack* __anonymous_union__::_s -->
+        <var-decl name='_s' type-id='type-id-40' visibility='default' filepath='../include/urcu/wfstack.h' line='101' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_wfs_stack* __anonymous_union__::s -->
+        <var-decl name='s' type-id='type-id-41' visibility='default' filepath='../include/urcu/wfstack.h' line='102' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __cds_wfs_stack -->
+    <class-decl name='__cds_wfs_stack' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='86' column='1' id='type-id-42'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_head* __cds_wfs_stack::head -->
+        <var-decl name='head' type-id='type-id-38' visibility='default' filepath='../include/urcu/wfstack.h' line='87' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __cds_wfs_stack* -->
+    <pointer-type-def type-id='type-id-42' size-in-bits='64' id='type-id-40'/>
+    <!-- struct cds_wfs_stack -->
+    <class-decl name='cds_wfs_stack' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='90' column='1' id='type-id-43'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_head* cds_wfs_stack::head -->
+        <var-decl name='head' type-id='type-id-38' visibility='default' filepath='../include/urcu/wfstack.h' line='91' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfs_stack::lock -->
+        <var-decl name='lock' type-id='type-id-5' visibility='default' filepath='../include/urcu/wfstack.h' line='92' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfs_stack* -->
+    <pointer-type-def type-id='type-id-43' size-in-bits='64' id='type-id-41'/>
+    <!-- typedef __anonymous_union__ cds_wfs_stack_ptr_t -->
+    <typedef-decl name='cds_wfs_stack_ptr_t' type-id='type-id-39' filepath='../include/urcu/wfstack.h' line='103' column='1' id='type-id-44'/>
+    <!-- cds_wfs_head* __cds_wfs_pop_all(cds_wfs_stack_ptr_t) -->
+    <function-decl name='__cds_wfs_pop_all' mangled-name='__cds_wfs_pop_all' filepath='src/wfstack.c' line='126' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_all'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='126' column='1'/>
+      <!-- cds_wfs_head* -->
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_with_state_nonblocking(cds_wfs_stack_ptr_t, int*) -->
+    <function-decl name='__cds_wfs_pop_with_state_nonblocking' mangled-name='__cds_wfs_pop_with_state_nonblocking' filepath='src/wfstack.c' line='120' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_with_state_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='120' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfstack.c' line='121' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_nonblocking(cds_wfs_stack_ptr_t) -->
+    <function-decl name='__cds_wfs_pop_nonblocking' mangled-name='__cds_wfs_pop_nonblocking' filepath='src/wfstack.c' line='114' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='114' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_with_state_blocking(cds_wfs_stack_ptr_t, int*) -->
+    <function-decl name='__cds_wfs_pop_with_state_blocking' mangled-name='__cds_wfs_pop_with_state_blocking' filepath='src/wfstack.c' line='108' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_with_state_blocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='120' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfstack.c' line='121' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_blocking(cds_wfs_stack_ptr_t) -->
+    <function-decl name='__cds_wfs_pop_blocking' mangled-name='__cds_wfs_pop_blocking' filepath='src/wfstack.c' line='102' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_blocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='114' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- void cds_wfs_pop_unlock(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_unlock' mangled-name='cds_wfs_pop_unlock' filepath='src/wfstack.c' line='97' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_unlock'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_pop_lock(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_lock' mangled-name='cds_wfs_pop_lock' filepath='src/wfstack.c' line='92' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_lock'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_next_nonblocking(cds_wfs_node*) -->
+    <function-decl name='cds_wfs_next_nonblocking' mangled-name='cds_wfs_next_nonblocking' filepath='src/wfstack.c' line='87' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_next_nonblocking'>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='87' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_next_blocking(cds_wfs_node*) -->
+    <function-decl name='cds_wfs_next_blocking' mangled-name='cds_wfs_next_blocking' filepath='src/wfstack.c' line='82' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_next_blocking'>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='87' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_first(cds_wfs_head*) -->
+    <function-decl name='cds_wfs_first' mangled-name='cds_wfs_first' filepath='src/wfstack.c' line='77' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_first'>
+      <!-- parameter of type 'cds_wfs_head*' -->
+      <parameter type-id='type-id-38' name='head' filepath='src/wfstack.c' line='77' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_head* cds_wfs_pop_all_blocking(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_all_blocking' mangled-name='cds_wfs_pop_all_blocking' filepath='src/wfstack.c' line='72' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_all_blocking'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='72' column='1'/>
+      <!-- cds_wfs_head* -->
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_pop_with_state_blocking(cds_wfs_stack*, int*) -->
+    <function-decl name='cds_wfs_pop_with_state_blocking' mangled-name='cds_wfs_pop_with_state_blocking' filepath='src/wfstack.c' line='67' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_with_state_blocking'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='67' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfstack.c' line='67' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_pop_blocking(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_blocking' mangled-name='cds_wfs_pop_blocking' filepath='src/wfstack.c' line='61' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_blocking'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='61' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- int cds_wfs_push(cds_wfs_stack_ptr_t, cds_wfs_node*) -->
+    <function-decl name='cds_wfs_push' mangled-name='cds_wfs_push' filepath='src/wfstack.c' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_push'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='56' column='1'/>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='56' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-10'/>
+    </function-decl>
+    <!-- bool cds_wfs_empty(cds_wfs_stack_ptr_t) -->
+    <function-decl name='cds_wfs_empty' mangled-name='cds_wfs_empty' filepath='src/wfstack.c' line='51' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_empty'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='51' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <!-- void __cds_wfs_init(__cds_wfs_stack*) -->
+    <function-decl name='__cds_wfs_init' mangled-name='__cds_wfs_init' filepath='src/wfstack.c' line='46' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_init'>
+      <!-- parameter of type '__cds_wfs_stack*' -->
+      <parameter type-id='type-id-40' name='s' filepath='src/wfstack.c' line='46' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_destroy(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_destroy' mangled-name='cds_wfs_destroy' filepath='src/wfstack.c' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_destroy'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_init(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_init' mangled-name='cds_wfs_init' filepath='src/wfstack.c' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_init'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_node_init(cds_wfs_node*) -->
+    <function-decl name='cds_wfs_node_init' mangled-name='cds_wfs_node_init' filepath='src/wfstack.c' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_node_init'>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='31' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-5' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-45'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-48' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-49' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-50' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-50' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-50' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-49'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-51' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-51'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-11' size-in-bits='64' id='type-id-50'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-17' id='type-id-53'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='384' id='type-id-47'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-17' id='type-id-54'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-48'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-45' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-55'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-55' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-10' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-56'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-56' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-57'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-57' size-in-bits='64' id='type-id-58'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-59'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-60' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-61' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-9' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-60'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-9' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-61'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-59' const='yes' id='type-id-62'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-62' size-in-bits='64' id='type-id-63'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-10' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-63' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-10'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-10' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-63' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-10'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-mb.so.6.xml b/extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-mb.so.6.xml
new file mode 100644 (file)
index 0000000..400eb0b
--- /dev/null
@@ -0,0 +1,919 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-mb.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_child_mb -->
+    <elf-symbol name='call_rcu_after_fork_child_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_call_rcu_after_fork_child' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_mb -->
+    <elf-symbol name='call_rcu_after_fork_parent_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_call_rcu_after_fork_parent' is-defined='yes'/>
+    <!-- call_rcu_before_fork_mb -->
+    <elf-symbol name='call_rcu_before_fork_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_data_free_mb -->
+    <elf-symbol name='call_rcu_data_free_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_call_rcu_data_free' is-defined='yes'/>
+    <!-- call_rcu_mb -->
+    <elf-symbol name='call_rcu_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_mb -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_create_all_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- create_call_rcu_data_mb -->
+    <elf-symbol name='create_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_create_call_rcu_data' is-defined='yes'/>
+    <!-- defer_rcu_mb -->
+    <elf-symbol name='defer_rcu_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_defer_rcu' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data_mb -->
+    <elf-symbol name='free_all_cpu_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_free_all_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- get_call_rcu_data_mb -->
+    <elf-symbol name='get_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_thread_mb -->
+    <elf-symbol name='get_call_rcu_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_get_call_rcu_thread' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_mb -->
+    <elf-symbol name='get_cpu_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_get_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_mb -->
+    <elf-symbol name='get_default_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_mb -->
+    <elf-symbol name='get_thread_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_get_thread_call_rcu_data' is-defined='yes'/>
+    <!-- rcu_barrier_mb -->
+    <elf-symbol name='rcu_barrier_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_mb -->
+    <elf-symbol name='rcu_defer_barrier_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_defer_barrier' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_mb -->
+    <elf-symbol name='rcu_defer_barrier_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_defer_barrier_thread' is-defined='yes'/>
+    <!-- rcu_defer_exit_mb -->
+    <elf-symbol name='rcu_defer_exit_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_defer_exit' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_mb -->
+    <elf-symbol name='rcu_defer_register_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_defer_register_thread' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_mb -->
+    <elf-symbol name='rcu_defer_unregister_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_init_mb -->
+    <elf-symbol name='rcu_init_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_init' is-defined='yes'/>
+    <!-- rcu_read_lock_mb -->
+    <elf-symbol name='rcu_read_lock_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_read_lock' is-defined='yes'/>
+    <!-- rcu_read_ongoing_mb -->
+    <elf-symbol name='rcu_read_ongoing_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_read_ongoing' is-defined='yes'/>
+    <!-- rcu_read_unlock_mb -->
+    <elf-symbol name='rcu_read_unlock_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_read_unlock' is-defined='yes'/>
+    <!-- rcu_register_thread_mb -->
+    <elf-symbol name='rcu_register_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_unregister_thread_mb -->
+    <elf-symbol name='rcu_unregister_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_mb -->
+    <elf-symbol name='set_cpu_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_mb -->
+    <elf-symbol name='set_thread_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- synchronize_rcu_mb -->
+    <elf-symbol name='synchronize_rcu_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_synchronize_rcu' is-defined='yes'/>
+    <!-- urcu_mb_barrier -->
+    <elf-symbol name='urcu_mb_barrier' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_barrier_mb' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu -->
+    <elf-symbol name='urcu_mb_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_mb' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_mb_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_mb_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu_before_fork -->
+    <elf-symbol name='urcu_mb_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_before_fork_mb' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu_data_free -->
+    <elf-symbol name='urcu_mb_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_mb_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_create_call_rcu_data -->
+    <elf-symbol name='urcu_mb_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_barrier -->
+    <elf-symbol name='urcu_mb_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_barrier_thread -->
+    <elf-symbol name='urcu_mb_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_exit -->
+    <elf-symbol name='urcu_mb_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_rcu -->
+    <elf-symbol name='urcu_mb_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_register_thread -->
+    <elf-symbol name='urcu_mb_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_unregister_thread -->
+    <elf-symbol name='urcu_mb_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_unregister_thread_mb' is-defined='yes'/>
+    <!-- urcu_mb_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_mb_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_get_call_rcu_data -->
+    <elf-symbol name='urcu_mb_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_call_rcu_data_mb' is-defined='yes'/>
+    <!-- urcu_mb_get_call_rcu_thread -->
+    <elf-symbol name='urcu_mb_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_mb_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_mb_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_default_call_rcu_data_mb' is-defined='yes'/>
+    <!-- urcu_mb_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_mb_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_init -->
+    <elf-symbol name='urcu_mb_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_read_lock -->
+    <elf-symbol name='urcu_mb_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_read_ongoing -->
+    <elf-symbol name='urcu_mb_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_read_unlock -->
+    <elf-symbol name='urcu_mb_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_mb_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_register_rculfhash_atfork_mb' is-defined='yes'/>
+    <!-- urcu_mb_register_thread -->
+    <elf-symbol name='urcu_mb_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_register_thread_mb' is-defined='yes'/>
+    <!-- urcu_mb_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_mb_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='set_cpu_call_rcu_data_mb' is-defined='yes'/>
+    <!-- urcu_mb_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_mb_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='set_thread_call_rcu_data_mb' is-defined='yes'/>
+    <!-- urcu_mb_synchronize_rcu -->
+    <elf-symbol name='urcu_mb_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_mb_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_unregister_thread -->
+    <elf-symbol name='urcu_mb_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_unregister_thread_mb' is-defined='yes'/>
+    <!-- urcu_register_rculfhash_atfork_mb -->
+    <elf-symbol name='urcu_register_rculfhash_atfork_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_unregister_rculfhash_atfork_mb -->
+    <elf-symbol name='urcu_unregister_rculfhash_atfork_mb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_unregister_rculfhash_atfork' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_mb -->
+    <elf-symbol name='rcu_flavor_mb' size='112' type='object-type' binding='global-binding' visibility='default-visibility' alias='urcu_mb_flavor' is-defined='yes'/>
+    <!-- rcu_gp_mb -->
+    <elf-symbol name='rcu_gp_mb' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_reader_mb -->
+    <elf-symbol name='rcu_reader_mb' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_flavor -->
+    <elf-symbol name='urcu_mb_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_gp -->
+    <elf-symbol name='urcu_mb_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' alias='rcu_gp_mb' is-defined='yes'/>
+    <!-- urcu_mb_reader -->
+    <elf-symbol name='urcu_mb_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' alias='rcu_reader_mb' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='67' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='77' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-4' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-3'/>
+    <!-- urcu_gp urcu_mb_gp -->
+    <var-decl name='urcu_mb_gp' type-id='type-id-1' mangled-name='urcu_mb_gp' visibility='default' filepath='../include/urcu/static/urcu-mb.h' line='60' column='1' elf-symbol-id='urcu_mb_gp'/>
+    <!-- struct urcu_reader -->
+    <class-decl name='urcu_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='80' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char urcu_reader::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='83' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_reader::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_reader::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_reader::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='88' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- urcu_reader urcu_mb_reader -->
+    <var-decl name='urcu_mb_reader' type-id='type-id-6' mangled-name='urcu_mb_reader' visibility='default' filepath='../include/urcu/static/urcu-mb.h' line='62' column='1' elf-symbol-id='urcu_mb_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct urcu_mb_flavor -->
+    <var-decl name='urcu_mb_flavor' type-id='type-id-35' mangled-name='rcu_flavor_mb' visibility='default' filepath='../include/urcu/flavor.h' line='90' column='1' elf-symbol-id='rcu_flavor_mb'/>
+    <!-- void urcu_mb_defer_exit() -->
+    <function-decl name='urcu_mb_defer_exit' mangled-name='rcu_defer_exit_mb' filepath='src/urcu-defer-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_exit_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_defer_unregister_thread() -->
+    <function-decl name='urcu_mb_defer_unregister_thread' mangled-name='urcu_mb_defer_unregister_thread' filepath='src/urcu-defer-impl.h' line='456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_defer_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_mb_defer_register_thread() -->
+    <function-decl name='urcu_mb_defer_register_thread' mangled-name='rcu_defer_register_thread_mb' filepath='src/urcu-defer-impl.h' line='432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_register_thread_mb'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_mb_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_mb_defer_rcu' mangled-name='defer_rcu_mb' filepath='src/urcu-defer-impl.h' line='400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_mb'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_defer_barrier() -->
+    <function-decl name='urcu_mb_defer_barrier' mangled-name='rcu_defer_barrier_mb' filepath='src/urcu-defer-impl.h' line='284' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_defer_barrier_thread() -->
+    <function-decl name='urcu_mb_defer_barrier_thread' mangled-name='rcu_defer_barrier_thread_mb' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_mb_unregister_rculfhash_atfork' mangled-name='urcu_unregister_rculfhash_atfork_mb' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_unregister_rculfhash_atfork_mb'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_mb_register_rculfhash_atfork' mangled-name='urcu_mb_register_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1044' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_register_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_mb_call_rcu_after_fork_child' mangled-name='call_rcu_after_fork_child_mb' filepath='src/urcu-call-rcu-impl.h' line='1000' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_mb_call_rcu_after_fork_parent' mangled-name='call_rcu_after_fork_parent_mb' filepath='src/urcu-call-rcu-impl.h' line='976' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_parent_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_call_rcu_before_fork() -->
+    <function-decl name='urcu_mb_call_rcu_before_fork' mangled-name='urcu_mb_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='947' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_barrier() -->
+    <function-decl name='urcu_mb_barrier' mangled-name='urcu_mb_barrier' filepath='src/urcu-call-rcu-impl.h' line='874' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_mb_free_all_cpu_call_rcu_data' mangled-name='free_all_cpu_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_all_cpu_call_rcu_data_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-2' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_mb_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_mb_call_rcu_data_free' mangled-name='call_rcu_data_free_mb' filepath='src/urcu-call-rcu-impl.h' line='764' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_data_free_mb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='764' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_mb_call_rcu' mangled-name='urcu_mb_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='725' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='725' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='726' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_mb_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_mb_create_all_cpu_call_rcu_data' mangled-name='create_all_cpu_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_mb'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='645' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_mb_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_mb_set_thread_call_rcu_data' mangled-name='urcu_mb_set_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_set_thread_call_rcu_data'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='630' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_mb_get_thread_call_rcu_data' mangled-name='get_thread_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_thread_call_rcu_data_mb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_get_call_rcu_data() -->
+    <function-decl name='urcu_mb_get_call_rcu_data' mangled-name='urcu_mb_get_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='590' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_get_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_get_default_call_rcu_data() -->
+    <function-decl name='urcu_mb_get_default_call_rcu_data' mangled-name='urcu_mb_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_mb_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_mb_set_cpu_call_rcu_data' mangled-name='urcu_mb_set_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_set_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_mb_create_call_rcu_data' mangled-name='create_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_call_rcu_data_mb'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='498' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='499' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_mb_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_mb_get_call_rcu_thread' mangled-name='get_call_rcu_thread_mb' filepath='src/urcu-call-rcu-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_thread_mb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='476' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_mb_get_cpu_call_rcu_data' mangled-name='get_cpu_call_rcu_data_mb' filepath='src/urcu-call-rcu-impl.h' line='452' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_mb'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='452' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_mb_unregister_thread() -->
+    <function-decl name='urcu_mb_unregister_thread' mangled-name='urcu_mb_unregister_thread' filepath='src/urcu.c' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_register_thread() -->
+    <function-decl name='urcu_mb_register_thread' mangled-name='urcu_mb_register_thread' filepath='src/urcu.c' line='547' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_mb_read_ongoing() -->
+    <function-decl name='urcu_mb_read_ongoing' mangled-name='rcu_read_ongoing_mb' filepath='src/urcu.c' line='540' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_ongoing_mb'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_mb_read_unlock() -->
+    <function-decl name='urcu_mb_read_unlock' mangled-name='rcu_read_unlock_mb' filepath='src/urcu.c' line='533' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_unlock_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_read_lock() -->
+    <function-decl name='urcu_mb_read_lock' mangled-name='rcu_read_lock_mb' filepath='src/urcu.c' line='526' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_lock_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_synchronize_rcu() -->
+    <function-decl name='urcu_mb_synchronize_rcu' mangled-name='synchronize_rcu_mb' filepath='src/urcu.c' line='403' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='synchronize_rcu_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_init() -->
+    <function-decl name='urcu_mb_init' mangled-name='rcu_init_mb' filepath='src/urcu.c' line='105' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_init_mb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-2' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-2' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-memb.so.6.xml b/extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-memb.so.6.xml
new file mode 100644 (file)
index 0000000..e22c578
--- /dev/null
@@ -0,0 +1,925 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-memb.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_child_memb -->
+    <elf-symbol name='call_rcu_after_fork_child_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_call_rcu_after_fork_child' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_memb -->
+    <elf-symbol name='call_rcu_after_fork_parent_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_memb -->
+    <elf-symbol name='call_rcu_before_fork_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_data_free_memb -->
+    <elf-symbol name='call_rcu_data_free_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_memb -->
+    <elf-symbol name='call_rcu_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_memb -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_create_all_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- create_call_rcu_data_memb -->
+    <elf-symbol name='create_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- defer_rcu_memb -->
+    <elf-symbol name='defer_rcu_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_defer_rcu' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data_memb -->
+    <elf-symbol name='free_all_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_data_memb -->
+    <elf-symbol name='get_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_get_call_rcu_data' is-defined='yes'/>
+    <!-- get_call_rcu_thread_memb -->
+    <elf-symbol name='get_call_rcu_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_memb -->
+    <elf-symbol name='get_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_get_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_memb -->
+    <elf-symbol name='get_default_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_memb -->
+    <elf-symbol name='get_thread_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_get_thread_call_rcu_data' is-defined='yes'/>
+    <!-- rcu_barrier_memb -->
+    <elf-symbol name='rcu_barrier_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_barrier' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_memb -->
+    <elf-symbol name='rcu_defer_barrier_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_defer_barrier' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_memb -->
+    <elf-symbol name='rcu_defer_barrier_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_defer_barrier_thread' is-defined='yes'/>
+    <!-- rcu_defer_exit_memb -->
+    <elf-symbol name='rcu_defer_exit_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_memb -->
+    <elf-symbol name='rcu_defer_register_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_memb -->
+    <elf-symbol name='rcu_defer_unregister_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_defer_unregister_thread' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_init_memb -->
+    <elf-symbol name='rcu_init_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_init' is-defined='yes'/>
+    <!-- rcu_read_lock_memb -->
+    <elf-symbol name='rcu_read_lock_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_read_lock' is-defined='yes'/>
+    <!-- rcu_read_ongoing_memb -->
+    <elf-symbol name='rcu_read_ongoing_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_unlock_memb -->
+    <elf-symbol name='rcu_read_unlock_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_register_thread_memb -->
+    <elf-symbol name='rcu_register_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_unregister_thread_memb -->
+    <elf-symbol name='rcu_unregister_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_memb -->
+    <elf-symbol name='set_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_memb -->
+    <elf-symbol name='set_thread_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_set_thread_call_rcu_data' is-defined='yes'/>
+    <!-- synchronize_rcu_memb -->
+    <elf-symbol name='synchronize_rcu_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_barrier -->
+    <elf-symbol name='urcu_memb_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu -->
+    <elf-symbol name='urcu_memb_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_memb' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_memb_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_memb_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_after_fork_parent_memb' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_before_fork -->
+    <elf-symbol name='urcu_memb_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_before_fork_memb' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_data_free -->
+    <elf-symbol name='urcu_memb_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_data_free_memb' is-defined='yes'/>
+    <!-- urcu_memb_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_create_call_rcu_data -->
+    <elf-symbol name='urcu_memb_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='create_call_rcu_data_memb' is-defined='yes'/>
+    <!-- urcu_memb_defer_barrier -->
+    <elf-symbol name='urcu_memb_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_barrier_thread -->
+    <elf-symbol name='urcu_memb_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_exit -->
+    <elf-symbol name='urcu_memb_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_exit_memb' is-defined='yes'/>
+    <!-- urcu_memb_defer_rcu -->
+    <elf-symbol name='urcu_memb_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_register_thread -->
+    <elf-symbol name='urcu_memb_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_register_thread_memb' is-defined='yes'/>
+    <!-- urcu_memb_defer_unregister_thread -->
+    <elf-symbol name='urcu_memb_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='free_all_cpu_call_rcu_data_memb' is-defined='yes'/>
+    <!-- urcu_memb_get_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_call_rcu_thread -->
+    <elf-symbol name='urcu_memb_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_call_rcu_thread_memb' is-defined='yes'/>
+    <!-- urcu_memb_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_default_call_rcu_data_memb' is-defined='yes'/>
+    <!-- urcu_memb_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_init -->
+    <elf-symbol name='urcu_memb_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_lock -->
+    <elf-symbol name='urcu_memb_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_ongoing -->
+    <elf-symbol name='urcu_memb_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_read_ongoing_memb' is-defined='yes'/>
+    <!-- urcu_memb_read_unlock -->
+    <elf-symbol name='urcu_memb_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_read_unlock_memb' is-defined='yes'/>
+    <!-- urcu_memb_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_memb_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_register_thread -->
+    <elf-symbol name='urcu_memb_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_register_thread_memb' is-defined='yes'/>
+    <!-- urcu_memb_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='set_cpu_call_rcu_data_memb' is-defined='yes'/>
+    <!-- urcu_memb_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_memb_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_synchronize_rcu -->
+    <elf-symbol name='urcu_memb_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='synchronize_rcu_memb' is-defined='yes'/>
+    <!-- urcu_memb_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_memb_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_unregister_rculfhash_atfork_memb' is-defined='yes'/>
+    <!-- urcu_memb_unregister_thread -->
+    <elf-symbol name='urcu_memb_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_unregister_thread_memb' is-defined='yes'/>
+    <!-- urcu_register_rculfhash_atfork_memb -->
+    <elf-symbol name='urcu_register_rculfhash_atfork_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_register_rculfhash_atfork' is-defined='yes'/>
+    <!-- urcu_unregister_rculfhash_atfork_memb -->
+    <elf-symbol name='urcu_unregister_rculfhash_atfork_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_memb -->
+    <elf-symbol name='rcu_flavor_memb' size='112' type='object-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_flavor' is-defined='yes'/>
+    <!-- rcu_gp_memb -->
+    <elf-symbol name='rcu_gp_memb' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_has_sys_membarrier_memb -->
+    <elf-symbol name='rcu_has_sys_membarrier_memb' size='4' type='object-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_has_sys_membarrier' is-defined='yes'/>
+    <!-- rcu_reader_memb -->
+    <elf-symbol name='rcu_reader_memb' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_flavor -->
+    <elf-symbol name='urcu_memb_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_gp -->
+    <elf-symbol name='urcu_memb_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' alias='rcu_gp_memb' is-defined='yes'/>
+    <!-- urcu_memb_has_sys_membarrier -->
+    <elf-symbol name='urcu_memb_has_sys_membarrier' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_reader -->
+    <elf-symbol name='urcu_memb_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' alias='rcu_reader_memb' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <!-- int urcu_memb_has_sys_membarrier -->
+    <var-decl name='urcu_memb_has_sys_membarrier' type-id='type-id-1' mangled-name='rcu_has_sys_membarrier_memb' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='72' column='1' elf-symbol-id='rcu_has_sys_membarrier_memb'/>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='67' column='1' id='type-id-2'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-4' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='77' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-1' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-4'/>
+    <!-- urcu_gp urcu_memb_gp -->
+    <var-decl name='urcu_memb_gp' type-id='type-id-2' mangled-name='urcu_memb_gp' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='83' column='1' elf-symbol-id='urcu_memb_gp'/>
+    <!-- struct urcu_reader -->
+    <class-decl name='urcu_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='80' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char urcu_reader::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='83' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_reader::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_reader::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_reader::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='88' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- urcu_reader urcu_memb_reader -->
+    <var-decl name='urcu_memb_reader' type-id='type-id-6' mangled-name='urcu_memb_reader' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='85' column='1' elf-symbol-id='urcu_memb_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct urcu_memb_flavor -->
+    <var-decl name='urcu_memb_flavor' type-id='type-id-35' mangled-name='rcu_flavor_memb' visibility='default' filepath='../include/urcu/flavor.h' line='90' column='1' elf-symbol-id='rcu_flavor_memb'/>
+    <!-- void urcu_memb_defer_exit() -->
+    <function-decl name='urcu_memb_defer_exit' mangled-name='urcu_memb_defer_exit' filepath='src/urcu-defer-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_unregister_thread() -->
+    <function-decl name='urcu_memb_defer_unregister_thread' mangled-name='rcu_defer_unregister_thread_memb' filepath='src/urcu-defer-impl.h' line='456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_unregister_thread_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_defer_register_thread() -->
+    <function-decl name='urcu_memb_defer_register_thread' mangled-name='urcu_memb_defer_register_thread' filepath='src/urcu-defer-impl.h' line='432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_memb_defer_rcu' mangled-name='defer_rcu_memb' filepath='src/urcu-defer-impl.h' line='400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_memb'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_barrier() -->
+    <function-decl name='urcu_memb_defer_barrier' mangled-name='rcu_defer_barrier_memb' filepath='src/urcu-defer-impl.h' line='284' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_barrier_thread() -->
+    <function-decl name='urcu_memb_defer_barrier_thread' mangled-name='rcu_defer_barrier_thread_memb' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_memb_unregister_rculfhash_atfork' mangled-name='urcu_memb_unregister_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_unregister_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_memb_register_rculfhash_atfork' mangled-name='urcu_register_rculfhash_atfork_memb' filepath='src/urcu-call-rcu-impl.h' line='1044' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_register_rculfhash_atfork_memb'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_memb_call_rcu_after_fork_child' mangled-name='call_rcu_after_fork_child_memb' filepath='src/urcu-call-rcu-impl.h' line='1000' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_memb_call_rcu_after_fork_parent' mangled-name='urcu_memb_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='976' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_before_fork() -->
+    <function-decl name='urcu_memb_call_rcu_before_fork' mangled-name='urcu_memb_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='947' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_barrier() -->
+    <function-decl name='urcu_memb_barrier' mangled-name='rcu_barrier_memb' filepath='src/urcu-call-rcu-impl.h' line='874' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_barrier_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_memb_free_all_cpu_call_rcu_data' mangled-name='urcu_memb_free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-1' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_memb_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_memb_call_rcu_data_free' mangled-name='urcu_memb_call_rcu_data_free' filepath='src/urcu-call-rcu-impl.h' line='764' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_data_free'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='764' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_memb_call_rcu' mangled-name='urcu_memb_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='725' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='725' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='726' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_memb_create_all_cpu_call_rcu_data' mangled-name='create_all_cpu_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_memb'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='645' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_memb_set_thread_call_rcu_data' mangled-name='set_thread_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_thread_call_rcu_data_memb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='630' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_thread_call_rcu_data' mangled-name='get_thread_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_thread_call_rcu_data_memb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_call_rcu_data' mangled-name='get_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='590' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_data_memb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_default_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_default_call_rcu_data' mangled-name='urcu_memb_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_memb_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_memb_set_cpu_call_rcu_data' mangled-name='urcu_memb_set_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_set_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_memb_create_call_rcu_data' mangled-name='urcu_memb_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='498' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='499' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_memb_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_memb_get_call_rcu_thread' mangled-name='urcu_memb_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='476' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_memb_get_cpu_call_rcu_data' mangled-name='get_cpu_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='452' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_memb'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='452' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_memb_init() -->
+    <function-decl name='urcu_memb_init' mangled-name='rcu_init_memb' filepath='src/urcu.c' line='613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_init_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_unregister_thread() -->
+    <function-decl name='urcu_memb_unregister_thread' mangled-name='urcu_memb_unregister_thread' filepath='src/urcu.c' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_register_thread() -->
+    <function-decl name='urcu_memb_register_thread' mangled-name='urcu_memb_register_thread' filepath='src/urcu.c' line='547' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_read_ongoing() -->
+    <function-decl name='urcu_memb_read_ongoing' mangled-name='urcu_memb_read_ongoing' filepath='src/urcu.c' line='540' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_ongoing'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_read_unlock() -->
+    <function-decl name='urcu_memb_read_unlock' mangled-name='urcu_memb_read_unlock' filepath='src/urcu.c' line='533' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_unlock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_read_lock() -->
+    <function-decl name='urcu_memb_read_lock' mangled-name='rcu_read_lock_memb' filepath='src/urcu.c' line='526' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_lock_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_synchronize_rcu() -->
+    <function-decl name='urcu_memb_synchronize_rcu' mangled-name='urcu_memb_synchronize_rcu' filepath='src/urcu.c' line='403' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-qsbr.so.6.xml b/extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-qsbr.so.6.xml
new file mode 100644 (file)
index 0000000..f0b9ce6
--- /dev/null
@@ -0,0 +1,946 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-qsbr.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_child_qsbr -->
+    <elf-symbol name='call_rcu_after_fork_child_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_call_rcu_after_fork_child' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_qsbr -->
+    <elf-symbol name='call_rcu_after_fork_parent_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_qsbr -->
+    <elf-symbol name='call_rcu_before_fork_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_call_rcu_before_fork' is-defined='yes'/>
+    <!-- call_rcu_data_free_qsbr -->
+    <elf-symbol name='call_rcu_data_free_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_qsbr -->
+    <elf-symbol name='call_rcu_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_qsbr -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_call_rcu_data_qsbr -->
+    <elf-symbol name='create_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- defer_rcu_qsbr -->
+    <elf-symbol name='defer_rcu_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_defer_rcu' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data -->
+    <elf-symbol name='free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_free_all_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- get_call_rcu_data_qsbr -->
+    <elf-symbol name='get_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_get_call_rcu_data' is-defined='yes'/>
+    <!-- get_call_rcu_thread_qsbr -->
+    <elf-symbol name='get_call_rcu_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_qsbr -->
+    <elf-symbol name='get_cpu_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_get_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_qsbr -->
+    <elf-symbol name='get_default_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_qsbr -->
+    <elf-symbol name='get_thread_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_barrier_qsbr -->
+    <elf-symbol name='rcu_barrier_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_qsbr -->
+    <elf-symbol name='rcu_defer_barrier_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_defer_barrier' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_qsbr -->
+    <elf-symbol name='rcu_defer_barrier_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_defer_barrier_thread' is-defined='yes'/>
+    <!-- rcu_defer_exit_qsbr -->
+    <elf-symbol name='rcu_defer_exit_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_qsbr -->
+    <elf-symbol name='rcu_defer_register_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_qsbr -->
+    <elf-symbol name='rcu_defer_unregister_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_exit_qsbr -->
+    <elf-symbol name='rcu_exit_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_quiescent_state_qsbr -->
+    <elf-symbol name='rcu_quiescent_state_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_lock_qsbr -->
+    <elf-symbol name='rcu_read_lock_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_read_lock' is-defined='yes'/>
+    <!-- rcu_read_ongoing_qsbr -->
+    <elf-symbol name='rcu_read_ongoing_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_read_ongoing' is-defined='yes'/>
+    <!-- rcu_read_unlock_qsbr -->
+    <elf-symbol name='rcu_read_unlock_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_register_thread_qsbr -->
+    <elf-symbol name='rcu_register_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_thread_offline_qsbr -->
+    <elf-symbol name='rcu_thread_offline_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_thread_online_qsbr -->
+    <elf-symbol name='rcu_thread_online_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_unregister_thread_qsbr -->
+    <elf-symbol name='rcu_unregister_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_qsbr -->
+    <elf-symbol name='set_cpu_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_set_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_qsbr -->
+    <elf-symbol name='set_thread_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_set_thread_call_rcu_data' is-defined='yes'/>
+    <!-- synchronize_rcu_qsbr -->
+    <elf-symbol name='synchronize_rcu_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_barrier -->
+    <elf-symbol name='urcu_qsbr_barrier' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_barrier_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu -->
+    <elf-symbol name='urcu_qsbr_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_qsbr_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_qsbr_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_after_fork_parent_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu_before_fork -->
+    <elf-symbol name='urcu_qsbr_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu_data_free -->
+    <elf-symbol name='urcu_qsbr_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_data_free_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='create_all_cpu_call_rcu_data_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_create_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='create_call_rcu_data_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_barrier -->
+    <elf-symbol name='urcu_qsbr_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_barrier_thread -->
+    <elf-symbol name='urcu_qsbr_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_exit -->
+    <elf-symbol name='urcu_qsbr_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_exit_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_rcu -->
+    <elf-symbol name='urcu_qsbr_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_register_thread -->
+    <elf-symbol name='urcu_qsbr_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_register_thread_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_unregister_thread -->
+    <elf-symbol name='urcu_qsbr_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_unregister_thread_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_exit -->
+    <elf-symbol name='urcu_qsbr_exit' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_exit_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_get_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_get_call_rcu_thread -->
+    <elf-symbol name='urcu_qsbr_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_call_rcu_thread_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_default_call_rcu_data_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_thread_call_rcu_data_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_quiescent_state -->
+    <elf-symbol name='urcu_qsbr_quiescent_state' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_quiescent_state_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_read_lock -->
+    <elf-symbol name='urcu_qsbr_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_read_ongoing -->
+    <elf-symbol name='urcu_qsbr_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_read_unlock -->
+    <elf-symbol name='urcu_qsbr_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_read_unlock_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_qsbr_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_register_thread -->
+    <elf-symbol name='urcu_qsbr_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_register_thread_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_synchronize_rcu -->
+    <elf-symbol name='urcu_qsbr_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='synchronize_rcu_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_thread_offline -->
+    <elf-symbol name='urcu_qsbr_thread_offline' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_thread_offline_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_thread_online -->
+    <elf-symbol name='urcu_qsbr_thread_online' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_thread_online_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_qsbr_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_unregister_thread -->
+    <elf-symbol name='urcu_qsbr_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_unregister_thread_qsbr' is-defined='yes'/>
+    <!-- urcu_register_rculfhash_atfork_qsbr -->
+    <elf-symbol name='urcu_register_rculfhash_atfork_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_register_rculfhash_atfork' is-defined='yes'/>
+    <!-- urcu_unregister_rculfhash_atfork_qsbr -->
+    <elf-symbol name='urcu_unregister_rculfhash_atfork_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_unregister_rculfhash_atfork' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_qsbr -->
+    <elf-symbol name='rcu_flavor_qsbr' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_gp_qsbr -->
+    <elf-symbol name='rcu_gp_qsbr' size='128' type='object-type' binding='global-binding' visibility='default-visibility' alias='urcu_qsbr_gp' is-defined='yes'/>
+    <!-- rcu_reader_qsbr -->
+    <elf-symbol name='rcu_reader_qsbr' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_flavor -->
+    <elf-symbol name='urcu_qsbr_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' alias='rcu_flavor_qsbr' is-defined='yes'/>
+    <!-- urcu_qsbr_gp -->
+    <elf-symbol name='urcu_qsbr_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_reader -->
+    <elf-symbol name='urcu_qsbr_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' alias='rcu_reader_qsbr' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu-qsbr.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='67' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='77' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-4' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-3'/>
+    <!-- urcu_gp urcu_qsbr_gp -->
+    <var-decl name='urcu_qsbr_gp' type-id='type-id-1' mangled-name='rcu_gp_qsbr' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='63' column='1' elf-symbol-id='rcu_gp_qsbr'/>
+    <!-- struct urcu_qsbr_reader -->
+    <class-decl name='urcu_qsbr_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='65' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_qsbr_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_qsbr_reader::node -->
+        <var-decl name='node' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- int urcu_qsbr_reader::waiting -->
+        <var-decl name='waiting' type-id='type-id-4' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1216'>
+        <!-- pthread_t urcu_qsbr_reader::tid -->
+        <var-decl name='tid' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='71' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_qsbr_reader::registered -->
+        <var-decl name='registered' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='73' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-7'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-10' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-10' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-7' size-in-bits='64' id='type-id-10'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-8'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-9'/>
+    <!-- urcu_qsbr_reader urcu_qsbr_reader -->
+    <var-decl name='urcu_qsbr_reader' type-id='type-id-6' mangled-name='urcu_qsbr_reader' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='76' column='1' elf-symbol-id='urcu_qsbr_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-11'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-17'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-12'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-20'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-21' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-23' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-23'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-24'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-25' size-in-bits='64' id='type-id-22'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-14'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-27'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-29'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-30' size-in-bits='64' id='type-id-15'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-31'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-29' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-29' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-29' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-27' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-32'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-16'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-11' const='yes' id='type-id-34'/>
+    <!-- const rcu_flavor_struct urcu_qsbr_flavor -->
+    <var-decl name='urcu_qsbr_flavor' type-id='type-id-34' mangled-name='urcu_qsbr_flavor' visibility='default' filepath='../include/urcu/flavor.h' line='90' column='1' elf-symbol-id='urcu_qsbr_flavor'/>
+    <!-- void urcu_qsbr_defer_exit() -->
+    <function-decl name='urcu_qsbr_defer_exit' mangled-name='urcu_qsbr_defer_exit' filepath='src/urcu-defer-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_defer_unregister_thread() -->
+    <function-decl name='urcu_qsbr_defer_unregister_thread' mangled-name='urcu_qsbr_defer_unregister_thread' filepath='src/urcu-defer-impl.h' line='456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_defer_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int urcu_qsbr_defer_register_thread() -->
+    <function-decl name='urcu_qsbr_defer_register_thread' mangled-name='urcu_qsbr_defer_register_thread' filepath='src/urcu-defer-impl.h' line='432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_qsbr_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_qsbr_defer_rcu' mangled-name='defer_rcu_qsbr' filepath='src/urcu-defer-impl.h' line='400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_qsbr'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-29' name='fct' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='p' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_defer_barrier() -->
+    <function-decl name='urcu_qsbr_defer_barrier' mangled-name='rcu_defer_barrier_qsbr' filepath='src/urcu-defer-impl.h' line='284' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_defer_barrier_thread() -->
+    <function-decl name='urcu_qsbr_defer_barrier_thread' mangled-name='rcu_defer_barrier_thread_qsbr' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_qsbr_unregister_rculfhash_atfork' mangled-name='urcu_unregister_rculfhash_atfork_qsbr' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_unregister_rculfhash_atfork_qsbr'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-32' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_qsbr_register_rculfhash_atfork' mangled-name='urcu_register_rculfhash_atfork_qsbr' filepath='src/urcu-call-rcu-impl.h' line='1044' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_register_rculfhash_atfork_qsbr'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-32' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_qsbr_call_rcu_after_fork_child' mangled-name='call_rcu_after_fork_child_qsbr' filepath='src/urcu-call-rcu-impl.h' line='1000' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_qsbr_call_rcu_after_fork_parent' mangled-name='urcu_qsbr_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='976' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_call_rcu_before_fork() -->
+    <function-decl name='urcu_qsbr_call_rcu_before_fork' mangled-name='call_rcu_before_fork_qsbr' filepath='src/urcu-call-rcu-impl.h' line='947' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_before_fork_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_barrier() -->
+    <function-decl name='urcu_qsbr_barrier' mangled-name='urcu_qsbr_barrier' filepath='src/urcu-call-rcu-impl.h' line='874' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_barrier'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_qsbr_free_all_cpu_call_rcu_data' mangled-name='free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-35'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-36' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-7' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-23' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-38' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-39'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-40' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-40'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-43'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-45'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-46'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-45' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-44'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-47'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='320' id='type-id-41'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-2' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-42'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-39' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-38'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-35' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_qsbr_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_qsbr_call_rcu_data_free' mangled-name='urcu_qsbr_call_rcu_data_free' filepath='src/urcu-call-rcu-impl.h' line='764' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_call_rcu_data_free'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='764' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_qsbr_call_rcu' mangled-name='urcu_qsbr_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='725' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-24' name='head' filepath='src/urcu-call-rcu-impl.h' line='725' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-22' name='func' filepath='src/urcu-call-rcu-impl.h' line='726' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int urcu_qsbr_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_qsbr_create_all_cpu_call_rcu_data' mangled-name='urcu_qsbr_create_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_create_all_cpu_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='645' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_qsbr_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_qsbr_set_thread_call_rcu_data' mangled-name='set_thread_call_rcu_data_qsbr' filepath='src/urcu-call-rcu-impl.h' line='630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_thread_call_rcu_data_qsbr'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='630' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_qsbr_get_thread_call_rcu_data' mangled-name='urcu_qsbr_get_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_get_thread_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_get_call_rcu_data() -->
+    <function-decl name='urcu_qsbr_get_call_rcu_data' mangled-name='get_call_rcu_data_qsbr' filepath='src/urcu-call-rcu-impl.h' line='590' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_data_qsbr'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_get_default_call_rcu_data() -->
+    <function-decl name='urcu_qsbr_get_default_call_rcu_data' mangled-name='urcu_qsbr_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_qsbr_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_qsbr_set_cpu_call_rcu_data' mangled-name='set_cpu_call_rcu_data_qsbr' filepath='src/urcu-call-rcu-impl.h' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_cpu_call_rcu_data_qsbr'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_qsbr_create_call_rcu_data' mangled-name='urcu_qsbr_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='498' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='499' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_qsbr_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_qsbr_get_call_rcu_thread' mangled-name='urcu_qsbr_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='476' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-8'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_qsbr_get_cpu_call_rcu_data' mangled-name='get_cpu_call_rcu_data_qsbr' filepath='src/urcu-call-rcu-impl.h' line='452' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_qsbr'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='452' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_qsbr_exit() -->
+    <function-decl name='urcu_qsbr_exit' mangled-name='urcu_qsbr_exit' filepath='src/urcu-qsbr.c' line='512' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_exit'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_unregister_thread() -->
+    <function-decl name='urcu_qsbr_unregister_thread' mangled-name='urcu_qsbr_unregister_thread' filepath='src/urcu-qsbr.c' line='496' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_register_thread() -->
+    <function-decl name='urcu_qsbr_register_thread' mangled-name='urcu_qsbr_register_thread' filepath='src/urcu-qsbr.c' line='481' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_thread_online() -->
+    <function-decl name='urcu_qsbr_thread_online' mangled-name='urcu_qsbr_thread_online' filepath='src/urcu-qsbr.c' line='474' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_thread_online'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_thread_offline() -->
+    <function-decl name='urcu_qsbr_thread_offline' mangled-name='urcu_qsbr_thread_offline' filepath='src/urcu-qsbr.c' line='467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_thread_offline'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_quiescent_state() -->
+    <function-decl name='urcu_qsbr_quiescent_state' mangled-name='urcu_qsbr_quiescent_state' filepath='src/urcu-qsbr.c' line='460' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_quiescent_state'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int urcu_qsbr_read_ongoing() -->
+    <function-decl name='urcu_qsbr_read_ongoing' mangled-name='rcu_read_ongoing_qsbr' filepath='src/urcu-qsbr.c' line='453' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_ongoing_qsbr'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_qsbr_read_unlock() -->
+    <function-decl name='urcu_qsbr_read_unlock' mangled-name='urcu_qsbr_read_unlock' filepath='src/urcu-qsbr.c' line='447' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_read_unlock'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_read_lock() -->
+    <function-decl name='urcu_qsbr_read_lock' mangled-name='rcu_read_lock_qsbr' filepath='src/urcu-qsbr.c' line='441' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_lock_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_synchronize_rcu() -->
+    <function-decl name='urcu_qsbr_synchronize_rcu' mangled-name='urcu_qsbr_synchronize_rcu' filepath='src/urcu-qsbr.c' line='349' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-18'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-25'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-24'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-24'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-22'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-33'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-32'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-30'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-29'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-28'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-38' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-9' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-2' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-2' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-42' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-42' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-signal.so.6.xml b/extras/abi/0.12/x86_64-pc-linux-gnu/liburcu-signal.so.6.xml
new file mode 100644 (file)
index 0000000..feaa997
--- /dev/null
@@ -0,0 +1,928 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-signal.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_child_sig -->
+    <elf-symbol name='call_rcu_after_fork_child_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_call_rcu_after_fork_child' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_sig -->
+    <elf-symbol name='call_rcu_after_fork_parent_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_sig -->
+    <elf-symbol name='call_rcu_before_fork_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_call_rcu_before_fork' is-defined='yes'/>
+    <!-- call_rcu_data_free_sig -->
+    <elf-symbol name='call_rcu_data_free_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_call_rcu_data_free' is-defined='yes'/>
+    <!-- call_rcu_sig -->
+    <elf-symbol name='call_rcu_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_sig -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_create_all_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- create_call_rcu_data_sig -->
+    <elf-symbol name='create_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- defer_rcu_sig -->
+    <elf-symbol name='defer_rcu_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data_sig -->
+    <elf-symbol name='free_all_cpu_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_data_sig -->
+    <elf-symbol name='get_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_thread_sig -->
+    <elf-symbol name='get_call_rcu_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_get_call_rcu_thread' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_sig -->
+    <elf-symbol name='get_cpu_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_get_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_sig -->
+    <elf-symbol name='get_default_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_sig -->
+    <elf-symbol name='get_thread_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_barrier_sig -->
+    <elf-symbol name='rcu_barrier_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_sig -->
+    <elf-symbol name='rcu_defer_barrier_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_defer_barrier' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_sig -->
+    <elf-symbol name='rcu_defer_barrier_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_defer_barrier_thread' is-defined='yes'/>
+    <!-- rcu_defer_exit_sig -->
+    <elf-symbol name='rcu_defer_exit_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_defer_exit' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_sig -->
+    <elf-symbol name='rcu_defer_register_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_sig -->
+    <elf-symbol name='rcu_defer_unregister_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_defer_unregister_thread' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_exit_sig -->
+    <elf-symbol name='rcu_exit_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_init_sig -->
+    <elf-symbol name='rcu_init_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_init' is-defined='yes'/>
+    <!-- rcu_read_lock_sig -->
+    <elf-symbol name='rcu_read_lock_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_ongoing_sig -->
+    <elf-symbol name='rcu_read_ongoing_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_read_ongoing' is-defined='yes'/>
+    <!-- rcu_read_unlock_sig -->
+    <elf-symbol name='rcu_read_unlock_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_read_unlock' is-defined='yes'/>
+    <!-- rcu_register_thread_sig -->
+    <elf-symbol name='rcu_register_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_unregister_thread_sig -->
+    <elf-symbol name='rcu_unregister_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_sig -->
+    <elf-symbol name='set_cpu_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_set_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_sig -->
+    <elf-symbol name='set_thread_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- synchronize_rcu_sig -->
+    <elf-symbol name='synchronize_rcu_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_register_rculfhash_atfork_sig -->
+    <elf-symbol name='urcu_register_rculfhash_atfork_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_barrier -->
+    <elf-symbol name='urcu_signal_barrier' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_barrier_sig' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu -->
+    <elf-symbol name='urcu_signal_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_sig' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_signal_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_signal_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_after_fork_parent_sig' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu_before_fork -->
+    <elf-symbol name='urcu_signal_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu_data_free -->
+    <elf-symbol name='urcu_signal_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_signal_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_create_call_rcu_data -->
+    <elf-symbol name='urcu_signal_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='create_call_rcu_data_sig' is-defined='yes'/>
+    <!-- urcu_signal_defer_barrier -->
+    <elf-symbol name='urcu_signal_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_defer_barrier_thread -->
+    <elf-symbol name='urcu_signal_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_defer_exit -->
+    <elf-symbol name='urcu_signal_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_defer_rcu -->
+    <elf-symbol name='urcu_signal_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='defer_rcu_sig' is-defined='yes'/>
+    <!-- urcu_signal_defer_register_thread -->
+    <elf-symbol name='urcu_signal_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_register_thread_sig' is-defined='yes'/>
+    <!-- urcu_signal_defer_unregister_thread -->
+    <elf-symbol name='urcu_signal_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_exit -->
+    <elf-symbol name='urcu_signal_exit' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_exit_sig' is-defined='yes'/>
+    <!-- urcu_signal_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_signal_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='free_all_cpu_call_rcu_data_sig' is-defined='yes'/>
+    <!-- urcu_signal_get_call_rcu_data -->
+    <elf-symbol name='urcu_signal_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_call_rcu_data_sig' is-defined='yes'/>
+    <!-- urcu_signal_get_call_rcu_thread -->
+    <elf-symbol name='urcu_signal_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_signal_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_signal_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_default_call_rcu_data_sig' is-defined='yes'/>
+    <!-- urcu_signal_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_signal_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_thread_call_rcu_data_sig' is-defined='yes'/>
+    <!-- urcu_signal_init -->
+    <elf-symbol name='urcu_signal_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_read_lock -->
+    <elf-symbol name='urcu_signal_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_read_lock_sig' is-defined='yes'/>
+    <!-- urcu_signal_read_ongoing -->
+    <elf-symbol name='urcu_signal_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_read_unlock -->
+    <elf-symbol name='urcu_signal_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_signal_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_register_rculfhash_atfork_sig' is-defined='yes'/>
+    <!-- urcu_signal_register_thread -->
+    <elf-symbol name='urcu_signal_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_register_thread_sig' is-defined='yes'/>
+    <!-- urcu_signal_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_signal_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_signal_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='set_thread_call_rcu_data_sig' is-defined='yes'/>
+    <!-- urcu_signal_synchronize_rcu -->
+    <elf-symbol name='urcu_signal_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='synchronize_rcu_sig' is-defined='yes'/>
+    <!-- urcu_signal_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_signal_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_unregister_thread -->
+    <elf-symbol name='urcu_signal_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_unregister_thread_sig' is-defined='yes'/>
+    <!-- urcu_unregister_rculfhash_atfork_sig -->
+    <elf-symbol name='urcu_unregister_rculfhash_atfork_sig' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_signal_unregister_rculfhash_atfork' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_sig -->
+    <elf-symbol name='rcu_flavor_sig' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_gp_sig -->
+    <elf-symbol name='rcu_gp_sig' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_reader_sig -->
+    <elf-symbol name='rcu_reader_sig' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_flavor -->
+    <elf-symbol name='urcu_signal_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' alias='rcu_flavor_sig' is-defined='yes'/>
+    <!-- urcu_signal_gp -->
+    <elf-symbol name='urcu_signal_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' alias='rcu_gp_sig' is-defined='yes'/>
+    <!-- urcu_signal_reader -->
+    <elf-symbol name='urcu_signal_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' alias='rcu_reader_sig' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='67' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='77' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-4' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-3'/>
+    <!-- urcu_gp urcu_signal_gp -->
+    <var-decl name='urcu_signal_gp' type-id='type-id-1' mangled-name='urcu_signal_gp' visibility='default' filepath='../include/urcu/static/urcu-signal.h' line='61' column='1' elf-symbol-id='urcu_signal_gp'/>
+    <!-- struct urcu_reader -->
+    <class-decl name='urcu_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='80' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char urcu_reader::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='83' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_reader::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_reader::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_reader::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='88' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- urcu_reader urcu_signal_reader -->
+    <var-decl name='urcu_signal_reader' type-id='type-id-6' mangled-name='urcu_signal_reader' visibility='default' filepath='../include/urcu/static/urcu-signal.h' line='63' column='1' elf-symbol-id='urcu_signal_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct urcu_signal_flavor -->
+    <var-decl name='urcu_signal_flavor' type-id='type-id-35' mangled-name='urcu_signal_flavor' visibility='default' filepath='../include/urcu/flavor.h' line='90' column='1' elf-symbol-id='urcu_signal_flavor'/>
+    <!-- void urcu_signal_defer_exit() -->
+    <function-decl name='urcu_signal_defer_exit' mangled-name='rcu_defer_exit_sig' filepath='src/urcu-defer-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_exit_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_defer_unregister_thread() -->
+    <function-decl name='urcu_signal_defer_unregister_thread' mangled-name='rcu_defer_unregister_thread_sig' filepath='src/urcu-defer-impl.h' line='456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_unregister_thread_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_signal_defer_register_thread() -->
+    <function-decl name='urcu_signal_defer_register_thread' mangled-name='urcu_signal_defer_register_thread' filepath='src/urcu-defer-impl.h' line='432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_signal_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_signal_defer_rcu' mangled-name='urcu_signal_defer_rcu' filepath='src/urcu-defer-impl.h' line='400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_defer_rcu'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_defer_barrier() -->
+    <function-decl name='urcu_signal_defer_barrier' mangled-name='rcu_defer_barrier_sig' filepath='src/urcu-defer-impl.h' line='284' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_defer_barrier_thread() -->
+    <function-decl name='urcu_signal_defer_barrier_thread' mangled-name='rcu_defer_barrier_thread_sig' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_signal_unregister_rculfhash_atfork' mangled-name='urcu_unregister_rculfhash_atfork_sig' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_unregister_rculfhash_atfork_sig'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_signal_register_rculfhash_atfork' mangled-name='urcu_signal_register_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1044' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_register_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_signal_call_rcu_after_fork_child' mangled-name='call_rcu_after_fork_child_sig' filepath='src/urcu-call-rcu-impl.h' line='1000' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_signal_call_rcu_after_fork_parent' mangled-name='urcu_signal_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='976' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_call_rcu_before_fork() -->
+    <function-decl name='urcu_signal_call_rcu_before_fork' mangled-name='call_rcu_before_fork_sig' filepath='src/urcu-call-rcu-impl.h' line='947' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_before_fork_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_barrier() -->
+    <function-decl name='urcu_signal_barrier' mangled-name='urcu_signal_barrier' filepath='src/urcu-call-rcu-impl.h' line='874' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_signal_free_all_cpu_call_rcu_data' mangled-name='urcu_signal_free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-2' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_signal_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_signal_call_rcu_data_free' mangled-name='call_rcu_data_free_sig' filepath='src/urcu-call-rcu-impl.h' line='764' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_data_free_sig'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='764' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_signal_call_rcu' mangled-name='urcu_signal_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='725' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='725' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='726' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_signal_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_signal_create_all_cpu_call_rcu_data' mangled-name='create_all_cpu_call_rcu_data_sig' filepath='src/urcu-call-rcu-impl.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_sig'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='645' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_signal_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_signal_set_thread_call_rcu_data' mangled-name='urcu_signal_set_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_set_thread_call_rcu_data'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='630' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_signal_get_thread_call_rcu_data' mangled-name='urcu_signal_get_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_get_thread_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_get_call_rcu_data() -->
+    <function-decl name='urcu_signal_get_call_rcu_data' mangled-name='urcu_signal_get_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='590' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_get_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_get_default_call_rcu_data() -->
+    <function-decl name='urcu_signal_get_default_call_rcu_data' mangled-name='urcu_signal_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_signal_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_signal_set_cpu_call_rcu_data' mangled-name='set_cpu_call_rcu_data_sig' filepath='src/urcu-call-rcu-impl.h' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_cpu_call_rcu_data_sig'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_signal_create_call_rcu_data' mangled-name='urcu_signal_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='498' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='499' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_signal_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_signal_get_call_rcu_thread' mangled-name='get_call_rcu_thread_sig' filepath='src/urcu-call-rcu-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_thread_sig'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='476' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_signal_get_cpu_call_rcu_data' mangled-name='get_cpu_call_rcu_data_sig' filepath='src/urcu-call-rcu-impl.h' line='452' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_sig'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='452' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_signal_exit() -->
+    <function-decl name='urcu_signal_exit' mangled-name='urcu_signal_exit' filepath='src/urcu.c' line='666' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_exit'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_init() -->
+    <function-decl name='urcu_signal_init' mangled-name='rcu_init_sig' filepath='src/urcu.c' line='647' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_init_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_unregister_thread() -->
+    <function-decl name='urcu_signal_unregister_thread' mangled-name='urcu_signal_unregister_thread' filepath='src/urcu.c' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_register_thread() -->
+    <function-decl name='urcu_signal_register_thread' mangled-name='urcu_signal_register_thread' filepath='src/urcu.c' line='547' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_signal_read_ongoing() -->
+    <function-decl name='urcu_signal_read_ongoing' mangled-name='rcu_read_ongoing_sig' filepath='src/urcu.c' line='540' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_ongoing_sig'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_signal_read_unlock() -->
+    <function-decl name='urcu_signal_read_unlock' mangled-name='rcu_read_unlock_sig' filepath='src/urcu.c' line='533' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_unlock_sig'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_read_lock() -->
+    <function-decl name='urcu_signal_read_lock' mangled-name='urcu_signal_read_lock' filepath='src/urcu.c' line='526' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_read_lock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_synchronize_rcu() -->
+    <function-decl name='urcu_signal_synchronize_rcu' mangled-name='urcu_signal_synchronize_rcu' filepath='src/urcu.c' line='403' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-2' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-2' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.12/x86_64-pc-linux-gnu/liburcu.so.6.xml b/extras/abi/0.12/x86_64-pc-linux-gnu/liburcu.so.6.xml
new file mode 100644 (file)
index 0000000..3d42cd2
--- /dev/null
@@ -0,0 +1,925 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu.so.6'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_child_memb -->
+    <elf-symbol name='call_rcu_after_fork_child_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_call_rcu_after_fork_child' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_memb -->
+    <elf-symbol name='call_rcu_after_fork_parent_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_memb -->
+    <elf-symbol name='call_rcu_before_fork_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_data_free_memb -->
+    <elf-symbol name='call_rcu_data_free_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_memb -->
+    <elf-symbol name='call_rcu_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_memb -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_create_all_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- create_call_rcu_data_memb -->
+    <elf-symbol name='create_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- defer_rcu_memb -->
+    <elf-symbol name='defer_rcu_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_defer_rcu' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data_memb -->
+    <elf-symbol name='free_all_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_data_memb -->
+    <elf-symbol name='get_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_get_call_rcu_data' is-defined='yes'/>
+    <!-- get_call_rcu_thread_memb -->
+    <elf-symbol name='get_call_rcu_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_memb -->
+    <elf-symbol name='get_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_get_cpu_call_rcu_data' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_memb -->
+    <elf-symbol name='get_default_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_memb -->
+    <elf-symbol name='get_thread_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_get_thread_call_rcu_data' is-defined='yes'/>
+    <!-- rcu_barrier_memb -->
+    <elf-symbol name='rcu_barrier_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_barrier' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_memb -->
+    <elf-symbol name='rcu_defer_barrier_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_defer_barrier' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_memb -->
+    <elf-symbol name='rcu_defer_barrier_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_defer_barrier_thread' is-defined='yes'/>
+    <!-- rcu_defer_exit_memb -->
+    <elf-symbol name='rcu_defer_exit_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_memb -->
+    <elf-symbol name='rcu_defer_register_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_memb -->
+    <elf-symbol name='rcu_defer_unregister_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_defer_unregister_thread' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_init_memb -->
+    <elf-symbol name='rcu_init_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_init' is-defined='yes'/>
+    <!-- rcu_read_lock_memb -->
+    <elf-symbol name='rcu_read_lock_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_read_lock' is-defined='yes'/>
+    <!-- rcu_read_ongoing_memb -->
+    <elf-symbol name='rcu_read_ongoing_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_unlock_memb -->
+    <elf-symbol name='rcu_read_unlock_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_register_thread_memb -->
+    <elf-symbol name='rcu_register_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_unregister_thread_memb -->
+    <elf-symbol name='rcu_unregister_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_memb -->
+    <elf-symbol name='set_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_memb -->
+    <elf-symbol name='set_thread_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_set_thread_call_rcu_data' is-defined='yes'/>
+    <!-- synchronize_rcu_memb -->
+    <elf-symbol name='synchronize_rcu_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_barrier -->
+    <elf-symbol name='urcu_memb_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu -->
+    <elf-symbol name='urcu_memb_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_memb' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_memb_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_memb_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_after_fork_parent_memb' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_before_fork -->
+    <elf-symbol name='urcu_memb_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_before_fork_memb' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_data_free -->
+    <elf-symbol name='urcu_memb_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' alias='call_rcu_data_free_memb' is-defined='yes'/>
+    <!-- urcu_memb_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_create_call_rcu_data -->
+    <elf-symbol name='urcu_memb_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='create_call_rcu_data_memb' is-defined='yes'/>
+    <!-- urcu_memb_defer_barrier -->
+    <elf-symbol name='urcu_memb_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_barrier_thread -->
+    <elf-symbol name='urcu_memb_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_exit -->
+    <elf-symbol name='urcu_memb_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_exit_memb' is-defined='yes'/>
+    <!-- urcu_memb_defer_rcu -->
+    <elf-symbol name='urcu_memb_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_register_thread -->
+    <elf-symbol name='urcu_memb_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_defer_register_thread_memb' is-defined='yes'/>
+    <!-- urcu_memb_defer_unregister_thread -->
+    <elf-symbol name='urcu_memb_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='free_all_cpu_call_rcu_data_memb' is-defined='yes'/>
+    <!-- urcu_memb_get_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_call_rcu_thread -->
+    <elf-symbol name='urcu_memb_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_call_rcu_thread_memb' is-defined='yes'/>
+    <!-- urcu_memb_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='get_default_call_rcu_data_memb' is-defined='yes'/>
+    <!-- urcu_memb_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_init -->
+    <elf-symbol name='urcu_memb_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_lock -->
+    <elf-symbol name='urcu_memb_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_ongoing -->
+    <elf-symbol name='urcu_memb_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_read_ongoing_memb' is-defined='yes'/>
+    <!-- urcu_memb_read_unlock -->
+    <elf-symbol name='urcu_memb_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_read_unlock_memb' is-defined='yes'/>
+    <!-- urcu_memb_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_memb_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_register_thread -->
+    <elf-symbol name='urcu_memb_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_register_thread_memb' is-defined='yes'/>
+    <!-- urcu_memb_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' alias='set_cpu_call_rcu_data_memb' is-defined='yes'/>
+    <!-- urcu_memb_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_memb_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_synchronize_rcu -->
+    <elf-symbol name='urcu_memb_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' alias='synchronize_rcu_memb' is-defined='yes'/>
+    <!-- urcu_memb_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_memb_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_unregister_rculfhash_atfork_memb' is-defined='yes'/>
+    <!-- urcu_memb_unregister_thread -->
+    <elf-symbol name='urcu_memb_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' alias='rcu_unregister_thread_memb' is-defined='yes'/>
+    <!-- urcu_register_rculfhash_atfork_memb -->
+    <elf-symbol name='urcu_register_rculfhash_atfork_memb' type='func-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_register_rculfhash_atfork' is-defined='yes'/>
+    <!-- urcu_unregister_rculfhash_atfork_memb -->
+    <elf-symbol name='urcu_unregister_rculfhash_atfork_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_memb -->
+    <elf-symbol name='rcu_flavor_memb' size='112' type='object-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_flavor' is-defined='yes'/>
+    <!-- rcu_gp_memb -->
+    <elf-symbol name='rcu_gp_memb' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_has_sys_membarrier_memb -->
+    <elf-symbol name='rcu_has_sys_membarrier_memb' size='4' type='object-type' binding='global-binding' visibility='default-visibility' alias='urcu_memb_has_sys_membarrier' is-defined='yes'/>
+    <!-- rcu_reader_memb -->
+    <elf-symbol name='rcu_reader_memb' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_flavor -->
+    <elf-symbol name='urcu_memb_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_gp -->
+    <elf-symbol name='urcu_memb_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' alias='rcu_gp_memb' is-defined='yes'/>
+    <!-- urcu_memb_has_sys_membarrier -->
+    <elf-symbol name='urcu_memb_has_sys_membarrier' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_reader -->
+    <elf-symbol name='urcu_memb_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' alias='rcu_reader_memb' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <!-- int urcu_memb_has_sys_membarrier -->
+    <var-decl name='urcu_memb_has_sys_membarrier' type-id='type-id-1' mangled-name='rcu_has_sys_membarrier_memb' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='72' column='1' elf-symbol-id='rcu_has_sys_membarrier_memb'/>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='67' column='1' id='type-id-2'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-4' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='77' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-1' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-4'/>
+    <!-- urcu_gp urcu_memb_gp -->
+    <var-decl name='urcu_memb_gp' type-id='type-id-2' mangled-name='urcu_memb_gp' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='83' column='1' elf-symbol-id='urcu_memb_gp'/>
+    <!-- struct urcu_reader -->
+    <class-decl name='urcu_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='80' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char urcu_reader::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='83' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_reader::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_reader::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_reader::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='88' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- urcu_reader urcu_memb_reader -->
+    <var-decl name='urcu_memb_reader' type-id='type-id-6' mangled-name='urcu_memb_reader' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='85' column='1' elf-symbol-id='urcu_memb_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct urcu_memb_flavor -->
+    <var-decl name='urcu_memb_flavor' type-id='type-id-35' mangled-name='rcu_flavor_memb' visibility='default' filepath='../include/urcu/flavor.h' line='90' column='1' elf-symbol-id='rcu_flavor_memb'/>
+    <!-- void urcu_memb_defer_exit() -->
+    <function-decl name='urcu_memb_defer_exit' mangled-name='urcu_memb_defer_exit' filepath='src/urcu-defer-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_unregister_thread() -->
+    <function-decl name='urcu_memb_defer_unregister_thread' mangled-name='rcu_defer_unregister_thread_memb' filepath='src/urcu-defer-impl.h' line='456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_unregister_thread_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_defer_register_thread() -->
+    <function-decl name='urcu_memb_defer_register_thread' mangled-name='urcu_memb_defer_register_thread' filepath='src/urcu-defer-impl.h' line='432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_memb_defer_rcu' mangled-name='defer_rcu_memb' filepath='src/urcu-defer-impl.h' line='400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_memb'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='400' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_barrier() -->
+    <function-decl name='urcu_memb_defer_barrier' mangled-name='rcu_defer_barrier_memb' filepath='src/urcu-defer-impl.h' line='284' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_barrier_thread() -->
+    <function-decl name='urcu_memb_defer_barrier_thread' mangled-name='rcu_defer_barrier_thread_memb' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_memb_unregister_rculfhash_atfork' mangled-name='urcu_memb_unregister_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_unregister_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_memb_register_rculfhash_atfork' mangled-name='urcu_register_rculfhash_atfork_memb' filepath='src/urcu-call-rcu-impl.h' line='1044' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_register_rculfhash_atfork_memb'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1056' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_memb_call_rcu_after_fork_child' mangled-name='call_rcu_after_fork_child_memb' filepath='src/urcu-call-rcu-impl.h' line='1000' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_memb_call_rcu_after_fork_parent' mangled-name='urcu_memb_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='976' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_before_fork() -->
+    <function-decl name='urcu_memb_call_rcu_before_fork' mangled-name='urcu_memb_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='947' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_barrier() -->
+    <function-decl name='urcu_memb_barrier' mangled-name='rcu_barrier_memb' filepath='src/urcu-call-rcu-impl.h' line='874' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_barrier_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_memb_free_all_cpu_call_rcu_data' mangled-name='urcu_memb_free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-1' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_memb_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_memb_call_rcu_data_free' mangled-name='urcu_memb_call_rcu_data_free' filepath='src/urcu-call-rcu-impl.h' line='764' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_data_free'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='764' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_memb_call_rcu' mangled-name='urcu_memb_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='725' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='725' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='726' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_memb_create_all_cpu_call_rcu_data' mangled-name='create_all_cpu_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_memb'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='645' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_memb_set_thread_call_rcu_data' mangled-name='set_thread_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_thread_call_rcu_data_memb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='630' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_thread_call_rcu_data' mangled-name='get_thread_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_thread_call_rcu_data_memb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_call_rcu_data' mangled-name='get_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='590' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_data_memb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_default_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_default_call_rcu_data' mangled-name='urcu_memb_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_memb_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_memb_set_cpu_call_rcu_data' mangled-name='urcu_memb_set_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_set_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='522' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_memb_create_call_rcu_data' mangled-name='urcu_memb_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='498' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='499' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_memb_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_memb_get_call_rcu_thread' mangled-name='urcu_memb_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='476' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_memb_get_cpu_call_rcu_data' mangled-name='get_cpu_call_rcu_data_memb' filepath='src/urcu-call-rcu-impl.h' line='452' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_memb'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='452' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_memb_init() -->
+    <function-decl name='urcu_memb_init' mangled-name='rcu_init_memb' filepath='src/urcu.c' line='613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_init_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_unregister_thread() -->
+    <function-decl name='urcu_memb_unregister_thread' mangled-name='urcu_memb_unregister_thread' filepath='src/urcu.c' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_register_thread() -->
+    <function-decl name='urcu_memb_register_thread' mangled-name='urcu_memb_register_thread' filepath='src/urcu.c' line='547' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_read_ongoing() -->
+    <function-decl name='urcu_memb_read_ongoing' mangled-name='urcu_memb_read_ongoing' filepath='src/urcu.c' line='540' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_ongoing'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_read_unlock() -->
+    <function-decl name='urcu_memb_read_unlock' mangled-name='urcu_memb_read_unlock' filepath='src/urcu.c' line='533' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_unlock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_read_lock() -->
+    <function-decl name='urcu_memb_read_lock' mangled-name='rcu_read_lock_memb' filepath='src/urcu.c' line='526' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_lock_memb'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_synchronize_rcu() -->
+    <function-decl name='urcu_memb_synchronize_rcu' mangled-name='urcu_memb_synchronize_rcu' filepath='src/urcu.c' line='403' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-bp.so.8.xml b/extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-bp.so.8.xml
new file mode 100644 (file)
index 0000000..7bc53cb
--- /dev/null
@@ -0,0 +1,907 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-bp.so.8'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_after_fork_child -->
+    <elf-symbol name='urcu_bp_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_after_fork_parent -->
+    <elf-symbol name='urcu_bp_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_barrier -->
+    <elf-symbol name='urcu_bp_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_before_fork -->
+    <elf-symbol name='urcu_bp_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu -->
+    <elf-symbol name='urcu_bp_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_bp_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_bp_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu_before_fork -->
+    <elf-symbol name='urcu_bp_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu_data_free -->
+    <elf-symbol name='urcu_bp_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_cmpxchg_pointer_sym -->
+    <elf-symbol name='urcu_bp_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_bp_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_create_call_rcu_data -->
+    <elf-symbol name='urcu_bp_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_barrier -->
+    <elf-symbol name='urcu_bp_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_barrier_thread -->
+    <elf-symbol name='urcu_bp_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_exit -->
+    <elf-symbol name='urcu_bp_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_rcu -->
+    <elf-symbol name='urcu_bp_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_register_thread -->
+    <elf-symbol name='urcu_bp_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_unregister_thread -->
+    <elf-symbol name='urcu_bp_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_dereference_sym -->
+    <elf-symbol name='urcu_bp_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_bp_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_get_call_rcu_data -->
+    <elf-symbol name='urcu_bp_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_get_call_rcu_thread -->
+    <elf-symbol name='urcu_bp_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_bp_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_bp_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_bp_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_read_lock -->
+    <elf-symbol name='urcu_bp_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_read_ongoing -->
+    <elf-symbol name='urcu_bp_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_read_unlock -->
+    <elf-symbol name='urcu_bp_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_register -->
+    <elf-symbol name='urcu_bp_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_bp_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_register_thread -->
+    <elf-symbol name='urcu_bp_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_bp_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_set_pointer_sym -->
+    <elf-symbol name='urcu_bp_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_bp_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_synchronize_rcu -->
+    <elf-symbol name='urcu_bp_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_bp_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_xchg_pointer_sym -->
+    <elf-symbol name='urcu_bp_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_flavor -->
+    <elf-symbol name='urcu_bp_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_gp -->
+    <elf-symbol name='urcu_bp_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_has_sys_membarrier -->
+    <elf-symbol name='urcu_bp_has_sys_membarrier' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_reader -->
+    <elf-symbol name='urcu_bp_reader' size='8' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu-bp.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <!-- int urcu_bp_has_sys_membarrier -->
+    <var-decl name='urcu_bp_has_sys_membarrier' type-id='type-id-1' mangled-name='urcu_bp_has_sys_membarrier' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='109' column='1' elf-symbol-id='urcu_bp_has_sys_membarrier'/>
+    <!-- struct urcu_bp_gp -->
+    <class-decl name='urcu_bp_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='77' column='1' id='type-id-2'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_bp_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- urcu_bp_gp urcu_bp_gp -->
+    <var-decl name='urcu_bp_gp' type-id='type-id-2' mangled-name='urcu_bp_gp' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='88' column='1' elf-symbol-id='urcu_bp_gp'/>
+    <!-- struct urcu_bp_reader -->
+    <class-decl name='urcu_bp_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='90' column='1' id='type-id-4'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_bp_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='92' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_bp_reader::node -->
+        <var-decl name='node' type-id='type-id-5' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_bp_reader::tid -->
+        <var-decl name='tid' type-id='type-id-6' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='95' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1216'>
+        <!-- int urcu_bp_reader::alloc -->
+        <var-decl name='alloc' type-id='type-id-1' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='96' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-5'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-7' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-7' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-7'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-6'/>
+    <!-- urcu_bp_reader* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-8'/>
+    <!-- urcu_bp_reader* urcu_bp_reader -->
+    <var-decl name='urcu_bp_reader' type-id='type-id-8' mangled-name='urcu_bp_reader' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='104' column='1' elf-symbol-id='urcu_bp_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-9'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-11' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-15'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-16' size-in-bits='64' id='type-id-10'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-11'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-18'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-19' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-20' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-19'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-21'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-22'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-23' size-in-bits='64' id='type-id-20'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-24' size-in-bits='64' id='type-id-12'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-15' size-in-bits='64' id='type-id-25'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-27'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-13'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-29'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-27' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-27' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-27' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-25' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-14'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-9' const='yes' id='type-id-32'/>
+    <!-- const rcu_flavor_struct urcu_bp_flavor -->
+    <var-decl name='urcu_bp_flavor' type-id='type-id-32' mangled-name='urcu_bp_flavor' visibility='default' filepath='../include/urcu/flavor.h' line='81' column='1' elf-symbol-id='urcu_bp_flavor'/>
+    <!-- void urcu_bp_defer_exit() -->
+    <function-decl name='urcu_bp_defer_exit' mangled-name='urcu_bp_defer_exit' filepath='src/urcu-defer-impl.h' line='467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_defer_unregister_thread() -->
+    <function-decl name='urcu_bp_defer_unregister_thread' mangled-name='urcu_bp_defer_unregister_thread' filepath='src/urcu-defer-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_defer_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int urcu_bp_defer_register_thread() -->
+    <function-decl name='urcu_bp_defer_register_thread' mangled-name='urcu_bp_defer_register_thread' filepath='src/urcu-defer-impl.h' line='427' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_bp_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_bp_defer_rcu' mangled-name='urcu_bp_defer_rcu' filepath='src/urcu-defer-impl.h' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_defer_rcu'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-27' name='fct' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='p' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_defer_barrier() -->
+    <function-decl name='urcu_bp_defer_barrier' mangled-name='urcu_bp_defer_barrier' filepath='src/urcu-defer-impl.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_defer_barrier'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_defer_barrier_thread() -->
+    <function-decl name='urcu_bp_defer_barrier_thread' mangled-name='urcu_bp_defer_barrier_thread' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_defer_barrier_thread'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_bp_unregister_rculfhash_atfork' mangled-name='urcu_bp_unregister_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_unregister_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-30' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_bp_register_rculfhash_atfork' mangled-name='urcu_bp_register_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1002' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_register_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-30' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_bp_call_rcu_after_fork_child' mangled-name='urcu_bp_call_rcu_after_fork_child' filepath='src/urcu-call-rcu-impl.h' line='960' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_call_rcu_after_fork_child'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_bp_call_rcu_after_fork_parent' mangled-name='urcu_bp_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='938' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_call_rcu_before_fork() -->
+    <function-decl name='urcu_bp_call_rcu_before_fork' mangled-name='urcu_bp_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='911' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_barrier() -->
+    <function-decl name='urcu_bp_barrier' mangled-name='urcu_bp_barrier' filepath='src/urcu-call-rcu-impl.h' line='840' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_barrier'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_bp_free_all_cpu_call_rcu_data' mangled-name='urcu_bp_free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='777' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-33'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-34' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-35' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-36' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-6' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-1' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-5' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-34'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-35'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-19' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-37' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-38'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-39' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-40' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-39'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-42'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-43'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-45'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-46'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-45' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-44'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-47'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='320' id='type-id-40'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-41'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-38' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-37'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-1' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-49'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-49' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-36'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-50'/>
+    <!-- void urcu_bp_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_bp_call_rcu_data_free' mangled-name='urcu_bp_call_rcu_data_free' filepath='src/urcu-call-rcu-impl.h' line='742' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_call_rcu_data_free'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='742' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_bp_call_rcu' mangled-name='urcu_bp_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='704' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-22' name='head' filepath='src/urcu-call-rcu-impl.h' line='704' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-20' name='func' filepath='src/urcu-call-rcu-impl.h' line='705' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int urcu_bp_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_bp_create_all_cpu_call_rcu_data' mangled-name='urcu_bp_create_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_create_all_cpu_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='626' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_bp_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_bp_set_thread_call_rcu_data' mangled-name='urcu_bp_set_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_set_thread_call_rcu_data'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='613' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_bp_get_thread_call_rcu_data' mangled-name='urcu_bp_get_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='597' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_get_thread_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_get_call_rcu_data() -->
+    <function-decl name='urcu_bp_get_call_rcu_data' mangled-name='urcu_bp_get_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_get_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_get_default_call_rcu_data() -->
+    <function-decl name='urcu_bp_get_default_call_rcu_data' mangled-name='urcu_bp_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- int urcu_bp_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_bp_set_cpu_call_rcu_data' mangled-name='urcu_bp_set_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_set_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_bp_create_call_rcu_data' mangled-name='urcu_bp_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='489' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='489' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='490' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- pthread_t urcu_bp_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_bp_get_call_rcu_thread' mangled-name='urcu_bp_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='471' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='471' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_bp_get_cpu_call_rcu_data' mangled-name='urcu_bp_get_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_get_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='449' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-25' size-in-bits='64' id='type-id-51'/>
+    <!-- void* urcu_bp_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='urcu_bp_cmpxchg_pointer_sym' mangled-name='urcu_bp_cmpxchg_pointer_sym' filepath='src/urcu-bp.c' line='762' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='762' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='old' filepath='src/urcu-bp.c' line='762' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='_new' filepath='src/urcu-bp.c' line='762' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* urcu_bp_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='urcu_bp_xchg_pointer_sym' mangled-name='urcu_bp_xchg_pointer_sym' filepath='src/urcu-bp.c' line='756' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='756' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='756' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* urcu_bp_set_pointer_sym(void**, void*) -->
+    <function-decl name='urcu_bp_set_pointer_sym' mangled-name='urcu_bp_set_pointer_sym' filepath='src/urcu-bp.c' line='749' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='749' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='749' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* urcu_bp_dereference_sym(void*) -->
+    <function-decl name='urcu_bp_dereference_sym' mangled-name='urcu_bp_dereference_sym' filepath='src/urcu-bp.c' line='744' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='p' filepath='src/urcu-bp.c' line='744' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void urcu_bp_after_fork_child() -->
+    <function-decl name='urcu_bp_after_fork_child' mangled-name='urcu_bp_after_fork_child' filepath='src/urcu-bp.c' line='731' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_after_fork_child'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_after_fork_parent() -->
+    <function-decl name='urcu_bp_after_fork_parent' mangled-name='urcu_bp_after_fork_parent' filepath='src/urcu-bp.c' line='696' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_before_fork() -->
+    <function-decl name='urcu_bp_before_fork' mangled-name='urcu_bp_before_fork' filepath='src/urcu-bp.c' line='682' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_register_thread() -->
+    <function-decl name='urcu_bp_register_thread' mangled-name='urcu_bp_register_thread' filepath='src/urcu-bp.c' line='565' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_register() -->
+    <function-decl name='urcu_bp_register' mangled-name='urcu_bp_register' filepath='src/urcu-bp.c' line='532' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_register'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int urcu_bp_read_ongoing() -->
+    <function-decl name='urcu_bp_read_ongoing' mangled-name='urcu_bp_read_ongoing' filepath='src/urcu-bp.c' line='365' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_read_ongoing'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_bp_read_unlock() -->
+    <function-decl name='urcu_bp_read_unlock' mangled-name='urcu_bp_read_unlock' filepath='src/urcu-bp.c' line='360' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_read_unlock'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_read_lock() -->
+    <function-decl name='urcu_bp_read_lock' mangled-name='urcu_bp_read_lock' filepath='src/urcu-bp.c' line='355' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_read_lock'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_synchronize_rcu() -->
+    <function-decl name='urcu_bp_synchronize_rcu' mangled-name='urcu_bp_synchronize_rcu' filepath='src/urcu-bp.c' line='272' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-17'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-16'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-23'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-22'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-24'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-22'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-20'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-28'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-27'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='762' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='old' filepath='src/urcu-bp.c' line='762' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='_new' filepath='src/urcu-bp.c' line='762' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='756' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='756' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='749' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='749' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='p' filepath='src/urcu-bp.c' line='744' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-37' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-52'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-55' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-53'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-56' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-56'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-59' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-58'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-59'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-42' size-in-bits='64' id='type-id-57'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-60'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='384' id='type-id-54'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-61'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-55'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-52' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-62'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-62' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-63'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-64'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-66' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-41' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-65'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-41' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-66'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-64' const='yes' id='type-id-67'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-67' size-in-bits='64' id='type-id-68'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-68' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-68' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-cds.so.8.xml b/extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-cds.so.8.xml
new file mode 100644 (file)
index 0000000..ae03526
--- /dev/null
@@ -0,0 +1,1484 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-cds.so.8'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- __cds_lfs_init -->
+    <elf-symbol name='__cds_lfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_lfs_pop -->
+    <elf-symbol name='__cds_lfs_pop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_lfs_pop_all -->
+    <elf-symbol name='__cds_lfs_pop_all' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _cds_lfht_new -->
+    <elf-symbol name='_cds_lfht_new' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_add -->
+    <elf-symbol name='cds_lfht_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_add_replace -->
+    <elf-symbol name='cds_lfht_add_replace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_add_unique -->
+    <elf-symbol name='cds_lfht_add_unique' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_count_nodes -->
+    <elf-symbol name='cds_lfht_count_nodes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_del -->
+    <elf-symbol name='cds_lfht_del' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_destroy -->
+    <elf-symbol name='cds_lfht_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_first -->
+    <elf-symbol name='cds_lfht_first' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_fls_ulong -->
+    <elf-symbol name='cds_lfht_fls_ulong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_get_count_order_ulong -->
+    <elf-symbol name='cds_lfht_get_count_order_ulong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_is_node_deleted -->
+    <elf-symbol name='cds_lfht_is_node_deleted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_lookup -->
+    <elf-symbol name='cds_lfht_lookup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_next -->
+    <elf-symbol name='cds_lfht_next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_next_duplicate -->
+    <elf-symbol name='cds_lfht_next_duplicate' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_replace -->
+    <elf-symbol name='cds_lfht_replace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_resize -->
+    <elf-symbol name='cds_lfht_resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_dequeue_rcu -->
+    <elf-symbol name='cds_lfq_dequeue_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_destroy_rcu -->
+    <elf-symbol name='cds_lfq_destroy_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_enqueue_rcu -->
+    <elf-symbol name='cds_lfq_enqueue_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_init_rcu -->
+    <elf-symbol name='cds_lfq_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_node_init_rcu -->
+    <elf-symbol name='cds_lfq_node_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_destroy -->
+    <elf-symbol name='cds_lfs_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_empty -->
+    <elf-symbol name='cds_lfs_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_init -->
+    <elf-symbol name='cds_lfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_init_rcu -->
+    <elf-symbol name='cds_lfs_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_node_init -->
+    <elf-symbol name='cds_lfs_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_node_init_rcu -->
+    <elf-symbol name='cds_lfs_node_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_all_blocking -->
+    <elf-symbol name='cds_lfs_pop_all_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_blocking -->
+    <elf-symbol name='cds_lfs_pop_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_lock -->
+    <elf-symbol name='cds_lfs_pop_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_rcu -->
+    <elf-symbol name='cds_lfs_pop_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_unlock -->
+    <elf-symbol name='cds_lfs_pop_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_push -->
+    <elf-symbol name='cds_lfs_push' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_push_rcu -->
+    <elf-symbol name='cds_lfs_push_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_create -->
+    <elf-symbol name='urcu_workqueue_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_create_completion -->
+    <elf-symbol name='urcu_workqueue_create_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_create_worker -->
+    <elf-symbol name='urcu_workqueue_create_worker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_destroy -->
+    <elf-symbol name='urcu_workqueue_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_destroy_completion -->
+    <elf-symbol name='urcu_workqueue_destroy_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_flush_queued_work -->
+    <elf-symbol name='urcu_workqueue_flush_queued_work' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_pause_worker -->
+    <elf-symbol name='urcu_workqueue_pause_worker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_queue_completion -->
+    <elf-symbol name='urcu_workqueue_queue_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_queue_work -->
+    <elf-symbol name='urcu_workqueue_queue_work' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_resume_worker -->
+    <elf-symbol name='urcu_workqueue_resume_worker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_wait_completion -->
+    <elf-symbol name='urcu_workqueue_wait_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_mm_chunk -->
+    <elf-symbol name='cds_lfht_mm_chunk' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_mm_mmap -->
+    <elf-symbol name='cds_lfht_mm_mmap' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_mm_order -->
+    <elf-symbol name='cds_lfht_mm_order' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='rculfqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfq_node_rcu -->
+    <class-decl name='cds_lfq_node_rcu' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/rculfqueue.h' line='35' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfq_node_rcu* cds_lfq_node_rcu::next -->
+        <var-decl name='next' type-id='type-id-2' visibility='default' filepath='../include/urcu/rculfqueue.h' line='36' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int cds_lfq_node_rcu::dummy -->
+        <var-decl name='dummy' type-id='type-id-3' visibility='default' filepath='../include/urcu/rculfqueue.h' line='37' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfq_node_rcu* -->
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-3'/>
+    <!-- struct cds_lfq_queue_rcu -->
+    <class-decl name='cds_lfq_queue_rcu' size-in-bits='192' is-struct='yes' visibility='default' filepath='../include/urcu/rculfqueue.h' line='40' column='1' id='type-id-4'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfq_node_rcu* cds_lfq_queue_rcu::head -->
+        <var-decl name='head' type-id='type-id-2' visibility='default' filepath='../include/urcu/rculfqueue.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_lfq_node_rcu* cds_lfq_queue_rcu::tail -->
+        <var-decl name='tail' type-id='type-id-2' visibility='default' filepath='../include/urcu/rculfqueue.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* cds_lfq_queue_rcu::queue_call_rcu -->
+        <var-decl name='queue_call_rcu' type-id='type-id-5' visibility='default' filepath='../include/urcu/rculfqueue.h' line='42' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-6'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-7'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-8' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-9' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-10' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-10'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-7' size-in-bits='64' id='type-id-11'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-12' size-in-bits='64' id='type-id-9'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-13' size-in-bits='64' id='type-id-5'/>
+    <!-- cds_lfq_queue_rcu* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-14'/>
+    <!-- cds_lfq_node_rcu* cds_lfq_dequeue_rcu(cds_lfq_queue_rcu*) -->
+    <function-decl name='cds_lfq_dequeue_rcu' mangled-name='cds_lfq_dequeue_rcu' filepath='src/rculfqueue.c' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_dequeue_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='56' column='1'/>
+      <!-- cds_lfq_node_rcu* -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void cds_lfq_enqueue_rcu(cds_lfq_queue_rcu*, cds_lfq_node_rcu*) -->
+    <function-decl name='cds_lfq_enqueue_rcu' mangled-name='cds_lfq_enqueue_rcu' filepath='src/rculfqueue.c' line='50' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_enqueue_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='50' column='1'/>
+      <!-- parameter of type 'cds_lfq_node_rcu*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/rculfqueue.c' line='50' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- int cds_lfq_destroy_rcu(cds_lfq_queue_rcu*) -->
+    <function-decl name='cds_lfq_destroy_rcu' mangled-name='cds_lfq_destroy_rcu' filepath='src/rculfqueue.c' line='45' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_destroy_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='45' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- void cds_lfq_init_rcu(cds_lfq_queue_rcu*, void (rcu_head*, void (rcu_head*)*)*) -->
+    <function-decl name='cds_lfq_init_rcu' mangled-name='cds_lfq_init_rcu' filepath='src/rculfqueue.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_init_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='38' column='1'/>
+      <!-- parameter of type 'void (rcu_head*, void (rcu_head*)*)*' -->
+      <parameter type-id='type-id-5' name='queue_call_rcu' filepath='src/rculfqueue.c' line='39' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfq_node_init_rcu(cds_lfq_node_rcu*) -->
+    <function-decl name='cds_lfq_node_init_rcu' mangled-name='cds_lfq_node_init_rcu' filepath='src/rculfqueue.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_node_init_rcu'>
+      <!-- parameter of type 'cds_lfq_node_rcu*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/rculfqueue.c' line='33' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-12'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-11'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-13'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-11'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-9'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfstack.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfs_node_rcu -->
+    <class-decl name='cds_lfs_node_rcu' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/rculfstack.h' line='37' column='1' id='type-id-15'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node_rcu* cds_lfs_node_rcu::next -->
+        <var-decl name='next' type-id='type-id-16' visibility='default' filepath='../include/urcu/rculfstack.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfs_node_rcu* -->
+    <pointer-type-def type-id='type-id-15' size-in-bits='64' id='type-id-16'/>
+    <!-- struct cds_lfs_stack_rcu -->
+    <class-decl name='cds_lfs_stack_rcu' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/rculfstack.h' line='41' column='1' id='type-id-17'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node_rcu* cds_lfs_stack_rcu::head -->
+        <var-decl name='head' type-id='type-id-16' visibility='default' filepath='../include/urcu/rculfstack.h' line='42' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfs_stack_rcu* -->
+    <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-18'/>
+    <!-- cds_lfs_node_rcu* cds_lfs_pop_rcu(cds_lfs_stack_rcu*) -->
+    <function-decl name='cds_lfs_pop_rcu' mangled-name='cds_lfs_pop_rcu' filepath='src/rculfstack.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_rcu'>
+      <!-- parameter of type 'cds_lfs_stack_rcu*' -->
+      <parameter type-id='type-id-18' name='s' filepath='src/rculfstack.c' line='53' column='1'/>
+      <!-- cds_lfs_node_rcu* -->
+      <return type-id='type-id-16'/>
+    </function-decl>
+    <!-- int cds_lfs_push_rcu(cds_lfs_stack_rcu*, cds_lfs_node_rcu*) -->
+    <function-decl name='cds_lfs_push_rcu' mangled-name='cds_lfs_push_rcu' filepath='src/rculfstack.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_push_rcu'>
+      <!-- parameter of type 'cds_lfs_stack_rcu*' -->
+      <parameter type-id='type-id-18' name='s' filepath='src/rculfstack.c' line='47' column='1'/>
+      <!-- parameter of type 'cds_lfs_node_rcu*' -->
+      <parameter type-id='type-id-16' name='node' filepath='src/rculfstack.c' line='48' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- void cds_lfs_init_rcu(cds_lfs_stack_rcu*) -->
+    <function-decl name='cds_lfs_init_rcu' mangled-name='cds_lfs_init_rcu' filepath='src/rculfstack.c' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_init_rcu'>
+      <!-- parameter of type 'cds_lfs_stack_rcu*' -->
+      <parameter type-id='type-id-18' name='s' filepath='src/rculfstack.c' line='42' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_node_init_rcu(cds_lfs_node_rcu*) -->
+    <function-decl name='cds_lfs_node_init_rcu' mangled-name='cds_lfs_node_init_rcu' filepath='src/rculfstack.c' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_node_init_rcu'>
+      <!-- parameter of type 'cds_lfs_node_rcu*' -->
+      <parameter type-id='type-id-16' name='node' filepath='src/rculfstack.c' line='37' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='lfstack.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfs_head -->
+    <class-decl name='cds_lfs_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='69' column='1' id='type-id-19'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node cds_lfs_head::node -->
+        <var-decl name='node' type-id='type-id-20' visibility='default' filepath='../include/urcu/lfstack.h' line='70' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_lfs_node -->
+    <class-decl name='cds_lfs_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='59' column='1' id='type-id-20'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node* cds_lfs_node::next -->
+        <var-decl name='next' type-id='type-id-21' visibility='default' filepath='../include/urcu/lfstack.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfs_node* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-21'/>
+    <!-- cds_lfs_head* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-22'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='87' column='1' id='type-id-23'>
+      <data-member access='private'>
+        <!-- __cds_lfs_stack* __anonymous_union__::_s -->
+        <var-decl name='_s' type-id='type-id-24' visibility='default' filepath='../include/urcu/lfstack.h' line='88' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_lfs_stack* __anonymous_union__::s -->
+        <var-decl name='s' type-id='type-id-25' visibility='default' filepath='../include/urcu/lfstack.h' line='89' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __cds_lfs_stack -->
+    <class-decl name='__cds_lfs_stack' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='73' column='1' id='type-id-26'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_head* __cds_lfs_stack::head -->
+        <var-decl name='head' type-id='type-id-22' visibility='default' filepath='../include/urcu/lfstack.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __cds_lfs_stack* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-24'/>
+    <!-- struct cds_lfs_stack -->
+    <class-decl name='cds_lfs_stack' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='77' column='1' id='type-id-27'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_head* cds_lfs_stack::head -->
+        <var-decl name='head' type-id='type-id-22' visibility='default' filepath='../include/urcu/lfstack.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_lfs_stack::lock -->
+        <var-decl name='lock' type-id='type-id-28' visibility='default' filepath='../include/urcu/lfstack.h' line='79' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-29'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-30' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-31' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-32' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-30'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-3' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-3' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-3' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-34' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-34' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-35' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-33'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-34'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-37' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-37' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-37'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-36' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-35'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-38'/>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-39'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-38' size-in-bits='320' id='type-id-31'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-39' id='type-id-40'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-32'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-29' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-28'/>
+    <!-- cds_lfs_stack* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-25'/>
+    <!-- typedef __anonymous_union__ cds_lfs_stack_ptr_t -->
+    <typedef-decl name='cds_lfs_stack_ptr_t' type-id='type-id-23' filepath='../include/urcu/lfstack.h' line='90' column='1' id='type-id-41'/>
+    <!-- cds_lfs_head* __cds_lfs_pop_all(cds_lfs_stack_ptr_t) -->
+    <function-decl name='__cds_lfs_pop_all' mangled-name='__cds_lfs_pop_all' filepath='src/lfstack.c' line='88' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_lfs_pop_all'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='88' column='1'/>
+      <!-- cds_lfs_head* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_lfs_node* __cds_lfs_pop(cds_lfs_stack_ptr_t) -->
+    <function-decl name='__cds_lfs_pop' mangled-name='__cds_lfs_pop' filepath='src/lfstack.c' line='83' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_lfs_pop'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='83' column='1'/>
+      <!-- cds_lfs_node* -->
+      <return type-id='type-id-21'/>
+    </function-decl>
+    <!-- void cds_lfs_pop_unlock(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_unlock' mangled-name='cds_lfs_pop_unlock' filepath='src/lfstack.c' line='78' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_unlock'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_pop_lock(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_lock' mangled-name='cds_lfs_pop_lock' filepath='src/lfstack.c' line='73' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_lock'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- cds_lfs_head* cds_lfs_pop_all_blocking(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_all_blocking' mangled-name='cds_lfs_pop_all_blocking' filepath='src/lfstack.c' line='68' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_all_blocking'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='68' column='1'/>
+      <!-- cds_lfs_head* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_lfs_node* cds_lfs_pop_blocking(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_blocking' mangled-name='cds_lfs_pop_blocking' filepath='src/lfstack.c' line='63' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_blocking'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='63' column='1'/>
+      <!-- cds_lfs_node* -->
+      <return type-id='type-id-21'/>
+    </function-decl>
+    <!-- bool -->
+    <type-decl name='bool' size-in-bits='8' id='type-id-42'/>
+    <!-- bool cds_lfs_push(cds_lfs_stack_ptr_t, cds_lfs_node*) -->
+    <function-decl name='cds_lfs_push' mangled-name='cds_lfs_push' filepath='src/lfstack.c' line='58' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_push'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='58' column='1'/>
+      <!-- parameter of type 'cds_lfs_node*' -->
+      <parameter type-id='type-id-21' name='node' filepath='src/lfstack.c' line='58' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-42'/>
+    </function-decl>
+    <!-- bool cds_lfs_empty(cds_lfs_stack_ptr_t) -->
+    <function-decl name='cds_lfs_empty' mangled-name='cds_lfs_empty' filepath='src/lfstack.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_empty'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='53' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-42'/>
+    </function-decl>
+    <!-- void __cds_lfs_init(__cds_lfs_stack*) -->
+    <function-decl name='__cds_lfs_init' mangled-name='__cds_lfs_init' filepath='src/lfstack.c' line='48' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_lfs_init'>
+      <!-- parameter of type '__cds_lfs_stack*' -->
+      <parameter type-id='type-id-24' name='s' filepath='src/lfstack.c' line='48' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_destroy(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_destroy' mangled-name='cds_lfs_destroy' filepath='src/lfstack.c' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_destroy'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_init(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_init' mangled-name='cds_lfs_init' filepath='src/lfstack.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_init'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_node_init(cds_lfs_node*) -->
+    <function-decl name='cds_lfs_node_init' mangled-name='cds_lfs_node_init' filepath='src/lfstack.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_node_init'>
+      <!-- parameter of type 'cds_lfs_node*' -->
+      <parameter type-id='type-id-21' name='node' filepath='src/lfstack.c' line='33' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='workqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct urcu_workqueue -->
+    <class-decl name='urcu_workqueue' size-in-bits='2048' is-struct='yes' visibility='default' filepath='src/workqueue.c' line='54' column='1' id='type-id-43'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail urcu_workqueue::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-44' visibility='default' filepath='src/workqueue.c' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head urcu_workqueue::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-45' visibility='default' filepath='src/workqueue.c' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int urcu_workqueue::flags -->
+        <var-decl name='flags' type-id='type-id-39' visibility='default' filepath='src/workqueue.c' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t urcu_workqueue::futex -->
+        <var-decl name='futex' type-id='type-id-46' visibility='default' filepath='src/workqueue.c' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int urcu_workqueue::qlen -->
+        <var-decl name='qlen' type-id='type-id-39' visibility='default' filepath='src/workqueue.c' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t urcu_workqueue::tid -->
+        <var-decl name='tid' type-id='type-id-47' visibility='default' filepath='src/workqueue.c' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int urcu_workqueue::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-3' visibility='default' filepath='src/workqueue.c' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int urcu_workqueue::loop_count -->
+        <var-decl name='loop_count' type-id='type-id-39' visibility='default' filepath='src/workqueue.c' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void* urcu_workqueue::priv -->
+        <var-decl name='priv' type-id='type-id-48' visibility='default' filepath='src/workqueue.c' line='69' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='896'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::grace_period_fct -->
+        <var-decl name='grace_period_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='960'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::initialize_worker_fct -->
+        <var-decl name='initialize_worker_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='71' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::finalize_worker_fct -->
+        <var-decl name='finalize_worker_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1088'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_before_pause_fct -->
+        <var-decl name='worker_before_pause_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_after_resume_fct -->
+        <var-decl name='worker_after_resume_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1216'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_before_wait_fct -->
+        <var-decl name='worker_before_wait_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1280'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_after_wake_up_fct -->
+        <var-decl name='worker_after_wake_up_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='76' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-44'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-10' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-45'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-28' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-50'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-50' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-46'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-39' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-47'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-6' size-in-bits='64' id='type-id-48'/>
+    <!-- urcu_workqueue* -->
+    <pointer-type-def type-id='type-id-43' size-in-bits='64' id='type-id-51'/>
+    <!-- void (urcu_workqueue*, void*)* -->
+    <pointer-type-def type-id='type-id-52' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_workqueue_create_worker(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_create_worker' mangled-name='urcu_workqueue_create_worker' filepath='src/workqueue.c' line='455' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_create_worker'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='455' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_resume_worker(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_resume_worker' mangled-name='urcu_workqueue_resume_worker' filepath='src/workqueue.c' line='448' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_resume_worker'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='448' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_pause_worker(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_pause_worker' mangled-name='urcu_workqueue_pause_worker' filepath='src/workqueue.c' line='437' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_pause_worker'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='448' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_flush_queued_work(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_flush_queued_work' mangled-name='urcu_workqueue_flush_queued_work' filepath='src/workqueue.c' line='424' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_flush_queued_work'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='455' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- struct urcu_workqueue_completion -->
+    <class-decl name='urcu_workqueue_completion' size-in-bits='128' is-struct='yes' visibility='default' filepath='src/workqueue.c' line='79' column='1' id='type-id-53'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int urcu_workqueue_completion::barrier_count -->
+        <var-decl name='barrier_count' type-id='type-id-3' visibility='default' filepath='src/workqueue.c' line='80' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- int32_t urcu_workqueue_completion::futex -->
+        <var-decl name='futex' type-id='type-id-46' visibility='default' filepath='src/workqueue.c' line='81' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- urcu_ref urcu_workqueue_completion::ref -->
+        <var-decl name='ref' type-id='type-id-54' visibility='default' filepath='src/workqueue.c' line='82' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct urcu_ref -->
+    <class-decl name='urcu_ref' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/ref.h' line='23' column='1' id='type-id-54'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- long int urcu_ref::refcount -->
+        <var-decl name='refcount' type-id='type-id-32' visibility='default' filepath='../include/urcu/ref.h' line='24' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_workqueue_completion* -->
+    <pointer-type-def type-id='type-id-53' size-in-bits='64' id='type-id-55'/>
+    <!-- void urcu_workqueue_queue_completion(urcu_workqueue*, urcu_workqueue_completion*) -->
+    <function-decl name='urcu_workqueue_queue_completion' mangled-name='urcu_workqueue_queue_completion' filepath='src/workqueue.c' line='407' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_queue_completion'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='407' column='1'/>
+      <!-- parameter of type 'urcu_workqueue_completion*' -->
+      <parameter type-id='type-id-55' name='completion' filepath='src/workqueue.c' line='408' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_wait_completion(urcu_workqueue_completion*) -->
+    <function-decl name='urcu_workqueue_wait_completion' mangled-name='urcu_workqueue_wait_completion' filepath='src/workqueue.c' line='394' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_wait_completion'>
+      <!-- parameter of type 'urcu_workqueue_completion*' -->
+      <parameter type-id='type-id-55' name='completion' filepath='src/workqueue.c' line='394' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_destroy_completion(urcu_workqueue_completion*) -->
+    <function-decl name='urcu_workqueue_destroy_completion' mangled-name='urcu_workqueue_destroy_completion' filepath='src/workqueue.c' line='389' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_destroy_completion'>
+      <!-- parameter of type 'urcu_workqueue_completion*' -->
+      <parameter type-id='type-id-55' name='completion' filepath='src/workqueue.c' line='389' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- urcu_workqueue_completion* urcu_workqueue_create_completion() -->
+    <function-decl name='urcu_workqueue_create_completion' mangled-name='urcu_workqueue_create_completion' filepath='src/workqueue.c' line='377' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_create_completion'>
+      <!-- urcu_workqueue_completion* -->
+      <return type-id='type-id-55'/>
+    </function-decl>
+    <!-- struct urcu_work -->
+    <class-decl name='urcu_work' size-in-bits='128' is-struct='yes' visibility='default' filepath='src/workqueue.h' line='53' column='1' id='type-id-56'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node urcu_work::next -->
+        <var-decl name='next' type-id='type-id-8' visibility='default' filepath='src/workqueue.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (urcu_work*)* urcu_work::func -->
+        <var-decl name='func' type-id='type-id-57' visibility='default' filepath='src/workqueue.h' line='55' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_work* -->
+    <pointer-type-def type-id='type-id-56' size-in-bits='64' id='type-id-58'/>
+    <!-- void (urcu_work*)* -->
+    <pointer-type-def type-id='type-id-59' size-in-bits='64' id='type-id-57'/>
+    <!-- void urcu_workqueue_queue_work(urcu_workqueue*, urcu_work*, void (urcu_work*)*) -->
+    <function-decl name='urcu_workqueue_queue_work' mangled-name='urcu_workqueue_queue_work' filepath='src/workqueue.c' line='343' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_queue_work'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='343' column='1'/>
+      <!-- parameter of type 'urcu_work*' -->
+      <parameter type-id='type-id-58' name='work' filepath='src/workqueue.c' line='344' column='1'/>
+      <!-- parameter of type 'void (urcu_work*)*' -->
+      <parameter type-id='type-id-57' name='func' filepath='src/workqueue.c' line='345' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_destroy(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_destroy' mangled-name='urcu_workqueue_destroy' filepath='src/workqueue.c' line='331' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_destroy'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='455' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- urcu_workqueue* urcu_workqueue_create(unsigned long int, int, void*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*) -->
+    <function-decl name='urcu_workqueue_create' mangled-name='urcu_workqueue_create' filepath='src/workqueue.c' line='266' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_create'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='flags' filepath='src/workqueue.c' line='266' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='cpu_affinity' filepath='src/workqueue.c' line='267' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='priv' filepath='src/workqueue.c' line='267' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='grace_period_fct' filepath='src/workqueue.c' line='268' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='initialize_worker_fct' filepath='src/workqueue.c' line='269' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='finalize_worker_fct' filepath='src/workqueue.c' line='270' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_before_wait_fct' filepath='src/workqueue.c' line='271' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_after_wake_up_fct' filepath='src/workqueue.c' line='272' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_before_pause_fct' filepath='src/workqueue.c' line='273' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_after_resume_fct' filepath='src/workqueue.c' line='274' column='1'/>
+      <!-- urcu_workqueue* -->
+      <return type-id='type-id-51'/>
+    </function-decl>
+    <!-- void (urcu_work*) -->
+    <function-type size-in-bits='64' id='type-id-59'>
+      <!-- parameter of type 'urcu_work*' -->
+      <parameter type-id='type-id-58'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (urcu_workqueue*, void*) -->
+    <function-type size-in-bits='64' id='type-id-52'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfht -->
+    <class-decl name='cds_lfht' size-in-bits='5248' is-struct='yes' visibility='default' filepath='../src/rculfhash-internal.h' line='70' column='1' id='type-id-60'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int cds_lfht::max_nr_buckets -->
+        <var-decl name='max_nr_buckets' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- const cds_lfht_mm_type* cds_lfht::mm -->
+        <var-decl name='mm' type-id='type-id-61' visibility='default' filepath='../src/rculfhash-internal.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- const rcu_flavor_struct* cds_lfht::flavor -->
+        <var-decl name='flavor' type-id='type-id-62' visibility='default' filepath='../src/rculfhash-internal.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- long int cds_lfht::count -->
+        <var-decl name='count' type-id='type-id-32' visibility='default' filepath='../src/rculfhash-internal.h' line='76' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- pthread_mutex_t cds_lfht::resize_mutex -->
+        <var-decl name='resize_mutex' type-id='type-id-28' visibility='default' filepath='../src/rculfhash-internal.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- pthread_attr_t* cds_lfht::resize_attr -->
+        <var-decl name='resize_attr' type-id='type-id-63' visibility='default' filepath='../src/rculfhash-internal.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- unsigned int cds_lfht::in_progress_destroy -->
+        <var-decl name='in_progress_destroy' type-id='type-id-33' visibility='default' filepath='../src/rculfhash-internal.h' line='87' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- unsigned long int cds_lfht::resize_target -->
+        <var-decl name='resize_target' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='88' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- int cds_lfht::resize_initiated -->
+        <var-decl name='resize_initiated' type-id='type-id-3' visibility='default' filepath='../src/rculfhash-internal.h' line='89' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='800'>
+        <!-- int cds_lfht::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='../src/rculfhash-internal.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- unsigned long int cds_lfht::min_alloc_buckets_order -->
+        <var-decl name='min_alloc_buckets_order' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='95' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='896'>
+        <!-- unsigned long int cds_lfht::min_nr_alloc_buckets -->
+        <var-decl name='min_nr_alloc_buckets' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='96' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='960'>
+        <!-- ht_items_count* cds_lfht::split_count -->
+        <var-decl name='split_count' type-id='type-id-64' visibility='default' filepath='../src/rculfhash-internal.h' line='97' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- unsigned long int cds_lfht::size -->
+        <var-decl name='size' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='102' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1088'>
+        <!-- cds_lfht_node* (cds_lfht*, unsigned long int)* cds_lfht::bucket_at -->
+        <var-decl name='bucket_at' type-id='type-id-65' visibility='default' filepath='../src/rculfhash-internal.h' line='107' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-66' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_lfht_mm_type -->
+    <class-decl name='cds_lfht_mm_type' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/rculfhash.h' line='120' column='1' id='type-id-67'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfht* (unsigned long int, unsigned long int)* cds_lfht_mm_type::alloc_cds_lfht -->
+        <var-decl name='alloc_cds_lfht' type-id='type-id-68' visibility='default' filepath='../include/urcu/rculfhash.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (cds_lfht*, unsigned long int)* cds_lfht_mm_type::alloc_bucket_table -->
+        <var-decl name='alloc_bucket_table' type-id='type-id-69' visibility='default' filepath='../include/urcu/rculfhash.h' line='123' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (cds_lfht*, unsigned long int)* cds_lfht_mm_type::free_bucket_table -->
+        <var-decl name='free_bucket_table' type-id='type-id-69' visibility='default' filepath='../include/urcu/rculfhash.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- cds_lfht_node* (cds_lfht*, unsigned long int)* cds_lfht_mm_type::bucket_at -->
+        <var-decl name='bucket_at' type-id='type-id-65' visibility='default' filepath='../include/urcu/rculfhash.h' line='125' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfht* -->
+    <pointer-type-def type-id='type-id-60' size-in-bits='64' id='type-id-70'/>
+    <!-- cds_lfht* (unsigned long int, unsigned long int)* -->
+    <pointer-type-def type-id='type-id-71' size-in-bits='64' id='type-id-68'/>
+    <!-- void (cds_lfht*, unsigned long int)* -->
+    <pointer-type-def type-id='type-id-72' size-in-bits='64' id='type-id-69'/>
+    <!-- struct cds_lfht_node -->
+    <class-decl name='cds_lfht_node' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/rculfhash.h' line='63' column='1' id='type-id-73'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfht_node* cds_lfht_node::next -->
+        <var-decl name='next' type-id='type-id-74' visibility='default' filepath='../include/urcu/rculfhash.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- unsigned long int cds_lfht_node::reverse_hash -->
+        <var-decl name='reverse_hash' type-id='type-id-39' visibility='default' filepath='../include/urcu/rculfhash.h' line='65' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfht_node* -->
+    <pointer-type-def type-id='type-id-73' size-in-bits='64' id='type-id-74'/>
+    <!-- cds_lfht_node* (cds_lfht*, unsigned long int)* -->
+    <pointer-type-def type-id='type-id-75' size-in-bits='64' id='type-id-65'/>
+    <!-- const cds_lfht_mm_type -->
+    <qualified-type-def type-id='type-id-67' const='yes' id='type-id-76'/>
+    <!-- const cds_lfht_mm_type* -->
+    <pointer-type-def type-id='type-id-76' size-in-bits='64' id='type-id-61'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-77'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-79' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-5' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-80' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-81' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-81' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-82' size-in-bits='64' id='type-id-78'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-83' size-in-bits='64' id='type-id-79'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-84' size-in-bits='64' id='type-id-85'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-86' size-in-bits='64' id='type-id-80'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-87'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-85' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-85' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-85' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-48' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-87' size-in-bits='64' id='type-id-88'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-89' size-in-bits='64' id='type-id-81'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-77' const='yes' id='type-id-90'/>
+    <!-- const rcu_flavor_struct* -->
+    <pointer-type-def type-id='type-id-90' size-in-bits='64' id='type-id-62'/>
+    <!-- union pthread_attr_t -->
+    <union-decl name='pthread_attr_t' size-in-bits='448' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='56' column='1' id='type-id-91'>
+      <data-member access='private'>
+        <!-- char pthread_attr_t::__size[56] -->
+        <var-decl name='__size' type-id='type-id-92' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int pthread_attr_t::__align -->
+        <var-decl name='__align' type-id='type-id-32' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='59' column='1'/>
+      </data-member>
+    </union-decl>
+
+    <!-- char[56] -->
+    <array-type-def dimensions='1' type-id='type-id-38' size-in-bits='448' id='type-id-92'>
+      <!-- <anonymous range>[56] -->
+      <subrange length='56' type-id='type-id-39' id='type-id-93'/>
+
+    </array-type-def>
+    <!-- typedef pthread_attr_t pthread_attr_t -->
+    <typedef-decl name='pthread_attr_t' type-id='type-id-91' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='62' column='1' id='type-id-94'/>
+    <!-- pthread_attr_t* -->
+    <pointer-type-def type-id='type-id-94' size-in-bits='64' id='type-id-63'/>
+    <!-- struct ht_items_count -->
+    <class-decl name='ht_items_count' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/rculfhash.c' line='338' column='1' id='type-id-95'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int ht_items_count::add -->
+        <var-decl name='add' type-id='type-id-39' visibility='default' filepath='src/rculfhash.c' line='339' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- unsigned long int ht_items_count::del -->
+        <var-decl name='del' type-id='type-id-39' visibility='default' filepath='src/rculfhash.c' line='339' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- ht_items_count* -->
+    <pointer-type-def type-id='type-id-95' size-in-bits='64' id='type-id-64'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='4096' is-anonymous='yes' visibility='default' filepath='../src/rculfhash-internal.h' line='113' column='1' id='type-id-66'>
+      <data-member access='private'>
+        <!-- cds_lfht_node* __anonymous_union__::tbl_order[64] -->
+        <var-decl name='tbl_order' type-id='type-id-96' visibility='default' filepath='../src/rculfhash-internal.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_lfht_node* __anonymous_union__::tbl_chunk[1] -->
+        <var-decl name='tbl_chunk' type-id='type-id-97' visibility='default' filepath='../src/rculfhash-internal.h' line='134' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_lfht_node* __anonymous_union__::tbl_mmap -->
+        <var-decl name='tbl_mmap' type-id='type-id-74' visibility='default' filepath='../src/rculfhash-internal.h' line='140' column='1'/>
+      </data-member>
+    </union-decl>
+
+    <!-- cds_lfht_node*[64] -->
+    <array-type-def dimensions='1' type-id='type-id-74' size-in-bits='4096' id='type-id-96'>
+      <!-- <anonymous range>[64] -->
+      <subrange length='64' type-id='type-id-39' id='type-id-98'/>
+
+    </array-type-def>
+
+    <!-- cds_lfht_node*[1] -->
+    <array-type-def dimensions='1' type-id='type-id-74' size-in-bits='64' id='type-id-97'>
+      <!-- <anonymous range>[1] -->
+      <subrange length='1' type-id='type-id-39' id='type-id-99'/>
+
+    </array-type-def>
+    <!-- void cds_lfht_resize(cds_lfht*, unsigned long int) -->
+    <function-decl name='cds_lfht_resize' mangled-name='cds_lfht_resize' filepath='src/rculfhash.c' line='2028' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_resize'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='2028' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='new_size' filepath='src/rculfhash.c' line='2028' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- long int* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-100'/>
+    <!-- unsigned long int* -->
+    <pointer-type-def type-id='type-id-39' size-in-bits='64' id='type-id-101'/>
+    <!-- void cds_lfht_count_nodes(cds_lfht*, long int*, unsigned long int*, long int*) -->
+    <function-decl name='cds_lfht_count_nodes' mangled-name='cds_lfht_count_nodes' filepath='src/rculfhash.c' line='1906' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_count_nodes'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1906' column='1'/>
+      <!-- parameter of type 'long int*' -->
+      <parameter type-id='type-id-100' name='approx_before' filepath='src/rculfhash.c' line='1907' column='1'/>
+      <!-- parameter of type 'unsigned long int*' -->
+      <parameter type-id='type-id-101' name='count' filepath='src/rculfhash.c' line='1908' column='1'/>
+      <!-- parameter of type 'long int*' -->
+      <parameter type-id='type-id-100' name='approx_after' filepath='src/rculfhash.c' line='1909' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- pthread_attr_t** -->
+    <pointer-type-def type-id='type-id-63' size-in-bits='64' id='type-id-102'/>
+    <!-- int cds_lfht_destroy(cds_lfht*, pthread_attr_t**) -->
+    <function-decl name='cds_lfht_destroy' mangled-name='cds_lfht_destroy' filepath='src/rculfhash.c' line='1881' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_destroy'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1881' column='1'/>
+      <!-- parameter of type 'pthread_attr_t**' -->
+      <parameter type-id='type-id-102' name='attr' filepath='src/rculfhash.c' line='1881' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- const cds_lfht_node -->
+    <qualified-type-def type-id='type-id-73' const='yes' id='type-id-103'/>
+    <!-- const cds_lfht_node* -->
+    <pointer-type-def type-id='type-id-103' size-in-bits='64' id='type-id-104'/>
+    <!-- int cds_lfht_is_node_deleted(const cds_lfht_node*) -->
+    <function-decl name='cds_lfht_is_node_deleted' mangled-name='cds_lfht_is_node_deleted' filepath='src/rculfhash.c' line='1838' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_is_node_deleted'>
+      <!-- parameter of type 'const cds_lfht_node*' -->
+      <parameter type-id='type-id-104' name='node' filepath='src/rculfhash.c' line='1838' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- int cds_lfht_del(cds_lfht*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_del' mangled-name='cds_lfht_del' filepath='src/rculfhash.c' line='1822' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_del'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1822' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1822' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- struct cds_lfht_iter -->
+    <class-decl name='cds_lfht_iter' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/rculfhash.h' line='69' column='1' id='type-id-105'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfht_node* cds_lfht_iter::node -->
+        <var-decl name='node' type-id='type-id-74' visibility='default' filepath='../include/urcu/rculfhash.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_lfht_node* cds_lfht_iter::next -->
+        <var-decl name='next' type-id='type-id-74' visibility='default' filepath='../include/urcu/rculfhash.h' line='70' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfht_iter* -->
+    <pointer-type-def type-id='type-id-105' size-in-bits='64' id='type-id-106'/>
+    <!-- int (cds_lfht_node*, void*)* -->
+    <pointer-type-def type-id='type-id-107' size-in-bits='64' id='type-id-108'/>
+    <!-- typedef int (cds_lfht_node*, void*)* cds_lfht_match_fct -->
+    <typedef-decl name='cds_lfht_match_fct' type-id='type-id-108' filepath='../include/urcu/rculfhash.h' line='98' column='1' id='type-id-109'/>
+    <!-- int cds_lfht_replace(cds_lfht*, cds_lfht_iter*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_replace' mangled-name='cds_lfht_replace' filepath='src/rculfhash.c' line='1801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_replace'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1801' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-106' name='old_iter' filepath='src/rculfhash.c' line='1802' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1803' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-109' name='match' filepath='src/rculfhash.c' line='1804' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1805' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='new_node' filepath='src/rculfhash.c' line='1806' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- cds_lfht_node* cds_lfht_add_replace(cds_lfht*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_add_replace' mangled-name='cds_lfht_add_replace' filepath='src/rculfhash.c' line='1778' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_add_replace'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1778' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1779' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-109' name='match' filepath='src/rculfhash.c' line='1780' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1781' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1782' column='1'/>
+      <!-- cds_lfht_node* -->
+      <return type-id='type-id-74'/>
+    </function-decl>
+    <!-- cds_lfht_node* cds_lfht_add_unique(cds_lfht*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_add_unique' mangled-name='cds_lfht_add_unique' filepath='src/rculfhash.c' line='1761' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_add_unique'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1778' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1779' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-109' name='match' filepath='src/rculfhash.c' line='1780' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1781' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1782' column='1'/>
+      <!-- cds_lfht_node* -->
+      <return type-id='type-id-74'/>
+    </function-decl>
+    <!-- void cds_lfht_add(cds_lfht*, unsigned long int, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_add' mangled-name='cds_lfht_add' filepath='src/rculfhash.c' line='1750' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_add'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1750' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1750' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1751' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_first(cds_lfht*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_first' mangled-name='cds_lfht_first' filepath='src/rculfhash.c' line='1739' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_first'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1739' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-106' name='iter' filepath='src/rculfhash.c' line='1739' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_next(cds_lfht*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_next' mangled-name='cds_lfht_next' filepath='src/rculfhash.c' line='1715' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_next'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1715' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-106' name='iter' filepath='src/rculfhash.c' line='1716' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_next_duplicate(cds_lfht*, cds_lfht_match_fct, void*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_next_duplicate' mangled-name='cds_lfht_next_duplicate' filepath='src/rculfhash.c' line='1680' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_next_duplicate'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1680' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-109' name='match' filepath='src/rculfhash.c' line='1681' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1682' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-106' name='iter' filepath='src/rculfhash.c' line='1682' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_lookup(cds_lfht*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_lookup' mangled-name='cds_lfht_lookup' filepath='src/rculfhash.c' line='1640' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_lookup'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1640' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1640' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-109' name='match' filepath='src/rculfhash.c' line='1641' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1641' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-106' name='iter' filepath='src/rculfhash.c' line='1642' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- cds_lfht* _cds_lfht_new(unsigned long int, unsigned long int, unsigned long int, int, const cds_lfht_mm_type*, const rcu_flavor_struct*, pthread_attr_t*) -->
+    <function-decl name='_cds_lfht_new' mangled-name='_cds_lfht_new' filepath='src/rculfhash.c' line='1581' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_cds_lfht_new'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='init_size' filepath='src/rculfhash.c' line='1581' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='min_nr_alloc_buckets' filepath='src/rculfhash.c' line='1582' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='max_nr_buckets' filepath='src/rculfhash.c' line='1583' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/rculfhash.c' line='1584' column='1'/>
+      <!-- parameter of type 'const cds_lfht_mm_type*' -->
+      <parameter type-id='type-id-61' name='mm' filepath='src/rculfhash.c' line='1585' column='1'/>
+      <!-- parameter of type 'const rcu_flavor_struct*' -->
+      <parameter type-id='type-id-62' name='flavor' filepath='src/rculfhash.c' line='1586' column='1'/>
+      <!-- parameter of type 'pthread_attr_t*' -->
+      <parameter type-id='type-id-63' name='attr' filepath='src/rculfhash.c' line='1587' column='1'/>
+      <!-- cds_lfht* -->
+      <return type-id='type-id-70'/>
+    </function-decl>
+    <!-- int cds_lfht_get_count_order_ulong(unsigned long int) -->
+    <function-decl name='cds_lfht_get_count_order_ulong' mangled-name='cds_lfht_get_count_order_ulong' filepath='src/rculfhash.c' line='598' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_get_count_order_ulong'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='x' filepath='src/rculfhash.c' line='598' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- unsigned int cds_lfht_fls_ulong(unsigned long int) -->
+    <function-decl name='cds_lfht_fls_ulong' mangled-name='cds_lfht_fls_ulong' filepath='src/rculfhash.c' line='572' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_fls_ulong'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='x' filepath='src/rculfhash.c' line='572' column='1'/>
+      <!-- unsigned int -->
+      <return type-id='type-id-33'/>
+    </function-decl>
+    <!-- cds_lfht* (unsigned long int, unsigned long int) -->
+    <function-type size-in-bits='64' id='type-id-71'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- cds_lfht* -->
+      <return type-id='type-id-70'/>
+    </function-type>
+    <!-- cds_lfht_node* (cds_lfht*, unsigned long int) -->
+    <function-type size-in-bits='64' id='type-id-75'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- cds_lfht_node* -->
+      <return type-id='type-id-74'/>
+    </function-type>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-83'>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-type>
+    <!-- int (cds_lfht_node*, void*) -->
+    <function-type size-in-bits='64' id='type-id-107'>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-82'>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (cds_lfht*, unsigned long int) -->
+    <function-type size-in-bits='64' id='type-id-72'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-89'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-88'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-86'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-85'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-84'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash-mm-order.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- const cds_lfht_mm_type cds_lfht_mm_order -->
+    <var-decl name='cds_lfht_mm_order' type-id='type-id-76' mangled-name='cds_lfht_mm_order' visibility='default' filepath='../include/urcu/rculfhash.h' line='129' column='1' elf-symbol-id='cds_lfht_mm_order'/>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash-mm-chunk.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- const cds_lfht_mm_type cds_lfht_mm_chunk -->
+    <var-decl name='cds_lfht_mm_chunk' type-id='type-id-76' mangled-name='cds_lfht_mm_chunk' visibility='default' filepath='../include/urcu/rculfhash.h' line='130' column='1' elf-symbol-id='cds_lfht_mm_chunk'/>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash-mm-mmap.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- const cds_lfht_mm_type cds_lfht_mm_mmap -->
+    <var-decl name='cds_lfht_mm_mmap' type-id='type-id-76' mangled-name='cds_lfht_mm_mmap' visibility='default' filepath='../include/urcu/rculfhash.h' line='131' column='1' elf-symbol-id='cds_lfht_mm_mmap'/>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-28' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-110'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-111' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-112' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-113' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-111'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-114' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-115' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-115' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-115' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-114'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-117' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-116'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-117'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-33' size-in-bits='64' id='type-id-115'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-39' id='type-id-118'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-38' size-in-bits='384' id='type-id-112'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-39' id='type-id-119'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-113'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-110' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-120'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-120' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-121'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-122'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-123' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-124' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-32' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-123'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-32' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-124'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-122' const='yes' id='type-id-125'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-125' size-in-bits='64' id='type-id-126'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-121' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-126' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-121' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-121' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-126' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-121' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-common.so.8.xml b/extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-common.so.8.xml
new file mode 100644 (file)
index 0000000..33bf1df
--- /dev/null
@@ -0,0 +1,910 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-common.so.8'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- __cds_wfcq_dequeue_blocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_dequeue_nonblocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_dequeue_with_state_blocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_dequeue_with_state_nonblocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_with_state_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_first_blocking -->
+    <elf-symbol name='__cds_wfcq_first_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_first_nonblocking -->
+    <elf-symbol name='__cds_wfcq_first_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_init -->
+    <elf-symbol name='__cds_wfcq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_next_blocking -->
+    <elf-symbol name='__cds_wfcq_next_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_next_nonblocking -->
+    <elf-symbol name='__cds_wfcq_next_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_splice_blocking -->
+    <elf-symbol name='__cds_wfcq_splice_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_splice_nonblocking -->
+    <elf-symbol name='__cds_wfcq_splice_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfq_dequeue_blocking -->
+    <elf-symbol name='__cds_wfq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_init -->
+    <elf-symbol name='__cds_wfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_all -->
+    <elf-symbol name='__cds_wfs_pop_all' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_blocking -->
+    <elf-symbol name='__cds_wfs_pop_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_nonblocking -->
+    <elf-symbol name='__cds_wfs_pop_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_with_state_blocking -->
+    <elf-symbol name='__cds_wfs_pop_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_with_state_nonblocking -->
+    <elf-symbol name='__cds_wfs_pop_with_state_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_blocking -->
+    <elf-symbol name='cds_wfcq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_lock -->
+    <elf-symbol name='cds_wfcq_dequeue_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_unlock -->
+    <elf-symbol name='cds_wfcq_dequeue_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_with_state_blocking -->
+    <elf-symbol name='cds_wfcq_dequeue_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_destroy -->
+    <elf-symbol name='cds_wfcq_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_empty -->
+    <elf-symbol name='cds_wfcq_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_enqueue -->
+    <elf-symbol name='cds_wfcq_enqueue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_init -->
+    <elf-symbol name='cds_wfcq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_node_init -->
+    <elf-symbol name='cds_wfcq_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_splice_blocking -->
+    <elf-symbol name='cds_wfcq_splice_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_dequeue_blocking -->
+    <elf-symbol name='cds_wfq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_destroy -->
+    <elf-symbol name='cds_wfq_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_enqueue -->
+    <elf-symbol name='cds_wfq_enqueue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_init -->
+    <elf-symbol name='cds_wfq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_node_init -->
+    <elf-symbol name='cds_wfq_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_destroy -->
+    <elf-symbol name='cds_wfs_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_empty -->
+    <elf-symbol name='cds_wfs_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_first -->
+    <elf-symbol name='cds_wfs_first' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_init -->
+    <elf-symbol name='cds_wfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_next_blocking -->
+    <elf-symbol name='cds_wfs_next_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_next_nonblocking -->
+    <elf-symbol name='cds_wfs_next_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_node_init -->
+    <elf-symbol name='cds_wfs_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_all_blocking -->
+    <elf-symbol name='cds_wfs_pop_all_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_blocking -->
+    <elf-symbol name='cds_wfs_pop_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_lock -->
+    <elf-symbol name='cds_wfs_pop_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_unlock -->
+    <elf-symbol name='cds_wfs_pop_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_with_state_blocking -->
+    <elf-symbol name='cds_wfs_pop_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_push -->
+    <elf-symbol name='cds_wfs_push' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='wfqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_wfq_node -->
+    <class-decl name='cds_wfq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfqueue.h' line='48' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfq_node* cds_wfq_node::next -->
+        <var-decl name='next' type-id='type-id-2' visibility='default' filepath='../include/urcu/wfqueue.h' line='49' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfq_node* -->
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' id='type-id-2'/>
+    <!-- struct cds_wfq_queue -->
+    <class-decl name='cds_wfq_queue' size-in-bits='512' is-struct='yes' visibility='default' filepath='../include/urcu/wfqueue.h' line='52' column='1' id='type-id-3'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfq_node* cds_wfq_queue::head -->
+        <var-decl name='head' type-id='type-id-2' visibility='default' filepath='../include/urcu/wfqueue.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfq_node** cds_wfq_queue::tail -->
+        <var-decl name='tail' type-id='type-id-4' visibility='default' filepath='../include/urcu/wfqueue.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- cds_wfq_node cds_wfq_queue::dummy -->
+        <var-decl name='dummy' type-id='type-id-1' visibility='default' filepath='../include/urcu/wfqueue.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- pthread_mutex_t cds_wfq_queue::lock -->
+        <var-decl name='lock' type-id='type-id-5' visibility='default' filepath='../include/urcu/wfqueue.h' line='55' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfq_node** -->
+    <pointer-type-def type-id='type-id-2' size-in-bits='64' id='type-id-4'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-6'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-7' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-7'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-12' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-12' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-13' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-10'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-11'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-12'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-14'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-14' size-in-bits='64' id='type-id-15'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-14' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-13'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-16'/>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-17'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='320' id='type-id-8'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-17' id='type-id-18'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-9'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-6' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-5'/>
+    <!-- cds_wfq_queue* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-19'/>
+    <!-- cds_wfq_node* cds_wfq_dequeue_blocking(cds_wfq_queue*) -->
+    <function-decl name='cds_wfq_dequeue_blocking' mangled-name='cds_wfq_dequeue_blocking' filepath='src/wfqueue.c' line='59' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_dequeue_blocking'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='59' column='1'/>
+      <!-- cds_wfq_node* -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- cds_wfq_node* __cds_wfq_dequeue_blocking(cds_wfq_queue*) -->
+    <function-decl name='__cds_wfq_dequeue_blocking' mangled-name='__cds_wfq_dequeue_blocking' filepath='src/wfqueue.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfq_dequeue_blocking'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='59' column='1'/>
+      <!-- cds_wfq_node* -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-20'/>
+    <!-- void cds_wfq_enqueue(cds_wfq_queue*, cds_wfq_node*) -->
+    <function-decl name='cds_wfq_enqueue' mangled-name='cds_wfq_enqueue' filepath='src/wfqueue.c' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_enqueue'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='49' column='1'/>
+      <!-- parameter of type 'cds_wfq_node*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/wfqueue.c' line='49' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfq_destroy(cds_wfq_queue*) -->
+    <function-decl name='cds_wfq_destroy' mangled-name='cds_wfq_destroy' filepath='src/wfqueue.c' line='44' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_destroy'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='44' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfq_init(cds_wfq_queue*) -->
+    <function-decl name='cds_wfq_init' mangled-name='cds_wfq_init' filepath='src/wfqueue.c' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_init'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='44' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfq_node_init(cds_wfq_node*) -->
+    <function-decl name='cds_wfq_node_init' mangled-name='cds_wfq_node_init' filepath='src/wfqueue.c' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_node_init'>
+      <!-- parameter of type 'cds_wfq_node*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/wfqueue.c' line='34' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='wfcqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-22'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='83' column='1' id='type-id-23'>
+      <data-member access='private'>
+        <!-- __cds_wfcq_head* __anonymous_union__::_h -->
+        <var-decl name='_h' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_wfcq_head* __anonymous_union__::h -->
+        <var-decl name='h' type-id='type-id-25' visibility='default' filepath='../include/urcu/wfcqueue.h' line='85' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __cds_wfcq_head -->
+    <class-decl name='__cds_wfcq_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='68' column='1' id='type-id-26'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node __cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __cds_wfcq_head* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-24'/>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-27'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-5' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_head* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-25'/>
+    <!-- typedef __anonymous_union__ cds_wfcq_head_ptr_t -->
+    <typedef-decl name='cds_wfcq_head_ptr_t' type-id='type-id-23' filepath='../include/urcu/wfcqueue.h' line='86' column='1' id='type-id-28'/>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-29'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_tail* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- cds_wfcq_node* __cds_wfcq_next_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_node*) -->
+    <function-decl name='__cds_wfcq_next_nonblocking' mangled-name='__cds_wfcq_next_nonblocking' filepath='src/wfcqueue.c' line='178' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_next_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='179' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='180' column='1'/>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='181' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_next_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_node*) -->
+    <function-decl name='__cds_wfcq_next_blocking' mangled-name='__cds_wfcq_next_blocking' filepath='src/wfcqueue.c' line='170' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_next_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='179' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='180' column='1'/>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='181' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_first_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_first_nonblocking' mangled-name='__cds_wfcq_first_nonblocking' filepath='src/wfcqueue.c' line='163' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_first_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_first_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_first_blocking' mangled-name='__cds_wfcq_first_blocking' filepath='src/wfcqueue.c' line='156' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_first_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- unnamed&#45;enum&#45;underlying&#45;type -->
+    <type-decl name='unnamed-enum-underlying-type' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-31'/>
+    <!-- enum cds_wfcq_ret -->
+    <enum-decl name='cds_wfcq_ret' filepath='../include/urcu/wfcqueue.h' line='48' column='1' id='type-id-32'>
+      <underlying-type type-id='type-id-31'/>
+      <enumerator name='CDS_WFCQ_RET_WOULDBLOCK' value='-1'/>
+      <enumerator name='CDS_WFCQ_RET_DEST_EMPTY' value='0'/>
+      <enumerator name='CDS_WFCQ_RET_DEST_NON_EMPTY' value='1'/>
+      <enumerator name='CDS_WFCQ_RET_SRC_EMPTY' value='2'/>
+    </enum-decl>
+    <!-- cds_wfcq_ret __cds_wfcq_splice_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_splice_nonblocking' mangled-name='__cds_wfcq_splice_nonblocking' filepath='src/wfcqueue.c' line='146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_splice_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='dest_q_head' filepath='src/wfcqueue.c' line='147' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='dest_q_tail' filepath='src/wfcqueue.c' line='148' column='1'/>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='src_q_head' filepath='src/wfcqueue.c' line='149' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='src_q_tail' filepath='src/wfcqueue.c' line='150' column='1'/>
+      <!-- enum cds_wfcq_ret -->
+      <return type-id='type-id-32'/>
+    </function-decl>
+    <!-- cds_wfcq_ret __cds_wfcq_splice_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_splice_blocking' mangled-name='__cds_wfcq_splice_blocking' filepath='src/wfcqueue.c' line='136' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_splice_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='dest_q_head' filepath='src/wfcqueue.c' line='147' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='dest_q_tail' filepath='src/wfcqueue.c' line='148' column='1'/>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='src_q_head' filepath='src/wfcqueue.c' line='149' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='src_q_tail' filepath='src/wfcqueue.c' line='150' column='1'/>
+      <!-- enum cds_wfcq_ret -->
+      <return type-id='type-id-32'/>
+    </function-decl>
+    <!-- int* -->
+    <pointer-type-def type-id='type-id-10' size-in-bits='64' id='type-id-33'/>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_with_state_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, int*) -->
+    <function-decl name='__cds_wfcq_dequeue_with_state_nonblocking' mangled-name='__cds_wfcq_dequeue_with_state_nonblocking' filepath='src/wfcqueue.c' line='128' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_with_state_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='129' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='130' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfcqueue.c' line='131' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_dequeue_nonblocking' mangled-name='__cds_wfcq_dequeue_nonblocking' filepath='src/wfcqueue.c' line='121' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_with_state_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, int*) -->
+    <function-decl name='__cds_wfcq_dequeue_with_state_blocking' mangled-name='__cds_wfcq_dequeue_with_state_blocking' filepath='src/wfcqueue.c' line='113' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_with_state_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='129' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='130' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfcqueue.c' line='131' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_dequeue_blocking' mangled-name='__cds_wfcq_dequeue_blocking' filepath='src/wfcqueue.c' line='106' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_ret cds_wfcq_splice_blocking(cds_wfcq_head*, cds_wfcq_tail*, cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_splice_blocking' mangled-name='cds_wfcq_splice_blocking' filepath='src/wfcqueue.c' line='96' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_splice_blocking'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='dest_q_head' filepath='src/wfcqueue.c' line='97' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='dest_q_tail' filepath='src/wfcqueue.c' line='98' column='1'/>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='src_q_head' filepath='src/wfcqueue.c' line='99' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='src_q_tail' filepath='src/wfcqueue.c' line='100' column='1'/>
+      <!-- enum cds_wfcq_ret -->
+      <return type-id='type-id-32'/>
+    </function-decl>
+    <!-- cds_wfcq_node* cds_wfcq_dequeue_with_state_blocking(cds_wfcq_head*, cds_wfcq_tail*, int*) -->
+    <function-decl name='cds_wfcq_dequeue_with_state_blocking' mangled-name='cds_wfcq_dequeue_with_state_blocking' filepath='src/wfcqueue.c' line='88' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_with_state_blocking'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='89' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='90' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfcqueue.c' line='91' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* cds_wfcq_dequeue_blocking(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_dequeue_blocking' mangled-name='cds_wfcq_dequeue_blocking' filepath='src/wfcqueue.c' line='81' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_blocking'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='82' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='83' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- void cds_wfcq_dequeue_unlock(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_dequeue_unlock' mangled-name='cds_wfcq_dequeue_unlock' filepath='src/wfcqueue.c' line='75' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_unlock'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_dequeue_lock(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_dequeue_lock' mangled-name='cds_wfcq_dequeue_lock' filepath='src/wfcqueue.c' line='69' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_lock'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- bool -->
+    <type-decl name='bool' size-in-bits='8' id='type-id-34'/>
+    <!-- bool cds_wfcq_enqueue(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_node*) -->
+    <function-decl name='cds_wfcq_enqueue' mangled-name='cds_wfcq_enqueue' filepath='src/wfcqueue.c' line='62' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_enqueue'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='62' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='63' column='1'/>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='64' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <!-- bool cds_wfcq_empty(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_empty' mangled-name='cds_wfcq_empty' filepath='src/wfcqueue.c' line='55' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_empty'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='55' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='56' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <!-- void __cds_wfcq_init(__cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_init' mangled-name='__cds_wfcq_init' filepath='src/wfcqueue.c' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_init'>
+      <!-- parameter of type '__cds_wfcq_head*' -->
+      <parameter type-id='type-id-24' name='head' filepath='src/wfcqueue.c' line='49' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='50' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_destroy(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_destroy' mangled-name='cds_wfcq_destroy' filepath='src/wfcqueue.c' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_destroy'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_init(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_init' mangled-name='cds_wfcq_init' filepath='src/wfcqueue.c' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_init'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_node_init(cds_wfcq_node*) -->
+    <function-decl name='cds_wfcq_node_init' mangled-name='cds_wfcq_node_init' filepath='src/wfcqueue.c' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_node_init'>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='32' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='wfstack.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_wfs_head -->
+    <class-decl name='cds_wfs_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='82' column='1' id='type-id-35'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_node cds_wfs_head::node -->
+        <var-decl name='node' type-id='type-id-36' visibility='default' filepath='../include/urcu/wfstack.h' line='83' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfs_node -->
+    <class-decl name='cds_wfs_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='72' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_node* cds_wfs_node::next -->
+        <var-decl name='next' type-id='type-id-37' visibility='default' filepath='../include/urcu/wfstack.h' line='73' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfs_node* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-37'/>
+    <!-- cds_wfs_head* -->
+    <pointer-type-def type-id='type-id-35' size-in-bits='64' id='type-id-38'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='100' column='1' id='type-id-39'>
+      <data-member access='private'>
+        <!-- __cds_wfs_stack* __anonymous_union__::_s -->
+        <var-decl name='_s' type-id='type-id-40' visibility='default' filepath='../include/urcu/wfstack.h' line='101' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_wfs_stack* __anonymous_union__::s -->
+        <var-decl name='s' type-id='type-id-41' visibility='default' filepath='../include/urcu/wfstack.h' line='102' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __cds_wfs_stack -->
+    <class-decl name='__cds_wfs_stack' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='86' column='1' id='type-id-42'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_head* __cds_wfs_stack::head -->
+        <var-decl name='head' type-id='type-id-38' visibility='default' filepath='../include/urcu/wfstack.h' line='87' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __cds_wfs_stack* -->
+    <pointer-type-def type-id='type-id-42' size-in-bits='64' id='type-id-40'/>
+    <!-- struct cds_wfs_stack -->
+    <class-decl name='cds_wfs_stack' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='90' column='1' id='type-id-43'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_head* cds_wfs_stack::head -->
+        <var-decl name='head' type-id='type-id-38' visibility='default' filepath='../include/urcu/wfstack.h' line='91' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfs_stack::lock -->
+        <var-decl name='lock' type-id='type-id-5' visibility='default' filepath='../include/urcu/wfstack.h' line='92' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfs_stack* -->
+    <pointer-type-def type-id='type-id-43' size-in-bits='64' id='type-id-41'/>
+    <!-- typedef __anonymous_union__ cds_wfs_stack_ptr_t -->
+    <typedef-decl name='cds_wfs_stack_ptr_t' type-id='type-id-39' filepath='../include/urcu/wfstack.h' line='103' column='1' id='type-id-44'/>
+    <!-- cds_wfs_head* __cds_wfs_pop_all(cds_wfs_stack_ptr_t) -->
+    <function-decl name='__cds_wfs_pop_all' mangled-name='__cds_wfs_pop_all' filepath='src/wfstack.c' line='126' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_all'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='126' column='1'/>
+      <!-- cds_wfs_head* -->
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_with_state_nonblocking(cds_wfs_stack_ptr_t, int*) -->
+    <function-decl name='__cds_wfs_pop_with_state_nonblocking' mangled-name='__cds_wfs_pop_with_state_nonblocking' filepath='src/wfstack.c' line='120' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_with_state_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='120' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfstack.c' line='121' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_nonblocking(cds_wfs_stack_ptr_t) -->
+    <function-decl name='__cds_wfs_pop_nonblocking' mangled-name='__cds_wfs_pop_nonblocking' filepath='src/wfstack.c' line='114' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='114' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_with_state_blocking(cds_wfs_stack_ptr_t, int*) -->
+    <function-decl name='__cds_wfs_pop_with_state_blocking' mangled-name='__cds_wfs_pop_with_state_blocking' filepath='src/wfstack.c' line='108' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_with_state_blocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='120' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfstack.c' line='121' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_blocking(cds_wfs_stack_ptr_t) -->
+    <function-decl name='__cds_wfs_pop_blocking' mangled-name='__cds_wfs_pop_blocking' filepath='src/wfstack.c' line='102' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_blocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='114' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- void cds_wfs_pop_unlock(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_unlock' mangled-name='cds_wfs_pop_unlock' filepath='src/wfstack.c' line='97' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_unlock'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_pop_lock(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_lock' mangled-name='cds_wfs_pop_lock' filepath='src/wfstack.c' line='92' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_lock'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_next_nonblocking(cds_wfs_node*) -->
+    <function-decl name='cds_wfs_next_nonblocking' mangled-name='cds_wfs_next_nonblocking' filepath='src/wfstack.c' line='87' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_next_nonblocking'>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='87' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_next_blocking(cds_wfs_node*) -->
+    <function-decl name='cds_wfs_next_blocking' mangled-name='cds_wfs_next_blocking' filepath='src/wfstack.c' line='82' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_next_blocking'>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='87' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_first(cds_wfs_head*) -->
+    <function-decl name='cds_wfs_first' mangled-name='cds_wfs_first' filepath='src/wfstack.c' line='77' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_first'>
+      <!-- parameter of type 'cds_wfs_head*' -->
+      <parameter type-id='type-id-38' name='head' filepath='src/wfstack.c' line='77' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_head* cds_wfs_pop_all_blocking(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_all_blocking' mangled-name='cds_wfs_pop_all_blocking' filepath='src/wfstack.c' line='72' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_all_blocking'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='72' column='1'/>
+      <!-- cds_wfs_head* -->
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_pop_with_state_blocking(cds_wfs_stack*, int*) -->
+    <function-decl name='cds_wfs_pop_with_state_blocking' mangled-name='cds_wfs_pop_with_state_blocking' filepath='src/wfstack.c' line='67' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_with_state_blocking'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='67' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfstack.c' line='67' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_pop_blocking(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_blocking' mangled-name='cds_wfs_pop_blocking' filepath='src/wfstack.c' line='61' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_blocking'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='61' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- int cds_wfs_push(cds_wfs_stack_ptr_t, cds_wfs_node*) -->
+    <function-decl name='cds_wfs_push' mangled-name='cds_wfs_push' filepath='src/wfstack.c' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_push'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='56' column='1'/>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='56' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-10'/>
+    </function-decl>
+    <!-- bool cds_wfs_empty(cds_wfs_stack_ptr_t) -->
+    <function-decl name='cds_wfs_empty' mangled-name='cds_wfs_empty' filepath='src/wfstack.c' line='51' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_empty'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='51' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <!-- void __cds_wfs_init(__cds_wfs_stack*) -->
+    <function-decl name='__cds_wfs_init' mangled-name='__cds_wfs_init' filepath='src/wfstack.c' line='46' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_init'>
+      <!-- parameter of type '__cds_wfs_stack*' -->
+      <parameter type-id='type-id-40' name='s' filepath='src/wfstack.c' line='46' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_destroy(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_destroy' mangled-name='cds_wfs_destroy' filepath='src/wfstack.c' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_destroy'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_init(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_init' mangled-name='cds_wfs_init' filepath='src/wfstack.c' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_init'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_node_init(cds_wfs_node*) -->
+    <function-decl name='cds_wfs_node_init' mangled-name='cds_wfs_node_init' filepath='src/wfstack.c' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_node_init'>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='31' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-5' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-45'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-48' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-49' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-50' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-50' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-50' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-49'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-51' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-51'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-11' size-in-bits='64' id='type-id-50'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-17' id='type-id-53'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='384' id='type-id-47'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-17' id='type-id-54'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-48'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-45' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-55'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-55' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-10' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-56'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-56' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-57'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-57' size-in-bits='64' id='type-id-58'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-59'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-60' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-61' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-9' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-60'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-9' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-61'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-59' const='yes' id='type-id-62'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-62' size-in-bits='64' id='type-id-63'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-10' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-63' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-10'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-10' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-63' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-10'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-mb.so.8.xml b/extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-mb.so.8.xml
new file mode 100644 (file)
index 0000000..5ad4e9d
--- /dev/null
@@ -0,0 +1,851 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-mb.so.8'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_barrier -->
+    <elf-symbol name='urcu_mb_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu -->
+    <elf-symbol name='urcu_mb_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_mb_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_mb_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu_before_fork -->
+    <elf-symbol name='urcu_mb_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu_data_free -->
+    <elf-symbol name='urcu_mb_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_mb_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_create_call_rcu_data -->
+    <elf-symbol name='urcu_mb_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_barrier -->
+    <elf-symbol name='urcu_mb_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_barrier_thread -->
+    <elf-symbol name='urcu_mb_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_exit -->
+    <elf-symbol name='urcu_mb_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_rcu -->
+    <elf-symbol name='urcu_mb_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_register_thread -->
+    <elf-symbol name='urcu_mb_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_unregister_thread -->
+    <elf-symbol name='urcu_mb_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_mb_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_get_call_rcu_data -->
+    <elf-symbol name='urcu_mb_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_get_call_rcu_thread -->
+    <elf-symbol name='urcu_mb_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_mb_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_mb_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_mb_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_init -->
+    <elf-symbol name='urcu_mb_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_read_lock -->
+    <elf-symbol name='urcu_mb_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_read_ongoing -->
+    <elf-symbol name='urcu_mb_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_read_unlock -->
+    <elf-symbol name='urcu_mb_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_mb_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_register_thread -->
+    <elf-symbol name='urcu_mb_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_mb_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_mb_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_synchronize_rcu -->
+    <elf-symbol name='urcu_mb_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_mb_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_unregister_thread -->
+    <elf-symbol name='urcu_mb_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_flavor -->
+    <elf-symbol name='urcu_mb_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_gp -->
+    <elf-symbol name='urcu_mb_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_reader -->
+    <elf-symbol name='urcu_mb_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='67' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='77' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-4' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-3'/>
+    <!-- urcu_gp urcu_mb_gp -->
+    <var-decl name='urcu_mb_gp' type-id='type-id-1' mangled-name='urcu_mb_gp' visibility='default' filepath='../include/urcu/static/urcu-mb.h' line='60' column='1' elf-symbol-id='urcu_mb_gp'/>
+    <!-- struct urcu_reader -->
+    <class-decl name='urcu_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='80' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char urcu_reader::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='83' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_reader::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_reader::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_reader::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='88' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- urcu_reader urcu_mb_reader -->
+    <var-decl name='urcu_mb_reader' type-id='type-id-6' mangled-name='urcu_mb_reader' visibility='default' filepath='../include/urcu/static/urcu-mb.h' line='62' column='1' elf-symbol-id='urcu_mb_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct urcu_mb_flavor -->
+    <var-decl name='urcu_mb_flavor' type-id='type-id-35' mangled-name='urcu_mb_flavor' visibility='default' filepath='../include/urcu/flavor.h' line='81' column='1' elf-symbol-id='urcu_mb_flavor'/>
+    <!-- void urcu_mb_defer_exit() -->
+    <function-decl name='urcu_mb_defer_exit' mangled-name='urcu_mb_defer_exit' filepath='src/urcu-defer-impl.h' line='467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_defer_unregister_thread() -->
+    <function-decl name='urcu_mb_defer_unregister_thread' mangled-name='urcu_mb_defer_unregister_thread' filepath='src/urcu-defer-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_defer_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_mb_defer_register_thread() -->
+    <function-decl name='urcu_mb_defer_register_thread' mangled-name='urcu_mb_defer_register_thread' filepath='src/urcu-defer-impl.h' line='427' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_mb_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_mb_defer_rcu' mangled-name='urcu_mb_defer_rcu' filepath='src/urcu-defer-impl.h' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_defer_rcu'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_defer_barrier() -->
+    <function-decl name='urcu_mb_defer_barrier' mangled-name='urcu_mb_defer_barrier' filepath='src/urcu-defer-impl.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_defer_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_defer_barrier_thread() -->
+    <function-decl name='urcu_mb_defer_barrier_thread' mangled-name='urcu_mb_defer_barrier_thread' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_defer_barrier_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_mb_unregister_rculfhash_atfork' mangled-name='urcu_mb_unregister_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_unregister_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_mb_register_rculfhash_atfork' mangled-name='urcu_mb_register_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1002' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_register_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_mb_call_rcu_after_fork_child' mangled-name='urcu_mb_call_rcu_after_fork_child' filepath='src/urcu-call-rcu-impl.h' line='960' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_call_rcu_after_fork_child'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_mb_call_rcu_after_fork_parent' mangled-name='urcu_mb_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='938' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_call_rcu_before_fork() -->
+    <function-decl name='urcu_mb_call_rcu_before_fork' mangled-name='urcu_mb_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='911' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_barrier() -->
+    <function-decl name='urcu_mb_barrier' mangled-name='urcu_mb_barrier' filepath='src/urcu-call-rcu-impl.h' line='840' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_mb_free_all_cpu_call_rcu_data' mangled-name='urcu_mb_free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='777' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-2' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_mb_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_mb_call_rcu_data_free' mangled-name='urcu_mb_call_rcu_data_free' filepath='src/urcu-call-rcu-impl.h' line='742' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_call_rcu_data_free'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='742' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_mb_call_rcu' mangled-name='urcu_mb_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='704' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='704' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='705' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_mb_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_mb_create_all_cpu_call_rcu_data' mangled-name='urcu_mb_create_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_create_all_cpu_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='626' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_mb_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_mb_set_thread_call_rcu_data' mangled-name='urcu_mb_set_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_set_thread_call_rcu_data'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='613' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_mb_get_thread_call_rcu_data' mangled-name='urcu_mb_get_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='597' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_get_thread_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_get_call_rcu_data() -->
+    <function-decl name='urcu_mb_get_call_rcu_data' mangled-name='urcu_mb_get_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_get_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_get_default_call_rcu_data() -->
+    <function-decl name='urcu_mb_get_default_call_rcu_data' mangled-name='urcu_mb_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_mb_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_mb_set_cpu_call_rcu_data' mangled-name='urcu_mb_set_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_set_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_mb_create_call_rcu_data' mangled-name='urcu_mb_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='489' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='489' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='490' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_mb_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_mb_get_call_rcu_thread' mangled-name='urcu_mb_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='471' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='471' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_mb_get_cpu_call_rcu_data' mangled-name='urcu_mb_get_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_get_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='449' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_mb_unregister_thread() -->
+    <function-decl name='urcu_mb_unregister_thread' mangled-name='urcu_mb_unregister_thread' filepath='src/urcu.c' line='546' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_register_thread() -->
+    <function-decl name='urcu_mb_register_thread' mangled-name='urcu_mb_register_thread' filepath='src/urcu.c' line='532' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_mb_read_ongoing() -->
+    <function-decl name='urcu_mb_read_ongoing' mangled-name='urcu_mb_read_ongoing' filepath='src/urcu.c' line='527' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_read_ongoing'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_mb_read_unlock() -->
+    <function-decl name='urcu_mb_read_unlock' mangled-name='urcu_mb_read_unlock' filepath='src/urcu.c' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_read_unlock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_read_lock() -->
+    <function-decl name='urcu_mb_read_lock' mangled-name='urcu_mb_read_lock' filepath='src/urcu.c' line='517' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_read_lock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_synchronize_rcu() -->
+    <function-decl name='urcu_mb_synchronize_rcu' mangled-name='urcu_mb_synchronize_rcu' filepath='src/urcu.c' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_init() -->
+    <function-decl name='urcu_mb_init' mangled-name='urcu_mb_init' filepath='src/urcu.c' line='103' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_init'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-2' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-2' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-memb.so.8.xml b/extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-memb.so.8.xml
new file mode 100644 (file)
index 0000000..ba5db9b
--- /dev/null
@@ -0,0 +1,855 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-memb.so.8'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_barrier -->
+    <elf-symbol name='urcu_memb_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu -->
+    <elf-symbol name='urcu_memb_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_memb_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_memb_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_before_fork -->
+    <elf-symbol name='urcu_memb_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_data_free -->
+    <elf-symbol name='urcu_memb_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_create_call_rcu_data -->
+    <elf-symbol name='urcu_memb_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_barrier -->
+    <elf-symbol name='urcu_memb_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_barrier_thread -->
+    <elf-symbol name='urcu_memb_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_exit -->
+    <elf-symbol name='urcu_memb_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_rcu -->
+    <elf-symbol name='urcu_memb_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_register_thread -->
+    <elf-symbol name='urcu_memb_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_unregister_thread -->
+    <elf-symbol name='urcu_memb_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_call_rcu_thread -->
+    <elf-symbol name='urcu_memb_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_init -->
+    <elf-symbol name='urcu_memb_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_lock -->
+    <elf-symbol name='urcu_memb_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_ongoing -->
+    <elf-symbol name='urcu_memb_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_unlock -->
+    <elf-symbol name='urcu_memb_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_memb_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_register_thread -->
+    <elf-symbol name='urcu_memb_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_memb_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_synchronize_rcu -->
+    <elf-symbol name='urcu_memb_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_memb_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_unregister_thread -->
+    <elf-symbol name='urcu_memb_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_flavor -->
+    <elf-symbol name='urcu_memb_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_gp -->
+    <elf-symbol name='urcu_memb_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_has_sys_membarrier -->
+    <elf-symbol name='urcu_memb_has_sys_membarrier' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_reader -->
+    <elf-symbol name='urcu_memb_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <!-- int urcu_memb_has_sys_membarrier -->
+    <var-decl name='urcu_memb_has_sys_membarrier' type-id='type-id-1' mangled-name='urcu_memb_has_sys_membarrier' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='72' column='1' elf-symbol-id='urcu_memb_has_sys_membarrier'/>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='67' column='1' id='type-id-2'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-4' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='77' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-1' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-4'/>
+    <!-- urcu_gp urcu_memb_gp -->
+    <var-decl name='urcu_memb_gp' type-id='type-id-2' mangled-name='urcu_memb_gp' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='83' column='1' elf-symbol-id='urcu_memb_gp'/>
+    <!-- struct urcu_reader -->
+    <class-decl name='urcu_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='80' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char urcu_reader::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='83' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_reader::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_reader::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_reader::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='88' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- urcu_reader urcu_memb_reader -->
+    <var-decl name='urcu_memb_reader' type-id='type-id-6' mangled-name='urcu_memb_reader' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='85' column='1' elf-symbol-id='urcu_memb_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct urcu_memb_flavor -->
+    <var-decl name='urcu_memb_flavor' type-id='type-id-35' mangled-name='urcu_memb_flavor' visibility='default' filepath='../include/urcu/flavor.h' line='81' column='1' elf-symbol-id='urcu_memb_flavor'/>
+    <!-- void urcu_memb_defer_exit() -->
+    <function-decl name='urcu_memb_defer_exit' mangled-name='urcu_memb_defer_exit' filepath='src/urcu-defer-impl.h' line='467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_unregister_thread() -->
+    <function-decl name='urcu_memb_defer_unregister_thread' mangled-name='urcu_memb_defer_unregister_thread' filepath='src/urcu-defer-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_defer_register_thread() -->
+    <function-decl name='urcu_memb_defer_register_thread' mangled-name='urcu_memb_defer_register_thread' filepath='src/urcu-defer-impl.h' line='427' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_memb_defer_rcu' mangled-name='urcu_memb_defer_rcu' filepath='src/urcu-defer-impl.h' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_rcu'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_barrier() -->
+    <function-decl name='urcu_memb_defer_barrier' mangled-name='urcu_memb_defer_barrier' filepath='src/urcu-defer-impl.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_barrier_thread() -->
+    <function-decl name='urcu_memb_defer_barrier_thread' mangled-name='urcu_memb_defer_barrier_thread' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_barrier_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_memb_unregister_rculfhash_atfork' mangled-name='urcu_memb_unregister_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_unregister_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_memb_register_rculfhash_atfork' mangled-name='urcu_memb_register_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1002' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_register_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_memb_call_rcu_after_fork_child' mangled-name='urcu_memb_call_rcu_after_fork_child' filepath='src/urcu-call-rcu-impl.h' line='960' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_after_fork_child'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_memb_call_rcu_after_fork_parent' mangled-name='urcu_memb_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='938' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_before_fork() -->
+    <function-decl name='urcu_memb_call_rcu_before_fork' mangled-name='urcu_memb_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='911' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_barrier() -->
+    <function-decl name='urcu_memb_barrier' mangled-name='urcu_memb_barrier' filepath='src/urcu-call-rcu-impl.h' line='840' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_memb_free_all_cpu_call_rcu_data' mangled-name='urcu_memb_free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='777' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-1' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_memb_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_memb_call_rcu_data_free' mangled-name='urcu_memb_call_rcu_data_free' filepath='src/urcu-call-rcu-impl.h' line='742' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_data_free'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='742' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_memb_call_rcu' mangled-name='urcu_memb_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='704' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='704' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='705' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_memb_create_all_cpu_call_rcu_data' mangled-name='urcu_memb_create_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_create_all_cpu_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='626' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_memb_set_thread_call_rcu_data' mangled-name='urcu_memb_set_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_set_thread_call_rcu_data'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='613' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_thread_call_rcu_data' mangled-name='urcu_memb_get_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='597' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_thread_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_call_rcu_data' mangled-name='urcu_memb_get_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_default_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_default_call_rcu_data' mangled-name='urcu_memb_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_memb_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_memb_set_cpu_call_rcu_data' mangled-name='urcu_memb_set_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_set_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_memb_create_call_rcu_data' mangled-name='urcu_memb_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='489' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='489' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='490' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_memb_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_memb_get_call_rcu_thread' mangled-name='urcu_memb_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='471' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='471' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_memb_get_cpu_call_rcu_data' mangled-name='urcu_memb_get_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='449' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_memb_init() -->
+    <function-decl name='urcu_memb_init' mangled-name='urcu_memb_init' filepath='src/urcu.c' line='594' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_init'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_unregister_thread() -->
+    <function-decl name='urcu_memb_unregister_thread' mangled-name='urcu_memb_unregister_thread' filepath='src/urcu.c' line='546' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_register_thread() -->
+    <function-decl name='urcu_memb_register_thread' mangled-name='urcu_memb_register_thread' filepath='src/urcu.c' line='532' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_read_ongoing() -->
+    <function-decl name='urcu_memb_read_ongoing' mangled-name='urcu_memb_read_ongoing' filepath='src/urcu.c' line='527' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_ongoing'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_read_unlock() -->
+    <function-decl name='urcu_memb_read_unlock' mangled-name='urcu_memb_read_unlock' filepath='src/urcu.c' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_unlock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_read_lock() -->
+    <function-decl name='urcu_memb_read_lock' mangled-name='urcu_memb_read_lock' filepath='src/urcu.c' line='517' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_lock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_synchronize_rcu() -->
+    <function-decl name='urcu_memb_synchronize_rcu' mangled-name='urcu_memb_synchronize_rcu' filepath='src/urcu.c' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-qsbr.so.8.xml b/extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-qsbr.so.8.xml
new file mode 100644 (file)
index 0000000..0e350cc
--- /dev/null
@@ -0,0 +1,872 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-qsbr.so.8'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_barrier -->
+    <elf-symbol name='urcu_qsbr_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu -->
+    <elf-symbol name='urcu_qsbr_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_qsbr_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_qsbr_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu_before_fork -->
+    <elf-symbol name='urcu_qsbr_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu_data_free -->
+    <elf-symbol name='urcu_qsbr_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_create_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_barrier -->
+    <elf-symbol name='urcu_qsbr_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_barrier_thread -->
+    <elf-symbol name='urcu_qsbr_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_exit -->
+    <elf-symbol name='urcu_qsbr_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_rcu -->
+    <elf-symbol name='urcu_qsbr_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_register_thread -->
+    <elf-symbol name='urcu_qsbr_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_unregister_thread -->
+    <elf-symbol name='urcu_qsbr_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_exit -->
+    <elf-symbol name='urcu_qsbr_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_get_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_get_call_rcu_thread -->
+    <elf-symbol name='urcu_qsbr_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_quiescent_state -->
+    <elf-symbol name='urcu_qsbr_quiescent_state' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_read_lock -->
+    <elf-symbol name='urcu_qsbr_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_read_ongoing -->
+    <elf-symbol name='urcu_qsbr_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_read_unlock -->
+    <elf-symbol name='urcu_qsbr_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_qsbr_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_register_thread -->
+    <elf-symbol name='urcu_qsbr_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_synchronize_rcu -->
+    <elf-symbol name='urcu_qsbr_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_thread_offline -->
+    <elf-symbol name='urcu_qsbr_thread_offline' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_thread_online -->
+    <elf-symbol name='urcu_qsbr_thread_online' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_qsbr_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_unregister_thread -->
+    <elf-symbol name='urcu_qsbr_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_flavor -->
+    <elf-symbol name='urcu_qsbr_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_gp -->
+    <elf-symbol name='urcu_qsbr_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_reader -->
+    <elf-symbol name='urcu_qsbr_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu-qsbr.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='67' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='77' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-4' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-3'/>
+    <!-- urcu_gp urcu_qsbr_gp -->
+    <var-decl name='urcu_qsbr_gp' type-id='type-id-1' mangled-name='urcu_qsbr_gp' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='63' column='1' elf-symbol-id='urcu_qsbr_gp'/>
+    <!-- struct urcu_qsbr_reader -->
+    <class-decl name='urcu_qsbr_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='65' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_qsbr_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_qsbr_reader::node -->
+        <var-decl name='node' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- int urcu_qsbr_reader::waiting -->
+        <var-decl name='waiting' type-id='type-id-4' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1216'>
+        <!-- pthread_t urcu_qsbr_reader::tid -->
+        <var-decl name='tid' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='71' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_qsbr_reader::registered -->
+        <var-decl name='registered' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='73' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-7'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-10' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-10' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-7' size-in-bits='64' id='type-id-10'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-8'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-9'/>
+    <!-- urcu_qsbr_reader urcu_qsbr_reader -->
+    <var-decl name='urcu_qsbr_reader' type-id='type-id-6' mangled-name='urcu_qsbr_reader' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='76' column='1' elf-symbol-id='urcu_qsbr_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-11'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-17'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-12'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-20'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-21' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-23' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-23'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-24'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-25' size-in-bits='64' id='type-id-22'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-14'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-27'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-29'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-30' size-in-bits='64' id='type-id-15'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-31'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-29' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-29' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-29' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-27' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-32'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-16'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-11' const='yes' id='type-id-34'/>
+    <!-- const rcu_flavor_struct urcu_qsbr_flavor -->
+    <var-decl name='urcu_qsbr_flavor' type-id='type-id-34' mangled-name='urcu_qsbr_flavor' visibility='default' filepath='../include/urcu/flavor.h' line='81' column='1' elf-symbol-id='urcu_qsbr_flavor'/>
+    <!-- void urcu_qsbr_defer_exit() -->
+    <function-decl name='urcu_qsbr_defer_exit' mangled-name='urcu_qsbr_defer_exit' filepath='src/urcu-defer-impl.h' line='467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_defer_unregister_thread() -->
+    <function-decl name='urcu_qsbr_defer_unregister_thread' mangled-name='urcu_qsbr_defer_unregister_thread' filepath='src/urcu-defer-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_defer_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int urcu_qsbr_defer_register_thread() -->
+    <function-decl name='urcu_qsbr_defer_register_thread' mangled-name='urcu_qsbr_defer_register_thread' filepath='src/urcu-defer-impl.h' line='427' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_qsbr_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_qsbr_defer_rcu' mangled-name='urcu_qsbr_defer_rcu' filepath='src/urcu-defer-impl.h' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_defer_rcu'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-29' name='fct' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='p' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_defer_barrier() -->
+    <function-decl name='urcu_qsbr_defer_barrier' mangled-name='urcu_qsbr_defer_barrier' filepath='src/urcu-defer-impl.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_defer_barrier'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_defer_barrier_thread() -->
+    <function-decl name='urcu_qsbr_defer_barrier_thread' mangled-name='urcu_qsbr_defer_barrier_thread' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_defer_barrier_thread'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_qsbr_unregister_rculfhash_atfork' mangled-name='urcu_qsbr_unregister_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_unregister_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-32' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_qsbr_register_rculfhash_atfork' mangled-name='urcu_qsbr_register_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1002' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_register_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-32' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_qsbr_call_rcu_after_fork_child' mangled-name='urcu_qsbr_call_rcu_after_fork_child' filepath='src/urcu-call-rcu-impl.h' line='960' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_call_rcu_after_fork_child'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_qsbr_call_rcu_after_fork_parent' mangled-name='urcu_qsbr_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='938' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_call_rcu_before_fork() -->
+    <function-decl name='urcu_qsbr_call_rcu_before_fork' mangled-name='urcu_qsbr_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='911' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_barrier() -->
+    <function-decl name='urcu_qsbr_barrier' mangled-name='urcu_qsbr_barrier' filepath='src/urcu-call-rcu-impl.h' line='840' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_barrier'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_qsbr_free_all_cpu_call_rcu_data' mangled-name='urcu_qsbr_free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='777' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-35'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-36' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-7' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-23' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-38' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-39'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-40' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-40'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-43'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-45'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-46'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-45' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-44'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-47'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='320' id='type-id-41'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-2' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-42'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-39' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-38'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-35' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_qsbr_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_qsbr_call_rcu_data_free' mangled-name='urcu_qsbr_call_rcu_data_free' filepath='src/urcu-call-rcu-impl.h' line='742' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_call_rcu_data_free'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='742' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_qsbr_call_rcu' mangled-name='urcu_qsbr_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='704' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-24' name='head' filepath='src/urcu-call-rcu-impl.h' line='704' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-22' name='func' filepath='src/urcu-call-rcu-impl.h' line='705' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int urcu_qsbr_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_qsbr_create_all_cpu_call_rcu_data' mangled-name='urcu_qsbr_create_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_create_all_cpu_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='626' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_qsbr_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_qsbr_set_thread_call_rcu_data' mangled-name='urcu_qsbr_set_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_set_thread_call_rcu_data'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='613' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_qsbr_get_thread_call_rcu_data' mangled-name='urcu_qsbr_get_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='597' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_get_thread_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_get_call_rcu_data() -->
+    <function-decl name='urcu_qsbr_get_call_rcu_data' mangled-name='urcu_qsbr_get_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_get_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_get_default_call_rcu_data() -->
+    <function-decl name='urcu_qsbr_get_default_call_rcu_data' mangled-name='urcu_qsbr_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_qsbr_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_qsbr_set_cpu_call_rcu_data' mangled-name='urcu_qsbr_set_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_set_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_qsbr_create_call_rcu_data' mangled-name='urcu_qsbr_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='489' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='489' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='490' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_qsbr_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_qsbr_get_call_rcu_thread' mangled-name='urcu_qsbr_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='471' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='471' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-8'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_qsbr_get_cpu_call_rcu_data' mangled-name='urcu_qsbr_get_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_get_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='449' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_qsbr_exit() -->
+    <function-decl name='urcu_qsbr_exit' mangled-name='urcu_qsbr_exit' filepath='src/urcu-qsbr.c' line='497' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_exit'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_unregister_thread() -->
+    <function-decl name='urcu_qsbr_unregister_thread' mangled-name='urcu_qsbr_unregister_thread' filepath='src/urcu-qsbr.c' line='483' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_register_thread() -->
+    <function-decl name='urcu_qsbr_register_thread' mangled-name='urcu_qsbr_register_thread' filepath='src/urcu-qsbr.c' line='470' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_thread_online() -->
+    <function-decl name='urcu_qsbr_thread_online' mangled-name='urcu_qsbr_thread_online' filepath='src/urcu-qsbr.c' line='465' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_thread_online'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_thread_offline() -->
+    <function-decl name='urcu_qsbr_thread_offline' mangled-name='urcu_qsbr_thread_offline' filepath='src/urcu-qsbr.c' line='459' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_thread_offline'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_quiescent_state() -->
+    <function-decl name='urcu_qsbr_quiescent_state' mangled-name='urcu_qsbr_quiescent_state' filepath='src/urcu-qsbr.c' line='453' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_quiescent_state'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int urcu_qsbr_read_ongoing() -->
+    <function-decl name='urcu_qsbr_read_ongoing' mangled-name='urcu_qsbr_read_ongoing' filepath='src/urcu-qsbr.c' line='447' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_read_ongoing'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_qsbr_read_unlock() -->
+    <function-decl name='urcu_qsbr_read_unlock' mangled-name='urcu_qsbr_read_unlock' filepath='src/urcu-qsbr.c' line='442' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_read_unlock'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_read_lock() -->
+    <function-decl name='urcu_qsbr_read_lock' mangled-name='urcu_qsbr_read_lock' filepath='src/urcu-qsbr.c' line='437' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_read_lock'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_synchronize_rcu() -->
+    <function-decl name='urcu_qsbr_synchronize_rcu' mangled-name='urcu_qsbr_synchronize_rcu' filepath='src/urcu-qsbr.c' line='347' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-18'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-25'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-24'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-24'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-22'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-33'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-32'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-30'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-29'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-28'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-38' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-9' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-2' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-2' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-42' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-42' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-signal.so.8.xml b/extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-signal.so.8.xml
new file mode 100644 (file)
index 0000000..2aea310
--- /dev/null
@@ -0,0 +1,858 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-signal.so.8'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_barrier -->
+    <elf-symbol name='urcu_signal_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu -->
+    <elf-symbol name='urcu_signal_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_signal_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_signal_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu_before_fork -->
+    <elf-symbol name='urcu_signal_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu_data_free -->
+    <elf-symbol name='urcu_signal_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_signal_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_create_call_rcu_data -->
+    <elf-symbol name='urcu_signal_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_defer_barrier -->
+    <elf-symbol name='urcu_signal_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_defer_barrier_thread -->
+    <elf-symbol name='urcu_signal_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_defer_exit -->
+    <elf-symbol name='urcu_signal_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_defer_rcu -->
+    <elf-symbol name='urcu_signal_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_defer_register_thread -->
+    <elf-symbol name='urcu_signal_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_defer_unregister_thread -->
+    <elf-symbol name='urcu_signal_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_exit -->
+    <elf-symbol name='urcu_signal_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_signal_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_get_call_rcu_data -->
+    <elf-symbol name='urcu_signal_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_get_call_rcu_thread -->
+    <elf-symbol name='urcu_signal_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_signal_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_signal_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_signal_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_init -->
+    <elf-symbol name='urcu_signal_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_read_lock -->
+    <elf-symbol name='urcu_signal_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_read_ongoing -->
+    <elf-symbol name='urcu_signal_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_read_unlock -->
+    <elf-symbol name='urcu_signal_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_signal_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_register_thread -->
+    <elf-symbol name='urcu_signal_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_signal_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_signal_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_synchronize_rcu -->
+    <elf-symbol name='urcu_signal_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_signal_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_unregister_thread -->
+    <elf-symbol name='urcu_signal_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_flavor -->
+    <elf-symbol name='urcu_signal_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_gp -->
+    <elf-symbol name='urcu_signal_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_reader -->
+    <elf-symbol name='urcu_signal_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='67' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='77' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-4' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-3'/>
+    <!-- urcu_gp urcu_signal_gp -->
+    <var-decl name='urcu_signal_gp' type-id='type-id-1' mangled-name='urcu_signal_gp' visibility='default' filepath='../include/urcu/static/urcu-signal.h' line='61' column='1' elf-symbol-id='urcu_signal_gp'/>
+    <!-- struct urcu_reader -->
+    <class-decl name='urcu_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='80' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char urcu_reader::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='83' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_reader::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_reader::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_reader::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='88' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- urcu_reader urcu_signal_reader -->
+    <var-decl name='urcu_signal_reader' type-id='type-id-6' mangled-name='urcu_signal_reader' visibility='default' filepath='../include/urcu/static/urcu-signal.h' line='63' column='1' elf-symbol-id='urcu_signal_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct urcu_signal_flavor -->
+    <var-decl name='urcu_signal_flavor' type-id='type-id-35' mangled-name='urcu_signal_flavor' visibility='default' filepath='../include/urcu/flavor.h' line='81' column='1' elf-symbol-id='urcu_signal_flavor'/>
+    <!-- void urcu_signal_defer_exit() -->
+    <function-decl name='urcu_signal_defer_exit' mangled-name='urcu_signal_defer_exit' filepath='src/urcu-defer-impl.h' line='467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_defer_unregister_thread() -->
+    <function-decl name='urcu_signal_defer_unregister_thread' mangled-name='urcu_signal_defer_unregister_thread' filepath='src/urcu-defer-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_defer_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_signal_defer_register_thread() -->
+    <function-decl name='urcu_signal_defer_register_thread' mangled-name='urcu_signal_defer_register_thread' filepath='src/urcu-defer-impl.h' line='427' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_signal_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_signal_defer_rcu' mangled-name='urcu_signal_defer_rcu' filepath='src/urcu-defer-impl.h' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_defer_rcu'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_defer_barrier() -->
+    <function-decl name='urcu_signal_defer_barrier' mangled-name='urcu_signal_defer_barrier' filepath='src/urcu-defer-impl.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_defer_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_defer_barrier_thread() -->
+    <function-decl name='urcu_signal_defer_barrier_thread' mangled-name='urcu_signal_defer_barrier_thread' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_defer_barrier_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_signal_unregister_rculfhash_atfork' mangled-name='urcu_signal_unregister_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_unregister_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_signal_register_rculfhash_atfork' mangled-name='urcu_signal_register_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1002' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_register_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_signal_call_rcu_after_fork_child' mangled-name='urcu_signal_call_rcu_after_fork_child' filepath='src/urcu-call-rcu-impl.h' line='960' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_call_rcu_after_fork_child'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_signal_call_rcu_after_fork_parent' mangled-name='urcu_signal_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='938' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_call_rcu_before_fork() -->
+    <function-decl name='urcu_signal_call_rcu_before_fork' mangled-name='urcu_signal_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='911' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_barrier() -->
+    <function-decl name='urcu_signal_barrier' mangled-name='urcu_signal_barrier' filepath='src/urcu-call-rcu-impl.h' line='840' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_signal_free_all_cpu_call_rcu_data' mangled-name='urcu_signal_free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='777' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-2' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_signal_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_signal_call_rcu_data_free' mangled-name='urcu_signal_call_rcu_data_free' filepath='src/urcu-call-rcu-impl.h' line='742' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_call_rcu_data_free'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='742' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_signal_call_rcu' mangled-name='urcu_signal_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='704' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='704' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='705' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_signal_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_signal_create_all_cpu_call_rcu_data' mangled-name='urcu_signal_create_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_create_all_cpu_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='626' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_signal_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_signal_set_thread_call_rcu_data' mangled-name='urcu_signal_set_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_set_thread_call_rcu_data'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='613' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_signal_get_thread_call_rcu_data' mangled-name='urcu_signal_get_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='597' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_get_thread_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_get_call_rcu_data() -->
+    <function-decl name='urcu_signal_get_call_rcu_data' mangled-name='urcu_signal_get_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_get_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_get_default_call_rcu_data() -->
+    <function-decl name='urcu_signal_get_default_call_rcu_data' mangled-name='urcu_signal_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_signal_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_signal_set_cpu_call_rcu_data' mangled-name='urcu_signal_set_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_set_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_signal_create_call_rcu_data' mangled-name='urcu_signal_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='489' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='489' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='490' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_signal_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_signal_get_call_rcu_thread' mangled-name='urcu_signal_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='471' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='471' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_signal_get_cpu_call_rcu_data' mangled-name='urcu_signal_get_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_get_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='449' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_signal_exit() -->
+    <function-decl name='urcu_signal_exit' mangled-name='urcu_signal_exit' filepath='src/urcu.c' line='643' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_exit'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_init() -->
+    <function-decl name='urcu_signal_init' mangled-name='urcu_signal_init' filepath='src/urcu.c' line='626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_init'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_unregister_thread() -->
+    <function-decl name='urcu_signal_unregister_thread' mangled-name='urcu_signal_unregister_thread' filepath='src/urcu.c' line='546' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_register_thread() -->
+    <function-decl name='urcu_signal_register_thread' mangled-name='urcu_signal_register_thread' filepath='src/urcu.c' line='532' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_signal_read_ongoing() -->
+    <function-decl name='urcu_signal_read_ongoing' mangled-name='urcu_signal_read_ongoing' filepath='src/urcu.c' line='527' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_read_ongoing'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_signal_read_unlock() -->
+    <function-decl name='urcu_signal_read_unlock' mangled-name='urcu_signal_read_unlock' filepath='src/urcu.c' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_read_unlock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_read_lock() -->
+    <function-decl name='urcu_signal_read_lock' mangled-name='urcu_signal_read_lock' filepath='src/urcu.c' line='517' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_read_lock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_synchronize_rcu() -->
+    <function-decl name='urcu_signal_synchronize_rcu' mangled-name='urcu_signal_synchronize_rcu' filepath='src/urcu.c' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-2' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-2' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.13/x86_64-pc-linux-gnu/liburcu.so.8.xml b/extras/abi/0.13/x86_64-pc-linux-gnu/liburcu.so.8.xml
new file mode 100644 (file)
index 0000000..709f784
--- /dev/null
@@ -0,0 +1,855 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu.so.8'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_barrier -->
+    <elf-symbol name='urcu_memb_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu -->
+    <elf-symbol name='urcu_memb_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_memb_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_memb_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_before_fork -->
+    <elf-symbol name='urcu_memb_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_data_free -->
+    <elf-symbol name='urcu_memb_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_create_call_rcu_data -->
+    <elf-symbol name='urcu_memb_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_barrier -->
+    <elf-symbol name='urcu_memb_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_barrier_thread -->
+    <elf-symbol name='urcu_memb_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_exit -->
+    <elf-symbol name='urcu_memb_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_rcu -->
+    <elf-symbol name='urcu_memb_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_register_thread -->
+    <elf-symbol name='urcu_memb_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_unregister_thread -->
+    <elf-symbol name='urcu_memb_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_call_rcu_thread -->
+    <elf-symbol name='urcu_memb_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_init -->
+    <elf-symbol name='urcu_memb_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_lock -->
+    <elf-symbol name='urcu_memb_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_ongoing -->
+    <elf-symbol name='urcu_memb_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_unlock -->
+    <elf-symbol name='urcu_memb_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_memb_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_register_thread -->
+    <elf-symbol name='urcu_memb_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_memb_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_synchronize_rcu -->
+    <elf-symbol name='urcu_memb_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_memb_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_unregister_thread -->
+    <elf-symbol name='urcu_memb_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_flavor -->
+    <elf-symbol name='urcu_memb_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_gp -->
+    <elf-symbol name='urcu_memb_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_has_sys_membarrier -->
+    <elf-symbol name='urcu_memb_has_sys_membarrier' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_reader -->
+    <elf-symbol name='urcu_memb_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <!-- int urcu_memb_has_sys_membarrier -->
+    <var-decl name='urcu_memb_has_sys_membarrier' type-id='type-id-1' mangled-name='urcu_memb_has_sys_membarrier' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='72' column='1' elf-symbol-id='urcu_memb_has_sys_membarrier'/>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='67' column='1' id='type-id-2'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-4' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='77' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-1' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-4'/>
+    <!-- urcu_gp urcu_memb_gp -->
+    <var-decl name='urcu_memb_gp' type-id='type-id-2' mangled-name='urcu_memb_gp' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='83' column='1' elf-symbol-id='urcu_memb_gp'/>
+    <!-- struct urcu_reader -->
+    <class-decl name='urcu_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='80' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char urcu_reader::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='83' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_reader::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_reader::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_reader::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='88' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- urcu_reader urcu_memb_reader -->
+    <var-decl name='urcu_memb_reader' type-id='type-id-6' mangled-name='urcu_memb_reader' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='85' column='1' elf-symbol-id='urcu_memb_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct urcu_memb_flavor -->
+    <var-decl name='urcu_memb_flavor' type-id='type-id-35' mangled-name='urcu_memb_flavor' visibility='default' filepath='../include/urcu/flavor.h' line='81' column='1' elf-symbol-id='urcu_memb_flavor'/>
+    <!-- void urcu_memb_defer_exit() -->
+    <function-decl name='urcu_memb_defer_exit' mangled-name='urcu_memb_defer_exit' filepath='src/urcu-defer-impl.h' line='467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_unregister_thread() -->
+    <function-decl name='urcu_memb_defer_unregister_thread' mangled-name='urcu_memb_defer_unregister_thread' filepath='src/urcu-defer-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_defer_register_thread() -->
+    <function-decl name='urcu_memb_defer_register_thread' mangled-name='urcu_memb_defer_register_thread' filepath='src/urcu-defer-impl.h' line='427' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_memb_defer_rcu' mangled-name='urcu_memb_defer_rcu' filepath='src/urcu-defer-impl.h' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_rcu'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_barrier() -->
+    <function-decl name='urcu_memb_defer_barrier' mangled-name='urcu_memb_defer_barrier' filepath='src/urcu-defer-impl.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_barrier_thread() -->
+    <function-decl name='urcu_memb_defer_barrier_thread' mangled-name='urcu_memb_defer_barrier_thread' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_barrier_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_memb_unregister_rculfhash_atfork' mangled-name='urcu_memb_unregister_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_unregister_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_memb_register_rculfhash_atfork' mangled-name='urcu_memb_register_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1002' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_register_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_memb_call_rcu_after_fork_child' mangled-name='urcu_memb_call_rcu_after_fork_child' filepath='src/urcu-call-rcu-impl.h' line='960' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_after_fork_child'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_memb_call_rcu_after_fork_parent' mangled-name='urcu_memb_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='938' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_before_fork() -->
+    <function-decl name='urcu_memb_call_rcu_before_fork' mangled-name='urcu_memb_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='911' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_barrier() -->
+    <function-decl name='urcu_memb_barrier' mangled-name='urcu_memb_barrier' filepath='src/urcu-call-rcu-impl.h' line='840' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_memb_free_all_cpu_call_rcu_data' mangled-name='urcu_memb_free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='777' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-1' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='127' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_memb_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_memb_call_rcu_data_free' mangled-name='urcu_memb_call_rcu_data_free' filepath='src/urcu-call-rcu-impl.h' line='742' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_data_free'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='742' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_memb_call_rcu' mangled-name='urcu_memb_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='704' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='704' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='705' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_memb_create_all_cpu_call_rcu_data' mangled-name='urcu_memb_create_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_create_all_cpu_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='626' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_memb_set_thread_call_rcu_data' mangled-name='urcu_memb_set_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_set_thread_call_rcu_data'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='613' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_thread_call_rcu_data' mangled-name='urcu_memb_get_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='597' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_thread_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_call_rcu_data' mangled-name='urcu_memb_get_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_default_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_default_call_rcu_data' mangled-name='urcu_memb_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_memb_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_memb_set_cpu_call_rcu_data' mangled-name='urcu_memb_set_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_set_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_memb_create_call_rcu_data' mangled-name='urcu_memb_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='489' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='489' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='490' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_memb_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_memb_get_call_rcu_thread' mangled-name='urcu_memb_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='471' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='471' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_memb_get_cpu_call_rcu_data' mangled-name='urcu_memb_get_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='449' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_memb_init() -->
+    <function-decl name='urcu_memb_init' mangled-name='urcu_memb_init' filepath='src/urcu.c' line='594' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_init'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_unregister_thread() -->
+    <function-decl name='urcu_memb_unregister_thread' mangled-name='urcu_memb_unregister_thread' filepath='src/urcu.c' line='546' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_register_thread() -->
+    <function-decl name='urcu_memb_register_thread' mangled-name='urcu_memb_register_thread' filepath='src/urcu.c' line='532' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_read_ongoing() -->
+    <function-decl name='urcu_memb_read_ongoing' mangled-name='urcu_memb_read_ongoing' filepath='src/urcu.c' line='527' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_ongoing'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_read_unlock() -->
+    <function-decl name='urcu_memb_read_unlock' mangled-name='urcu_memb_read_unlock' filepath='src/urcu.c' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_unlock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_read_lock() -->
+    <function-decl name='urcu_memb_read_lock' mangled-name='urcu_memb_read_lock' filepath='src/urcu.c' line='517' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_lock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_synchronize_rcu() -->
+    <function-decl name='urcu_memb_synchronize_rcu' mangled-name='urcu_memb_synchronize_rcu' filepath='src/urcu.c' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-bp.so.8.xml b/extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-bp.so.8.xml
new file mode 100644 (file)
index 0000000..2bd8607
--- /dev/null
@@ -0,0 +1,907 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-bp.so.8'>
+<!--
+SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_after_fork_child -->
+    <elf-symbol name='urcu_bp_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_after_fork_parent -->
+    <elf-symbol name='urcu_bp_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_barrier -->
+    <elf-symbol name='urcu_bp_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_before_fork -->
+    <elf-symbol name='urcu_bp_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu -->
+    <elf-symbol name='urcu_bp_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_bp_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_bp_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu_before_fork -->
+    <elf-symbol name='urcu_bp_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_call_rcu_data_free -->
+    <elf-symbol name='urcu_bp_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_cmpxchg_pointer_sym -->
+    <elf-symbol name='urcu_bp_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_bp_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_create_call_rcu_data -->
+    <elf-symbol name='urcu_bp_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_barrier -->
+    <elf-symbol name='urcu_bp_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_barrier_thread -->
+    <elf-symbol name='urcu_bp_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_exit -->
+    <elf-symbol name='urcu_bp_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_rcu -->
+    <elf-symbol name='urcu_bp_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_register_thread -->
+    <elf-symbol name='urcu_bp_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_defer_unregister_thread -->
+    <elf-symbol name='urcu_bp_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_dereference_sym -->
+    <elf-symbol name='urcu_bp_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_bp_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_get_call_rcu_data -->
+    <elf-symbol name='urcu_bp_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_get_call_rcu_thread -->
+    <elf-symbol name='urcu_bp_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_bp_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_bp_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_bp_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_read_lock -->
+    <elf-symbol name='urcu_bp_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_read_ongoing -->
+    <elf-symbol name='urcu_bp_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_read_unlock -->
+    <elf-symbol name='urcu_bp_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_register -->
+    <elf-symbol name='urcu_bp_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_bp_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_register_thread -->
+    <elf-symbol name='urcu_bp_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_bp_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_set_pointer_sym -->
+    <elf-symbol name='urcu_bp_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_bp_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_synchronize_rcu -->
+    <elf-symbol name='urcu_bp_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_bp_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_xchg_pointer_sym -->
+    <elf-symbol name='urcu_bp_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_flavor -->
+    <elf-symbol name='urcu_bp_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_gp -->
+    <elf-symbol name='urcu_bp_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_has_sys_membarrier -->
+    <elf-symbol name='urcu_bp_has_sys_membarrier' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_reader -->
+    <elf-symbol name='urcu_bp_reader' size='8' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu-bp.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <!-- int urcu_bp_has_sys_membarrier -->
+    <var-decl name='urcu_bp_has_sys_membarrier' type-id='type-id-1' mangled-name='urcu_bp_has_sys_membarrier' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='109' column='1' elf-symbol-id='urcu_bp_has_sys_membarrier'/>
+    <!-- struct urcu_bp_gp -->
+    <class-decl name='urcu_bp_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='77' column='1' id='type-id-2'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_bp_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- urcu_bp_gp urcu_bp_gp -->
+    <var-decl name='urcu_bp_gp' type-id='type-id-2' mangled-name='urcu_bp_gp' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='88' column='1' elf-symbol-id='urcu_bp_gp'/>
+    <!-- struct urcu_bp_reader -->
+    <class-decl name='urcu_bp_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='90' column='1' id='type-id-4'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_bp_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='92' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_bp_reader::node -->
+        <var-decl name='node' type-id='type-id-5' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_bp_reader::tid -->
+        <var-decl name='tid' type-id='type-id-6' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='95' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1216'>
+        <!-- int urcu_bp_reader::alloc -->
+        <var-decl name='alloc' type-id='type-id-1' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='96' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-5'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-7' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-7' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-7'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-6'/>
+    <!-- urcu_bp_reader* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-8'/>
+    <!-- urcu_bp_reader* urcu_bp_reader -->
+    <var-decl name='urcu_bp_reader' type-id='type-id-8' mangled-name='urcu_bp_reader' visibility='default' filepath='../include/urcu/static/urcu-bp.h' line='104' column='1' elf-symbol-id='urcu_bp_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-9'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-11' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-10' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-15'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-16' size-in-bits='64' id='type-id-10'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-11'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-18'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-19' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-20' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='58' column='1' id='type-id-19'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-21'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-22'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-23' size-in-bits='64' id='type-id-20'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-24' size-in-bits='64' id='type-id-12'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-15' size-in-bits='64' id='type-id-25'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-27'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-13'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-29'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-27' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-27' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-27' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-25' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-14'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-9' const='yes' id='type-id-32'/>
+    <!-- const rcu_flavor_struct urcu_bp_flavor -->
+    <var-decl name='urcu_bp_flavor' type-id='type-id-32' mangled-name='urcu_bp_flavor' visibility='default' filepath='../include/urcu/flavor.h' line='81' column='1' elf-symbol-id='urcu_bp_flavor'/>
+    <!-- void urcu_bp_defer_exit() -->
+    <function-decl name='urcu_bp_defer_exit' mangled-name='urcu_bp_defer_exit' filepath='src/urcu-defer-impl.h' line='467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_defer_unregister_thread() -->
+    <function-decl name='urcu_bp_defer_unregister_thread' mangled-name='urcu_bp_defer_unregister_thread' filepath='src/urcu-defer-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_defer_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int urcu_bp_defer_register_thread() -->
+    <function-decl name='urcu_bp_defer_register_thread' mangled-name='urcu_bp_defer_register_thread' filepath='src/urcu-defer-impl.h' line='427' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_bp_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_bp_defer_rcu' mangled-name='urcu_bp_defer_rcu' filepath='src/urcu-defer-impl.h' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_defer_rcu'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-27' name='fct' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='p' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_defer_barrier() -->
+    <function-decl name='urcu_bp_defer_barrier' mangled-name='urcu_bp_defer_barrier' filepath='src/urcu-defer-impl.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_defer_barrier'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_defer_barrier_thread() -->
+    <function-decl name='urcu_bp_defer_barrier_thread' mangled-name='urcu_bp_defer_barrier_thread' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_defer_barrier_thread'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_bp_unregister_rculfhash_atfork' mangled-name='urcu_bp_unregister_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_unregister_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-30' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_bp_register_rculfhash_atfork' mangled-name='urcu_bp_register_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1002' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_register_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-30' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_bp_call_rcu_after_fork_child' mangled-name='urcu_bp_call_rcu_after_fork_child' filepath='src/urcu-call-rcu-impl.h' line='960' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_call_rcu_after_fork_child'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_bp_call_rcu_after_fork_parent' mangled-name='urcu_bp_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='938' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_call_rcu_before_fork() -->
+    <function-decl name='urcu_bp_call_rcu_before_fork' mangled-name='urcu_bp_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='911' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_barrier() -->
+    <function-decl name='urcu_bp_barrier' mangled-name='urcu_bp_barrier' filepath='src/urcu-call-rcu-impl.h' line='840' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_barrier'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_bp_free_all_cpu_call_rcu_data' mangled-name='urcu_bp_free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='777' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-33'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-34' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-35' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-36' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-6' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-1' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-5' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='140' column='1' id='type-id-34'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='141' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='71' column='1' id='type-id-35'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-19' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-37' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-38'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-39' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-40' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-39'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-42'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-43'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-45'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-46'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-45' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-44'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-47'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='320' id='type-id-40'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-41'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-38' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-37'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-1' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-49'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-49' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-36'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-50'/>
+    <!-- void urcu_bp_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_bp_call_rcu_data_free' mangled-name='urcu_bp_call_rcu_data_free' filepath='src/urcu-call-rcu-impl.h' line='742' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_call_rcu_data_free'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='742' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_bp_call_rcu' mangled-name='urcu_bp_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='704' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-22' name='head' filepath='src/urcu-call-rcu-impl.h' line='704' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-20' name='func' filepath='src/urcu-call-rcu-impl.h' line='705' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int urcu_bp_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_bp_create_all_cpu_call_rcu_data' mangled-name='urcu_bp_create_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_create_all_cpu_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='626' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_bp_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_bp_set_thread_call_rcu_data' mangled-name='urcu_bp_set_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_set_thread_call_rcu_data'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='613' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_bp_get_thread_call_rcu_data' mangled-name='urcu_bp_get_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='597' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_get_thread_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_get_call_rcu_data() -->
+    <function-decl name='urcu_bp_get_call_rcu_data' mangled-name='urcu_bp_get_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_get_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_get_default_call_rcu_data() -->
+    <function-decl name='urcu_bp_get_default_call_rcu_data' mangled-name='urcu_bp_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- int urcu_bp_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_bp_set_cpu_call_rcu_data' mangled-name='urcu_bp_set_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_set_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_bp_create_call_rcu_data' mangled-name='urcu_bp_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='489' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='489' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='490' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- pthread_t urcu_bp_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_bp_get_call_rcu_thread' mangled-name='urcu_bp_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='471' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-50' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='471' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_bp_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_bp_get_cpu_call_rcu_data' mangled-name='urcu_bp_get_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_get_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='449' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-50'/>
+    </function-decl>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-25' size-in-bits='64' id='type-id-51'/>
+    <!-- void* urcu_bp_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='urcu_bp_cmpxchg_pointer_sym' mangled-name='urcu_bp_cmpxchg_pointer_sym' filepath='src/urcu-bp.c' line='762' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='762' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='old' filepath='src/urcu-bp.c' line='762' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='_new' filepath='src/urcu-bp.c' line='762' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* urcu_bp_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='urcu_bp_xchg_pointer_sym' mangled-name='urcu_bp_xchg_pointer_sym' filepath='src/urcu-bp.c' line='756' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='756' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='756' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* urcu_bp_set_pointer_sym(void**, void*) -->
+    <function-decl name='urcu_bp_set_pointer_sym' mangled-name='urcu_bp_set_pointer_sym' filepath='src/urcu-bp.c' line='749' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='749' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='749' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* urcu_bp_dereference_sym(void*) -->
+    <function-decl name='urcu_bp_dereference_sym' mangled-name='urcu_bp_dereference_sym' filepath='src/urcu-bp.c' line='744' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='p' filepath='src/urcu-bp.c' line='744' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void urcu_bp_after_fork_child() -->
+    <function-decl name='urcu_bp_after_fork_child' mangled-name='urcu_bp_after_fork_child' filepath='src/urcu-bp.c' line='731' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_after_fork_child'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_after_fork_parent() -->
+    <function-decl name='urcu_bp_after_fork_parent' mangled-name='urcu_bp_after_fork_parent' filepath='src/urcu-bp.c' line='696' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_before_fork() -->
+    <function-decl name='urcu_bp_before_fork' mangled-name='urcu_bp_before_fork' filepath='src/urcu-bp.c' line='682' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_register_thread() -->
+    <function-decl name='urcu_bp_register_thread' mangled-name='urcu_bp_register_thread' filepath='src/urcu-bp.c' line='565' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_register() -->
+    <function-decl name='urcu_bp_register' mangled-name='urcu_bp_register' filepath='src/urcu-bp.c' line='532' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_register'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int urcu_bp_read_ongoing() -->
+    <function-decl name='urcu_bp_read_ongoing' mangled-name='urcu_bp_read_ongoing' filepath='src/urcu-bp.c' line='365' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_read_ongoing'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_bp_read_unlock() -->
+    <function-decl name='urcu_bp_read_unlock' mangled-name='urcu_bp_read_unlock' filepath='src/urcu-bp.c' line='360' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_read_unlock'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_read_lock() -->
+    <function-decl name='urcu_bp_read_lock' mangled-name='urcu_bp_read_lock' filepath='src/urcu-bp.c' line='355' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_read_lock'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- void urcu_bp_synchronize_rcu() -->
+    <function-decl name='urcu_bp_synchronize_rcu' mangled-name='urcu_bp_synchronize_rcu' filepath='src/urcu-bp.c' line='272' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_bp_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-17'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-16'>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-23'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-22'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-24'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-22'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-20'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-28'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-27'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-15'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='762' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='old' filepath='src/urcu-bp.c' line='762' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='_new' filepath='src/urcu-bp.c' line='762' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='756' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='756' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-51' name='p' filepath='src/urcu-bp.c' line='749' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='v' filepath='src/urcu-bp.c' line='749' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-25' name='p' filepath='src/urcu-bp.c' line='744' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-25'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-37' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-52'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-55' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-53'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-56' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-56'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-59' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-58'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-59'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-42' size-in-bits='64' id='type-id-57'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-60'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='384' id='type-id-54'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-61'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-55'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-52' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-62'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-62' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-63'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-64'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-66' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-41' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-65'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-41' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-66'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-64' const='yes' id='type-id-67'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-67' size-in-bits='64' id='type-id-68'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-68' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-68' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-36' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-cds.so.8.xml b/extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-cds.so.8.xml
new file mode 100644 (file)
index 0000000..b0cb83c
--- /dev/null
@@ -0,0 +1,1493 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-cds.so.8'>
+<!--
+SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- __cds_lfs_init -->
+    <elf-symbol name='__cds_lfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_lfs_pop -->
+    <elf-symbol name='__cds_lfs_pop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_lfs_pop_all -->
+    <elf-symbol name='__cds_lfs_pop_all' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _cds_lfht_new -->
+    <elf-symbol name='_cds_lfht_new' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_add -->
+    <elf-symbol name='cds_lfht_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_add_replace -->
+    <elf-symbol name='cds_lfht_add_replace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_add_unique -->
+    <elf-symbol name='cds_lfht_add_unique' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_count_nodes -->
+    <elf-symbol name='cds_lfht_count_nodes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_del -->
+    <elf-symbol name='cds_lfht_del' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_destroy -->
+    <elf-symbol name='cds_lfht_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_first -->
+    <elf-symbol name='cds_lfht_first' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_fls_ulong -->
+    <elf-symbol name='cds_lfht_fls_ulong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_get_count_order_ulong -->
+    <elf-symbol name='cds_lfht_get_count_order_ulong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_is_node_deleted -->
+    <elf-symbol name='cds_lfht_is_node_deleted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_lookup -->
+    <elf-symbol name='cds_lfht_lookup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_next -->
+    <elf-symbol name='cds_lfht_next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_next_duplicate -->
+    <elf-symbol name='cds_lfht_next_duplicate' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_node_init_deleted -->
+    <elf-symbol name='cds_lfht_node_init_deleted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_replace -->
+    <elf-symbol name='cds_lfht_replace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_resize -->
+    <elf-symbol name='cds_lfht_resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_dequeue_rcu -->
+    <elf-symbol name='cds_lfq_dequeue_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_destroy_rcu -->
+    <elf-symbol name='cds_lfq_destroy_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_enqueue_rcu -->
+    <elf-symbol name='cds_lfq_enqueue_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_init_rcu -->
+    <elf-symbol name='cds_lfq_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_node_init_rcu -->
+    <elf-symbol name='cds_lfq_node_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_destroy -->
+    <elf-symbol name='cds_lfs_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_empty -->
+    <elf-symbol name='cds_lfs_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_init -->
+    <elf-symbol name='cds_lfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_init_rcu -->
+    <elf-symbol name='cds_lfs_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_node_init -->
+    <elf-symbol name='cds_lfs_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_node_init_rcu -->
+    <elf-symbol name='cds_lfs_node_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_all_blocking -->
+    <elf-symbol name='cds_lfs_pop_all_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_blocking -->
+    <elf-symbol name='cds_lfs_pop_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_lock -->
+    <elf-symbol name='cds_lfs_pop_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_rcu -->
+    <elf-symbol name='cds_lfs_pop_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_unlock -->
+    <elf-symbol name='cds_lfs_pop_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_push -->
+    <elf-symbol name='cds_lfs_push' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_push_rcu -->
+    <elf-symbol name='cds_lfs_push_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_create -->
+    <elf-symbol name='urcu_workqueue_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_create_completion -->
+    <elf-symbol name='urcu_workqueue_create_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_create_worker -->
+    <elf-symbol name='urcu_workqueue_create_worker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_destroy -->
+    <elf-symbol name='urcu_workqueue_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_destroy_completion -->
+    <elf-symbol name='urcu_workqueue_destroy_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_flush_queued_work -->
+    <elf-symbol name='urcu_workqueue_flush_queued_work' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_pause_worker -->
+    <elf-symbol name='urcu_workqueue_pause_worker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_queue_completion -->
+    <elf-symbol name='urcu_workqueue_queue_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_queue_work -->
+    <elf-symbol name='urcu_workqueue_queue_work' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_resume_worker -->
+    <elf-symbol name='urcu_workqueue_resume_worker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_workqueue_wait_completion -->
+    <elf-symbol name='urcu_workqueue_wait_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_mm_chunk -->
+    <elf-symbol name='cds_lfht_mm_chunk' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_mm_mmap -->
+    <elf-symbol name='cds_lfht_mm_mmap' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_mm_order -->
+    <elf-symbol name='cds_lfht_mm_order' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='rculfqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfq_node_rcu -->
+    <class-decl name='cds_lfq_node_rcu' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/rculfqueue.h' line='34' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfq_node_rcu* cds_lfq_node_rcu::next -->
+        <var-decl name='next' type-id='type-id-2' visibility='default' filepath='../include/urcu/rculfqueue.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int cds_lfq_node_rcu::dummy -->
+        <var-decl name='dummy' type-id='type-id-3' visibility='default' filepath='../include/urcu/rculfqueue.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfq_node_rcu* -->
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-3'/>
+    <!-- struct cds_lfq_queue_rcu -->
+    <class-decl name='cds_lfq_queue_rcu' size-in-bits='192' is-struct='yes' visibility='default' filepath='../include/urcu/rculfqueue.h' line='39' column='1' id='type-id-4'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfq_node_rcu* cds_lfq_queue_rcu::head -->
+        <var-decl name='head' type-id='type-id-2' visibility='default' filepath='../include/urcu/rculfqueue.h' line='40' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_lfq_node_rcu* cds_lfq_queue_rcu::tail -->
+        <var-decl name='tail' type-id='type-id-2' visibility='default' filepath='../include/urcu/rculfqueue.h' line='40' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* cds_lfq_queue_rcu::queue_call_rcu -->
+        <var-decl name='queue_call_rcu' type-id='type-id-5' visibility='default' filepath='../include/urcu/rculfqueue.h' line='41' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-6'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-7'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-8' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-9' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='58' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-10' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-10'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-7' size-in-bits='64' id='type-id-11'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-12' size-in-bits='64' id='type-id-9'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-13' size-in-bits='64' id='type-id-5'/>
+    <!-- cds_lfq_queue_rcu* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-14'/>
+    <!-- cds_lfq_node_rcu* cds_lfq_dequeue_rcu(cds_lfq_queue_rcu*) -->
+    <function-decl name='cds_lfq_dequeue_rcu' mangled-name='cds_lfq_dequeue_rcu' filepath='src/rculfqueue.c' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_dequeue_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='56' column='1'/>
+      <!-- cds_lfq_node_rcu* -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void cds_lfq_enqueue_rcu(cds_lfq_queue_rcu*, cds_lfq_node_rcu*) -->
+    <function-decl name='cds_lfq_enqueue_rcu' mangled-name='cds_lfq_enqueue_rcu' filepath='src/rculfqueue.c' line='50' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_enqueue_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='50' column='1'/>
+      <!-- parameter of type 'cds_lfq_node_rcu*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/rculfqueue.c' line='50' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- int cds_lfq_destroy_rcu(cds_lfq_queue_rcu*) -->
+    <function-decl name='cds_lfq_destroy_rcu' mangled-name='cds_lfq_destroy_rcu' filepath='src/rculfqueue.c' line='45' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_destroy_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='45' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- void cds_lfq_init_rcu(cds_lfq_queue_rcu*, void (rcu_head*, void (rcu_head*)*)*) -->
+    <function-decl name='cds_lfq_init_rcu' mangled-name='cds_lfq_init_rcu' filepath='src/rculfqueue.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_init_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-14' name='q' filepath='src/rculfqueue.c' line='38' column='1'/>
+      <!-- parameter of type 'void (rcu_head*, void (rcu_head*)*)*' -->
+      <parameter type-id='type-id-5' name='queue_call_rcu' filepath='src/rculfqueue.c' line='39' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfq_node_init_rcu(cds_lfq_node_rcu*) -->
+    <function-decl name='cds_lfq_node_init_rcu' mangled-name='cds_lfq_node_init_rcu' filepath='src/rculfqueue.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_node_init_rcu'>
+      <!-- parameter of type 'cds_lfq_node_rcu*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/rculfqueue.c' line='33' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-12'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-11'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-13'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-11'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-9'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfstack.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfs_node_rcu -->
+    <class-decl name='cds_lfs_node_rcu' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/rculfstack.h' line='37' column='1' id='type-id-15'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node_rcu* cds_lfs_node_rcu::next -->
+        <var-decl name='next' type-id='type-id-16' visibility='default' filepath='../include/urcu/rculfstack.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfs_node_rcu* -->
+    <pointer-type-def type-id='type-id-15' size-in-bits='64' id='type-id-16'/>
+    <!-- struct cds_lfs_stack_rcu -->
+    <class-decl name='cds_lfs_stack_rcu' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/rculfstack.h' line='41' column='1' id='type-id-17'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node_rcu* cds_lfs_stack_rcu::head -->
+        <var-decl name='head' type-id='type-id-16' visibility='default' filepath='../include/urcu/rculfstack.h' line='42' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfs_stack_rcu* -->
+    <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-18'/>
+    <!-- cds_lfs_node_rcu* cds_lfs_pop_rcu(cds_lfs_stack_rcu*) -->
+    <function-decl name='cds_lfs_pop_rcu' mangled-name='cds_lfs_pop_rcu' filepath='src/rculfstack.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_rcu'>
+      <!-- parameter of type 'cds_lfs_stack_rcu*' -->
+      <parameter type-id='type-id-18' name='s' filepath='src/rculfstack.c' line='53' column='1'/>
+      <!-- cds_lfs_node_rcu* -->
+      <return type-id='type-id-16'/>
+    </function-decl>
+    <!-- int cds_lfs_push_rcu(cds_lfs_stack_rcu*, cds_lfs_node_rcu*) -->
+    <function-decl name='cds_lfs_push_rcu' mangled-name='cds_lfs_push_rcu' filepath='src/rculfstack.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_push_rcu'>
+      <!-- parameter of type 'cds_lfs_stack_rcu*' -->
+      <parameter type-id='type-id-18' name='s' filepath='src/rculfstack.c' line='47' column='1'/>
+      <!-- parameter of type 'cds_lfs_node_rcu*' -->
+      <parameter type-id='type-id-16' name='node' filepath='src/rculfstack.c' line='48' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- void cds_lfs_init_rcu(cds_lfs_stack_rcu*) -->
+    <function-decl name='cds_lfs_init_rcu' mangled-name='cds_lfs_init_rcu' filepath='src/rculfstack.c' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_init_rcu'>
+      <!-- parameter of type 'cds_lfs_stack_rcu*' -->
+      <parameter type-id='type-id-18' name='s' filepath='src/rculfstack.c' line='42' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_node_init_rcu(cds_lfs_node_rcu*) -->
+    <function-decl name='cds_lfs_node_init_rcu' mangled-name='cds_lfs_node_init_rcu' filepath='src/rculfstack.c' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_node_init_rcu'>
+      <!-- parameter of type 'cds_lfs_node_rcu*' -->
+      <parameter type-id='type-id-16' name='node' filepath='src/rculfstack.c' line='37' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='lfstack.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfs_head -->
+    <class-decl name='cds_lfs_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='69' column='1' id='type-id-19'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node cds_lfs_head::node -->
+        <var-decl name='node' type-id='type-id-20' visibility='default' filepath='../include/urcu/lfstack.h' line='70' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_lfs_node -->
+    <class-decl name='cds_lfs_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='59' column='1' id='type-id-20'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node* cds_lfs_node::next -->
+        <var-decl name='next' type-id='type-id-21' visibility='default' filepath='../include/urcu/lfstack.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfs_node* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-21'/>
+    <!-- cds_lfs_head* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-22'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='97' column='1' id='type-id-23'>
+      <data-member access='private'>
+        <!-- __cds_lfs_stack* __anonymous_union__::_s -->
+        <var-decl name='_s' type-id='type-id-24' visibility='default' filepath='../include/urcu/lfstack.h' line='98' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_lfs_stack* __anonymous_union__::s -->
+        <var-decl name='s' type-id='type-id-25' visibility='default' filepath='../include/urcu/lfstack.h' line='99' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __cds_lfs_stack -->
+    <class-decl name='__cds_lfs_stack' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='73' column='1' id='type-id-26'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_head* __cds_lfs_stack::head -->
+        <var-decl name='head' type-id='type-id-22' visibility='default' filepath='../include/urcu/lfstack.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __cds_lfs_stack* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-24'/>
+    <!-- struct cds_lfs_stack -->
+    <class-decl name='cds_lfs_stack' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/lfstack.h' line='77' column='1' id='type-id-27'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_head* cds_lfs_stack::head -->
+        <var-decl name='head' type-id='type-id-22' visibility='default' filepath='../include/urcu/lfstack.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_lfs_stack::lock -->
+        <var-decl name='lock' type-id='type-id-28' visibility='default' filepath='../include/urcu/lfstack.h' line='79' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-29'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-30' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-31' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-32' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-30'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-3' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-3' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-3' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-34' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-34' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-35' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-33'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-34'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-37' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-37' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-37'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-36' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-35'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-38'/>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-39'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-38' size-in-bits='320' id='type-id-31'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-39' id='type-id-40'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-32'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-29' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-28'/>
+    <!-- cds_lfs_stack* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-25'/>
+    <!-- typedef __anonymous_union__ cds_lfs_stack_ptr_t -->
+    <typedef-decl name='cds_lfs_stack_ptr_t' type-id='type-id-23' filepath='../include/urcu/lfstack.h' line='100' column='1' id='type-id-41'/>
+    <!-- cds_lfs_head* __cds_lfs_pop_all(cds_lfs_stack_ptr_t) -->
+    <function-decl name='__cds_lfs_pop_all' mangled-name='__cds_lfs_pop_all' filepath='src/lfstack.c' line='88' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_lfs_pop_all'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='88' column='1'/>
+      <!-- cds_lfs_head* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_lfs_node* __cds_lfs_pop(cds_lfs_stack_ptr_t) -->
+    <function-decl name='__cds_lfs_pop' mangled-name='__cds_lfs_pop' filepath='src/lfstack.c' line='83' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_lfs_pop'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='83' column='1'/>
+      <!-- cds_lfs_node* -->
+      <return type-id='type-id-21'/>
+    </function-decl>
+    <!-- void cds_lfs_pop_unlock(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_unlock' mangled-name='cds_lfs_pop_unlock' filepath='src/lfstack.c' line='78' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_unlock'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_pop_lock(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_lock' mangled-name='cds_lfs_pop_lock' filepath='src/lfstack.c' line='73' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_lock'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- cds_lfs_head* cds_lfs_pop_all_blocking(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_all_blocking' mangled-name='cds_lfs_pop_all_blocking' filepath='src/lfstack.c' line='68' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_all_blocking'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='68' column='1'/>
+      <!-- cds_lfs_head* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_lfs_node* cds_lfs_pop_blocking(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_blocking' mangled-name='cds_lfs_pop_blocking' filepath='src/lfstack.c' line='63' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_blocking'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='63' column='1'/>
+      <!-- cds_lfs_node* -->
+      <return type-id='type-id-21'/>
+    </function-decl>
+    <!-- bool -->
+    <type-decl name='bool' size-in-bits='8' id='type-id-42'/>
+    <!-- bool cds_lfs_push(cds_lfs_stack_ptr_t, cds_lfs_node*) -->
+    <function-decl name='cds_lfs_push' mangled-name='cds_lfs_push' filepath='src/lfstack.c' line='58' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_push'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='58' column='1'/>
+      <!-- parameter of type 'cds_lfs_node*' -->
+      <parameter type-id='type-id-21' name='node' filepath='src/lfstack.c' line='58' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-42'/>
+    </function-decl>
+    <!-- bool cds_lfs_empty(cds_lfs_stack_ptr_t) -->
+    <function-decl name='cds_lfs_empty' mangled-name='cds_lfs_empty' filepath='src/lfstack.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_empty'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/lfstack.c' line='53' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-42'/>
+    </function-decl>
+    <!-- void __cds_lfs_init(__cds_lfs_stack*) -->
+    <function-decl name='__cds_lfs_init' mangled-name='__cds_lfs_init' filepath='src/lfstack.c' line='48' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_lfs_init'>
+      <!-- parameter of type '__cds_lfs_stack*' -->
+      <parameter type-id='type-id-24' name='s' filepath='src/lfstack.c' line='48' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_destroy(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_destroy' mangled-name='cds_lfs_destroy' filepath='src/lfstack.c' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_destroy'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_init(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_init' mangled-name='cds_lfs_init' filepath='src/lfstack.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_init'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-25' name='s' filepath='src/lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfs_node_init(cds_lfs_node*) -->
+    <function-decl name='cds_lfs_node_init' mangled-name='cds_lfs_node_init' filepath='src/lfstack.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_node_init'>
+      <!-- parameter of type 'cds_lfs_node*' -->
+      <parameter type-id='type-id-21' name='node' filepath='src/lfstack.c' line='33' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='workqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct urcu_workqueue -->
+    <class-decl name='urcu_workqueue' size-in-bits='2048' is-struct='yes' visibility='default' filepath='src/workqueue.c' line='54' column='1' id='type-id-43'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail urcu_workqueue::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-44' visibility='default' filepath='src/workqueue.c' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head urcu_workqueue::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-45' visibility='default' filepath='src/workqueue.c' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int urcu_workqueue::flags -->
+        <var-decl name='flags' type-id='type-id-39' visibility='default' filepath='src/workqueue.c' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t urcu_workqueue::futex -->
+        <var-decl name='futex' type-id='type-id-46' visibility='default' filepath='src/workqueue.c' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int urcu_workqueue::qlen -->
+        <var-decl name='qlen' type-id='type-id-39' visibility='default' filepath='src/workqueue.c' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t urcu_workqueue::tid -->
+        <var-decl name='tid' type-id='type-id-47' visibility='default' filepath='src/workqueue.c' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int urcu_workqueue::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-3' visibility='default' filepath='src/workqueue.c' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int urcu_workqueue::loop_count -->
+        <var-decl name='loop_count' type-id='type-id-39' visibility='default' filepath='src/workqueue.c' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void* urcu_workqueue::priv -->
+        <var-decl name='priv' type-id='type-id-48' visibility='default' filepath='src/workqueue.c' line='69' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='896'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::grace_period_fct -->
+        <var-decl name='grace_period_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='960'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::initialize_worker_fct -->
+        <var-decl name='initialize_worker_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='71' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::finalize_worker_fct -->
+        <var-decl name='finalize_worker_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1088'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_before_pause_fct -->
+        <var-decl name='worker_before_pause_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_after_resume_fct -->
+        <var-decl name='worker_after_resume_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1216'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_before_wait_fct -->
+        <var-decl name='worker_before_wait_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1280'>
+        <!-- void (urcu_workqueue*, void*)* urcu_workqueue::worker_after_wake_up_fct -->
+        <var-decl name='worker_after_wake_up_fct' type-id='type-id-49' visibility='default' filepath='src/workqueue.c' line='76' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='140' column='1' id='type-id-44'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-10' visibility='default' filepath='../include/urcu/wfcqueue.h' line='141' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='71' column='1' id='type-id-45'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-28' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-50'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-50' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-46'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-39' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-47'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-6' size-in-bits='64' id='type-id-48'/>
+    <!-- urcu_workqueue* -->
+    <pointer-type-def type-id='type-id-43' size-in-bits='64' id='type-id-51'/>
+    <!-- void (urcu_workqueue*, void*)* -->
+    <pointer-type-def type-id='type-id-52' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_workqueue_create_worker(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_create_worker' mangled-name='urcu_workqueue_create_worker' filepath='src/workqueue.c' line='455' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_create_worker'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='455' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_resume_worker(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_resume_worker' mangled-name='urcu_workqueue_resume_worker' filepath='src/workqueue.c' line='448' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_resume_worker'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='448' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_pause_worker(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_pause_worker' mangled-name='urcu_workqueue_pause_worker' filepath='src/workqueue.c' line='437' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_pause_worker'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='448' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_flush_queued_work(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_flush_queued_work' mangled-name='urcu_workqueue_flush_queued_work' filepath='src/workqueue.c' line='424' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_flush_queued_work'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='455' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- struct urcu_workqueue_completion -->
+    <class-decl name='urcu_workqueue_completion' size-in-bits='128' is-struct='yes' visibility='default' filepath='src/workqueue.c' line='79' column='1' id='type-id-53'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int urcu_workqueue_completion::barrier_count -->
+        <var-decl name='barrier_count' type-id='type-id-3' visibility='default' filepath='src/workqueue.c' line='80' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- int32_t urcu_workqueue_completion::futex -->
+        <var-decl name='futex' type-id='type-id-46' visibility='default' filepath='src/workqueue.c' line='81' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- urcu_ref urcu_workqueue_completion::ref -->
+        <var-decl name='ref' type-id='type-id-54' visibility='default' filepath='src/workqueue.c' line='82' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct urcu_ref -->
+    <class-decl name='urcu_ref' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/ref.h' line='23' column='1' id='type-id-54'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- long int urcu_ref::refcount -->
+        <var-decl name='refcount' type-id='type-id-32' visibility='default' filepath='../include/urcu/ref.h' line='24' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_workqueue_completion* -->
+    <pointer-type-def type-id='type-id-53' size-in-bits='64' id='type-id-55'/>
+    <!-- void urcu_workqueue_queue_completion(urcu_workqueue*, urcu_workqueue_completion*) -->
+    <function-decl name='urcu_workqueue_queue_completion' mangled-name='urcu_workqueue_queue_completion' filepath='src/workqueue.c' line='407' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_queue_completion'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='407' column='1'/>
+      <!-- parameter of type 'urcu_workqueue_completion*' -->
+      <parameter type-id='type-id-55' name='completion' filepath='src/workqueue.c' line='408' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_wait_completion(urcu_workqueue_completion*) -->
+    <function-decl name='urcu_workqueue_wait_completion' mangled-name='urcu_workqueue_wait_completion' filepath='src/workqueue.c' line='394' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_wait_completion'>
+      <!-- parameter of type 'urcu_workqueue_completion*' -->
+      <parameter type-id='type-id-55' name='completion' filepath='src/workqueue.c' line='394' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_destroy_completion(urcu_workqueue_completion*) -->
+    <function-decl name='urcu_workqueue_destroy_completion' mangled-name='urcu_workqueue_destroy_completion' filepath='src/workqueue.c' line='389' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_destroy_completion'>
+      <!-- parameter of type 'urcu_workqueue_completion*' -->
+      <parameter type-id='type-id-55' name='completion' filepath='src/workqueue.c' line='389' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- urcu_workqueue_completion* urcu_workqueue_create_completion() -->
+    <function-decl name='urcu_workqueue_create_completion' mangled-name='urcu_workqueue_create_completion' filepath='src/workqueue.c' line='377' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_create_completion'>
+      <!-- urcu_workqueue_completion* -->
+      <return type-id='type-id-55'/>
+    </function-decl>
+    <!-- struct urcu_work -->
+    <class-decl name='urcu_work' size-in-bits='128' is-struct='yes' visibility='default' filepath='src/workqueue.h' line='53' column='1' id='type-id-56'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node urcu_work::next -->
+        <var-decl name='next' type-id='type-id-8' visibility='default' filepath='src/workqueue.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (urcu_work*)* urcu_work::func -->
+        <var-decl name='func' type-id='type-id-57' visibility='default' filepath='src/workqueue.h' line='55' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_work* -->
+    <pointer-type-def type-id='type-id-56' size-in-bits='64' id='type-id-58'/>
+    <!-- void (urcu_work*)* -->
+    <pointer-type-def type-id='type-id-59' size-in-bits='64' id='type-id-57'/>
+    <!-- void urcu_workqueue_queue_work(urcu_workqueue*, urcu_work*, void (urcu_work*)*) -->
+    <function-decl name='urcu_workqueue_queue_work' mangled-name='urcu_workqueue_queue_work' filepath='src/workqueue.c' line='343' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_queue_work'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='343' column='1'/>
+      <!-- parameter of type 'urcu_work*' -->
+      <parameter type-id='type-id-58' name='work' filepath='src/workqueue.c' line='344' column='1'/>
+      <!-- parameter of type 'void (urcu_work*)*' -->
+      <parameter type-id='type-id-57' name='func' filepath='src/workqueue.c' line='345' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void urcu_workqueue_destroy(urcu_workqueue*) -->
+    <function-decl name='urcu_workqueue_destroy' mangled-name='urcu_workqueue_destroy' filepath='src/workqueue.c' line='331' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_destroy'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51' name='workqueue' filepath='src/workqueue.c' line='455' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- urcu_workqueue* urcu_workqueue_create(unsigned long int, int, void*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*, void (urcu_workqueue*, void*)*) -->
+    <function-decl name='urcu_workqueue_create' mangled-name='urcu_workqueue_create' filepath='src/workqueue.c' line='266' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_workqueue_create'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='flags' filepath='src/workqueue.c' line='266' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='cpu_affinity' filepath='src/workqueue.c' line='267' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='priv' filepath='src/workqueue.c' line='267' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='grace_period_fct' filepath='src/workqueue.c' line='268' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='initialize_worker_fct' filepath='src/workqueue.c' line='269' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='finalize_worker_fct' filepath='src/workqueue.c' line='270' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_before_wait_fct' filepath='src/workqueue.c' line='271' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_after_wake_up_fct' filepath='src/workqueue.c' line='272' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_before_pause_fct' filepath='src/workqueue.c' line='273' column='1'/>
+      <!-- parameter of type 'void (urcu_workqueue*, void*)*' -->
+      <parameter type-id='type-id-49' name='worker_after_resume_fct' filepath='src/workqueue.c' line='274' column='1'/>
+      <!-- urcu_workqueue* -->
+      <return type-id='type-id-51'/>
+    </function-decl>
+    <!-- void (urcu_work*) -->
+    <function-type size-in-bits='64' id='type-id-59'>
+      <!-- parameter of type 'urcu_work*' -->
+      <parameter type-id='type-id-58'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (urcu_workqueue*, void*) -->
+    <function-type size-in-bits='64' id='type-id-52'>
+      <!-- parameter of type 'urcu_workqueue*' -->
+      <parameter type-id='type-id-51'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_lfht -->
+    <class-decl name='cds_lfht' size-in-bits='5248' is-struct='yes' visibility='default' filepath='../src/rculfhash-internal.h' line='70' column='1' id='type-id-60'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int cds_lfht::max_nr_buckets -->
+        <var-decl name='max_nr_buckets' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- const cds_lfht_mm_type* cds_lfht::mm -->
+        <var-decl name='mm' type-id='type-id-61' visibility='default' filepath='../src/rculfhash-internal.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- const rcu_flavor_struct* cds_lfht::flavor -->
+        <var-decl name='flavor' type-id='type-id-62' visibility='default' filepath='../src/rculfhash-internal.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- long int cds_lfht::count -->
+        <var-decl name='count' type-id='type-id-32' visibility='default' filepath='../src/rculfhash-internal.h' line='76' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- pthread_mutex_t cds_lfht::resize_mutex -->
+        <var-decl name='resize_mutex' type-id='type-id-28' visibility='default' filepath='../src/rculfhash-internal.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- pthread_attr_t* cds_lfht::resize_attr -->
+        <var-decl name='resize_attr' type-id='type-id-63' visibility='default' filepath='../src/rculfhash-internal.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- unsigned int cds_lfht::in_progress_destroy -->
+        <var-decl name='in_progress_destroy' type-id='type-id-33' visibility='default' filepath='../src/rculfhash-internal.h' line='87' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- unsigned long int cds_lfht::resize_target -->
+        <var-decl name='resize_target' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='88' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- int cds_lfht::resize_initiated -->
+        <var-decl name='resize_initiated' type-id='type-id-3' visibility='default' filepath='../src/rculfhash-internal.h' line='89' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='800'>
+        <!-- int cds_lfht::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='../src/rculfhash-internal.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- unsigned long int cds_lfht::min_alloc_buckets_order -->
+        <var-decl name='min_alloc_buckets_order' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='95' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='896'>
+        <!-- unsigned long int cds_lfht::min_nr_alloc_buckets -->
+        <var-decl name='min_nr_alloc_buckets' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='96' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='960'>
+        <!-- ht_items_count* cds_lfht::split_count -->
+        <var-decl name='split_count' type-id='type-id-64' visibility='default' filepath='../src/rculfhash-internal.h' line='97' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- unsigned long int cds_lfht::size -->
+        <var-decl name='size' type-id='type-id-39' visibility='default' filepath='../src/rculfhash-internal.h' line='102' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1088'>
+        <!-- cds_lfht_node* (cds_lfht*, unsigned long int)* cds_lfht::bucket_at -->
+        <var-decl name='bucket_at' type-id='type-id-65' visibility='default' filepath='../src/rculfhash-internal.h' line='107' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-66' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_lfht_mm_type -->
+    <class-decl name='cds_lfht_mm_type' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/rculfhash.h' line='130' column='1' id='type-id-67'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfht* (unsigned long int, unsigned long int)* cds_lfht_mm_type::alloc_cds_lfht -->
+        <var-decl name='alloc_cds_lfht' type-id='type-id-68' visibility='default' filepath='../include/urcu/rculfhash.h' line='131' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (cds_lfht*, unsigned long int)* cds_lfht_mm_type::alloc_bucket_table -->
+        <var-decl name='alloc_bucket_table' type-id='type-id-69' visibility='default' filepath='../include/urcu/rculfhash.h' line='133' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (cds_lfht*, unsigned long int)* cds_lfht_mm_type::free_bucket_table -->
+        <var-decl name='free_bucket_table' type-id='type-id-69' visibility='default' filepath='../include/urcu/rculfhash.h' line='134' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- cds_lfht_node* (cds_lfht*, unsigned long int)* cds_lfht_mm_type::bucket_at -->
+        <var-decl name='bucket_at' type-id='type-id-65' visibility='default' filepath='../include/urcu/rculfhash.h' line='135' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfht* -->
+    <pointer-type-def type-id='type-id-60' size-in-bits='64' id='type-id-70'/>
+    <!-- cds_lfht* (unsigned long int, unsigned long int)* -->
+    <pointer-type-def type-id='type-id-71' size-in-bits='64' id='type-id-68'/>
+    <!-- void (cds_lfht*, unsigned long int)* -->
+    <pointer-type-def type-id='type-id-72' size-in-bits='64' id='type-id-69'/>
+    <!-- struct cds_lfht_node -->
+    <class-decl name='cds_lfht_node' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/rculfhash.h' line='63' column='1' id='type-id-73'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfht_node* cds_lfht_node::next -->
+        <var-decl name='next' type-id='type-id-74' visibility='default' filepath='../include/urcu/rculfhash.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- unsigned long int cds_lfht_node::reverse_hash -->
+        <var-decl name='reverse_hash' type-id='type-id-39' visibility='default' filepath='../include/urcu/rculfhash.h' line='65' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfht_node* -->
+    <pointer-type-def type-id='type-id-73' size-in-bits='64' id='type-id-74'/>
+    <!-- cds_lfht_node* (cds_lfht*, unsigned long int)* -->
+    <pointer-type-def type-id='type-id-75' size-in-bits='64' id='type-id-65'/>
+    <!-- const cds_lfht_mm_type -->
+    <qualified-type-def type-id='type-id-67' const='yes' id='type-id-76'/>
+    <!-- const cds_lfht_mm_type* -->
+    <pointer-type-def type-id='type-id-76' size-in-bits='64' id='type-id-61'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-77'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-79' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-5' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-80' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-78' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-81' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-81' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-82' size-in-bits='64' id='type-id-78'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-83' size-in-bits='64' id='type-id-79'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-84' size-in-bits='64' id='type-id-85'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-86' size-in-bits='64' id='type-id-80'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-87'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-85' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-85' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-85' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-48' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-87' size-in-bits='64' id='type-id-88'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-89' size-in-bits='64' id='type-id-81'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-77' const='yes' id='type-id-90'/>
+    <!-- const rcu_flavor_struct* -->
+    <pointer-type-def type-id='type-id-90' size-in-bits='64' id='type-id-62'/>
+    <!-- union pthread_attr_t -->
+    <union-decl name='pthread_attr_t' size-in-bits='448' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='56' column='1' id='type-id-91'>
+      <data-member access='private'>
+        <!-- char pthread_attr_t::__size[56] -->
+        <var-decl name='__size' type-id='type-id-92' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int pthread_attr_t::__align -->
+        <var-decl name='__align' type-id='type-id-32' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='59' column='1'/>
+      </data-member>
+    </union-decl>
+
+    <!-- char[56] -->
+    <array-type-def dimensions='1' type-id='type-id-38' size-in-bits='448' id='type-id-92'>
+      <!-- <anonymous range>[56] -->
+      <subrange length='56' type-id='type-id-39' id='type-id-93'/>
+
+    </array-type-def>
+    <!-- typedef pthread_attr_t pthread_attr_t -->
+    <typedef-decl name='pthread_attr_t' type-id='type-id-91' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='62' column='1' id='type-id-94'/>
+    <!-- pthread_attr_t* -->
+    <pointer-type-def type-id='type-id-94' size-in-bits='64' id='type-id-63'/>
+    <!-- struct ht_items_count -->
+    <class-decl name='ht_items_count' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/rculfhash.c' line='338' column='1' id='type-id-95'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int ht_items_count::add -->
+        <var-decl name='add' type-id='type-id-39' visibility='default' filepath='src/rculfhash.c' line='339' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- unsigned long int ht_items_count::del -->
+        <var-decl name='del' type-id='type-id-39' visibility='default' filepath='src/rculfhash.c' line='339' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- ht_items_count* -->
+    <pointer-type-def type-id='type-id-95' size-in-bits='64' id='type-id-64'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='4096' is-anonymous='yes' visibility='default' filepath='../src/rculfhash-internal.h' line='113' column='1' id='type-id-66'>
+      <data-member access='private'>
+        <!-- cds_lfht_node* __anonymous_union__::tbl_order[64] -->
+        <var-decl name='tbl_order' type-id='type-id-96' visibility='default' filepath='../src/rculfhash-internal.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_lfht_node* __anonymous_union__::tbl_chunk[1] -->
+        <var-decl name='tbl_chunk' type-id='type-id-97' visibility='default' filepath='../src/rculfhash-internal.h' line='134' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_lfht_node* __anonymous_union__::tbl_mmap -->
+        <var-decl name='tbl_mmap' type-id='type-id-74' visibility='default' filepath='../src/rculfhash-internal.h' line='140' column='1'/>
+      </data-member>
+    </union-decl>
+
+    <!-- cds_lfht_node*[64] -->
+    <array-type-def dimensions='1' type-id='type-id-74' size-in-bits='4096' id='type-id-96'>
+      <!-- <anonymous range>[64] -->
+      <subrange length='64' type-id='type-id-39' id='type-id-98'/>
+
+    </array-type-def>
+
+    <!-- cds_lfht_node*[1] -->
+    <array-type-def dimensions='1' type-id='type-id-74' size-in-bits='64' id='type-id-97'>
+      <!-- <anonymous range>[1] -->
+      <subrange length='1' type-id='type-id-39' id='type-id-99'/>
+
+    </array-type-def>
+    <!-- void cds_lfht_resize(cds_lfht*, unsigned long int) -->
+    <function-decl name='cds_lfht_resize' mangled-name='cds_lfht_resize' filepath='src/rculfhash.c' line='2040' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_resize'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='2040' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='new_size' filepath='src/rculfhash.c' line='2040' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- long int* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-100'/>
+    <!-- unsigned long int* -->
+    <pointer-type-def type-id='type-id-39' size-in-bits='64' id='type-id-101'/>
+    <!-- void cds_lfht_count_nodes(cds_lfht*, long int*, unsigned long int*, long int*) -->
+    <function-decl name='cds_lfht_count_nodes' mangled-name='cds_lfht_count_nodes' filepath='src/rculfhash.c' line='1918' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_count_nodes'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1918' column='1'/>
+      <!-- parameter of type 'long int*' -->
+      <parameter type-id='type-id-100' name='approx_before' filepath='src/rculfhash.c' line='1919' column='1'/>
+      <!-- parameter of type 'unsigned long int*' -->
+      <parameter type-id='type-id-101' name='count' filepath='src/rculfhash.c' line='1920' column='1'/>
+      <!-- parameter of type 'long int*' -->
+      <parameter type-id='type-id-100' name='approx_after' filepath='src/rculfhash.c' line='1921' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- pthread_attr_t** -->
+    <pointer-type-def type-id='type-id-63' size-in-bits='64' id='type-id-102'/>
+    <!-- int cds_lfht_destroy(cds_lfht*, pthread_attr_t**) -->
+    <function-decl name='cds_lfht_destroy' mangled-name='cds_lfht_destroy' filepath='src/rculfhash.c' line='1893' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_destroy'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1893' column='1'/>
+      <!-- parameter of type 'pthread_attr_t**' -->
+      <parameter type-id='type-id-102' name='attr' filepath='src/rculfhash.c' line='1893' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- const cds_lfht_node -->
+    <qualified-type-def type-id='type-id-73' const='yes' id='type-id-103'/>
+    <!-- const cds_lfht_node* -->
+    <pointer-type-def type-id='type-id-103' size-in-bits='64' id='type-id-104'/>
+    <!-- int cds_lfht_is_node_deleted(const cds_lfht_node*) -->
+    <function-decl name='cds_lfht_is_node_deleted' mangled-name='cds_lfht_is_node_deleted' filepath='src/rculfhash.c' line='1850' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_is_node_deleted'>
+      <!-- parameter of type 'const cds_lfht_node*' -->
+      <parameter type-id='type-id-104' name='node' filepath='src/rculfhash.c' line='1850' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- int cds_lfht_del(cds_lfht*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_del' mangled-name='cds_lfht_del' filepath='src/rculfhash.c' line='1834' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_del'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1834' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1834' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- struct cds_lfht_iter -->
+    <class-decl name='cds_lfht_iter' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/rculfhash.h' line='69' column='1' id='type-id-105'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfht_node* cds_lfht_iter::node -->
+        <var-decl name='node' type-id='type-id-74' visibility='default' filepath='../include/urcu/rculfhash.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_lfht_node* cds_lfht_iter::next -->
+        <var-decl name='next' type-id='type-id-74' visibility='default' filepath='../include/urcu/rculfhash.h' line='70' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfht_iter* -->
+    <pointer-type-def type-id='type-id-105' size-in-bits='64' id='type-id-106'/>
+    <!-- int (cds_lfht_node*, void*)* -->
+    <pointer-type-def type-id='type-id-107' size-in-bits='64' id='type-id-108'/>
+    <!-- typedef int (cds_lfht_node*, void*)* cds_lfht_match_fct -->
+    <typedef-decl name='cds_lfht_match_fct' type-id='type-id-108' filepath='../include/urcu/rculfhash.h' line='98' column='1' id='type-id-109'/>
+    <!-- int cds_lfht_replace(cds_lfht*, cds_lfht_iter*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_replace' mangled-name='cds_lfht_replace' filepath='src/rculfhash.c' line='1813' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_replace'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1813' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-106' name='old_iter' filepath='src/rculfhash.c' line='1814' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1815' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-109' name='match' filepath='src/rculfhash.c' line='1816' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1817' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='new_node' filepath='src/rculfhash.c' line='1818' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- cds_lfht_node* cds_lfht_add_replace(cds_lfht*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_add_replace' mangled-name='cds_lfht_add_replace' filepath='src/rculfhash.c' line='1790' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_add_replace'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1790' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1791' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-109' name='match' filepath='src/rculfhash.c' line='1792' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1793' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1794' column='1'/>
+      <!-- cds_lfht_node* -->
+      <return type-id='type-id-74'/>
+    </function-decl>
+    <!-- cds_lfht_node* cds_lfht_add_unique(cds_lfht*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_add_unique' mangled-name='cds_lfht_add_unique' filepath='src/rculfhash.c' line='1773' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_add_unique'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1790' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1791' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-109' name='match' filepath='src/rculfhash.c' line='1792' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1793' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1794' column='1'/>
+      <!-- cds_lfht_node* -->
+      <return type-id='type-id-74'/>
+    </function-decl>
+    <!-- void cds_lfht_add(cds_lfht*, unsigned long int, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_add' mangled-name='cds_lfht_add' filepath='src/rculfhash.c' line='1762' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_add'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1762' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1762' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1763' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_first(cds_lfht*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_first' mangled-name='cds_lfht_first' filepath='src/rculfhash.c' line='1751' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_first'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1751' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-106' name='iter' filepath='src/rculfhash.c' line='1751' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_next(cds_lfht*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_next' mangled-name='cds_lfht_next' filepath='src/rculfhash.c' line='1727' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_next'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1727' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-106' name='iter' filepath='src/rculfhash.c' line='1728' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_next_duplicate(cds_lfht*, cds_lfht_match_fct, void*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_next_duplicate' mangled-name='cds_lfht_next_duplicate' filepath='src/rculfhash.c' line='1692' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_next_duplicate'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1692' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-109' name='match' filepath='src/rculfhash.c' line='1693' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1694' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-106' name='iter' filepath='src/rculfhash.c' line='1694' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- void cds_lfht_lookup(cds_lfht*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_lookup' mangled-name='cds_lfht_lookup' filepath='src/rculfhash.c' line='1652' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_lookup'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70' name='ht' filepath='src/rculfhash.c' line='1652' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='hash' filepath='src/rculfhash.c' line='1652' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-109' name='match' filepath='src/rculfhash.c' line='1653' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48' name='key' filepath='src/rculfhash.c' line='1653' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-106' name='iter' filepath='src/rculfhash.c' line='1654' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- cds_lfht* _cds_lfht_new(unsigned long int, unsigned long int, unsigned long int, int, const cds_lfht_mm_type*, const rcu_flavor_struct*, pthread_attr_t*) -->
+    <function-decl name='_cds_lfht_new' mangled-name='_cds_lfht_new' filepath='src/rculfhash.c' line='1593' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_cds_lfht_new'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='init_size' filepath='src/rculfhash.c' line='1593' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='min_nr_alloc_buckets' filepath='src/rculfhash.c' line='1594' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='max_nr_buckets' filepath='src/rculfhash.c' line='1595' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/rculfhash.c' line='1596' column='1'/>
+      <!-- parameter of type 'const cds_lfht_mm_type*' -->
+      <parameter type-id='type-id-61' name='mm' filepath='src/rculfhash.c' line='1597' column='1'/>
+      <!-- parameter of type 'const rcu_flavor_struct*' -->
+      <parameter type-id='type-id-62' name='flavor' filepath='src/rculfhash.c' line='1598' column='1'/>
+      <!-- parameter of type 'pthread_attr_t*' -->
+      <parameter type-id='type-id-63' name='attr' filepath='src/rculfhash.c' line='1599' column='1'/>
+      <!-- cds_lfht* -->
+      <return type-id='type-id-70'/>
+    </function-decl>
+    <!-- void cds_lfht_node_init_deleted(cds_lfht_node*) -->
+    <function-decl name='cds_lfht_node_init_deleted' mangled-name='cds_lfht_node_init_deleted' filepath='src/rculfhash.c' line='1587' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_node_init_deleted'>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74' name='node' filepath='src/rculfhash.c' line='1587' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <!-- int cds_lfht_get_count_order_ulong(unsigned long int) -->
+    <function-decl name='cds_lfht_get_count_order_ulong' mangled-name='cds_lfht_get_count_order_ulong' filepath='src/rculfhash.c' line='598' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_get_count_order_ulong'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='x' filepath='src/rculfhash.c' line='598' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- unsigned int cds_lfht_fls_ulong(unsigned long int) -->
+    <function-decl name='cds_lfht_fls_ulong' mangled-name='cds_lfht_fls_ulong' filepath='src/rculfhash.c' line='572' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_fls_ulong'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39' name='x' filepath='src/rculfhash.c' line='572' column='1'/>
+      <!-- unsigned int -->
+      <return type-id='type-id-33'/>
+    </function-decl>
+    <!-- cds_lfht* (unsigned long int, unsigned long int) -->
+    <function-type size-in-bits='64' id='type-id-71'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- cds_lfht* -->
+      <return type-id='type-id-70'/>
+    </function-type>
+    <!-- cds_lfht_node* (cds_lfht*, unsigned long int) -->
+    <function-type size-in-bits='64' id='type-id-75'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- cds_lfht_node* -->
+      <return type-id='type-id-74'/>
+    </function-type>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-83'>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-type>
+    <!-- int (cds_lfht_node*, void*) -->
+    <function-type size-in-bits='64' id='type-id-107'>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-74'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-82'>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (cds_lfht*, unsigned long int) -->
+    <function-type size-in-bits='64' id='type-id-72'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-70'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-39'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-89'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-88'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-86'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-85'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-84'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-48'/>
+      <!-- void -->
+      <return type-id='type-id-6'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash-mm-order.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- const cds_lfht_mm_type cds_lfht_mm_order -->
+    <var-decl name='cds_lfht_mm_order' type-id='type-id-76' mangled-name='cds_lfht_mm_order' visibility='default' filepath='../include/urcu/rculfhash.h' line='139' column='1' elf-symbol-id='cds_lfht_mm_order'/>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash-mm-chunk.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- const cds_lfht_mm_type cds_lfht_mm_chunk -->
+    <var-decl name='cds_lfht_mm_chunk' type-id='type-id-76' mangled-name='cds_lfht_mm_chunk' visibility='default' filepath='../include/urcu/rculfhash.h' line='140' column='1' elf-symbol-id='cds_lfht_mm_chunk'/>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash-mm-mmap.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- const cds_lfht_mm_type cds_lfht_mm_mmap -->
+    <var-decl name='cds_lfht_mm_mmap' type-id='type-id-76' mangled-name='cds_lfht_mm_mmap' visibility='default' filepath='../include/urcu/rculfhash.h' line='141' column='1' elf-symbol-id='cds_lfht_mm_mmap'/>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-28' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-110'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-111' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-112' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-113' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-111'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-114' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-115' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-115' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-115' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-114'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-117' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-116'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-117'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-33' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-33' size-in-bits='64' id='type-id-115'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-39' id='type-id-118'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-38' size-in-bits='384' id='type-id-112'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-39' id='type-id-119'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-113'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-110' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-120'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-120' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-121'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-122'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-123' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-124' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-32' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-123'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-32' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-124'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-122' const='yes' id='type-id-125'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-125' size-in-bits='64' id='type-id-126'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-121' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-126' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-121' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-121' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-3' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-126' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-121' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-46' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-3'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-common.so.8.xml b/extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-common.so.8.xml
new file mode 100644 (file)
index 0000000..95bd363
--- /dev/null
@@ -0,0 +1,910 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-common.so.8'>
+<!--
+SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- __cds_wfcq_dequeue_blocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_dequeue_nonblocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_dequeue_with_state_blocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_dequeue_with_state_nonblocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_with_state_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_first_blocking -->
+    <elf-symbol name='__cds_wfcq_first_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_first_nonblocking -->
+    <elf-symbol name='__cds_wfcq_first_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_init -->
+    <elf-symbol name='__cds_wfcq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_next_blocking -->
+    <elf-symbol name='__cds_wfcq_next_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_next_nonblocking -->
+    <elf-symbol name='__cds_wfcq_next_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_splice_blocking -->
+    <elf-symbol name='__cds_wfcq_splice_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_splice_nonblocking -->
+    <elf-symbol name='__cds_wfcq_splice_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfq_dequeue_blocking -->
+    <elf-symbol name='__cds_wfq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_init -->
+    <elf-symbol name='__cds_wfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_all -->
+    <elf-symbol name='__cds_wfs_pop_all' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_blocking -->
+    <elf-symbol name='__cds_wfs_pop_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_nonblocking -->
+    <elf-symbol name='__cds_wfs_pop_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_with_state_blocking -->
+    <elf-symbol name='__cds_wfs_pop_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_with_state_nonblocking -->
+    <elf-symbol name='__cds_wfs_pop_with_state_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_blocking -->
+    <elf-symbol name='cds_wfcq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_lock -->
+    <elf-symbol name='cds_wfcq_dequeue_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_unlock -->
+    <elf-symbol name='cds_wfcq_dequeue_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_with_state_blocking -->
+    <elf-symbol name='cds_wfcq_dequeue_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_destroy -->
+    <elf-symbol name='cds_wfcq_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_empty -->
+    <elf-symbol name='cds_wfcq_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_enqueue -->
+    <elf-symbol name='cds_wfcq_enqueue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_init -->
+    <elf-symbol name='cds_wfcq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_node_init -->
+    <elf-symbol name='cds_wfcq_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_splice_blocking -->
+    <elf-symbol name='cds_wfcq_splice_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_dequeue_blocking -->
+    <elf-symbol name='cds_wfq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_destroy -->
+    <elf-symbol name='cds_wfq_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_enqueue -->
+    <elf-symbol name='cds_wfq_enqueue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_init -->
+    <elf-symbol name='cds_wfq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_node_init -->
+    <elf-symbol name='cds_wfq_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_destroy -->
+    <elf-symbol name='cds_wfs_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_empty -->
+    <elf-symbol name='cds_wfs_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_first -->
+    <elf-symbol name='cds_wfs_first' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_init -->
+    <elf-symbol name='cds_wfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_next_blocking -->
+    <elf-symbol name='cds_wfs_next_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_next_nonblocking -->
+    <elf-symbol name='cds_wfs_next_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_node_init -->
+    <elf-symbol name='cds_wfs_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_all_blocking -->
+    <elf-symbol name='cds_wfs_pop_all_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_blocking -->
+    <elf-symbol name='cds_wfs_pop_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_lock -->
+    <elf-symbol name='cds_wfs_pop_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_unlock -->
+    <elf-symbol name='cds_wfs_pop_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_with_state_blocking -->
+    <elf-symbol name='cds_wfs_pop_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_push -->
+    <elf-symbol name='cds_wfs_push' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='wfqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_wfq_node -->
+    <class-decl name='cds_wfq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfqueue.h' line='47' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfq_node* cds_wfq_node::next -->
+        <var-decl name='next' type-id='type-id-2' visibility='default' filepath='../include/urcu/wfqueue.h' line='48' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfq_node* -->
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' id='type-id-2'/>
+    <!-- struct cds_wfq_queue -->
+    <class-decl name='cds_wfq_queue' size-in-bits='512' is-struct='yes' visibility='default' filepath='../include/urcu/wfqueue.h' line='51' column='1' id='type-id-3'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfq_node* cds_wfq_queue::head -->
+        <var-decl name='head' type-id='type-id-2' visibility='default' filepath='../include/urcu/wfqueue.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfq_node** cds_wfq_queue::tail -->
+        <var-decl name='tail' type-id='type-id-4' visibility='default' filepath='../include/urcu/wfqueue.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- cds_wfq_node cds_wfq_queue::dummy -->
+        <var-decl name='dummy' type-id='type-id-1' visibility='default' filepath='../include/urcu/wfqueue.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- pthread_mutex_t cds_wfq_queue::lock -->
+        <var-decl name='lock' type-id='type-id-5' visibility='default' filepath='../include/urcu/wfqueue.h' line='54' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfq_node** -->
+    <pointer-type-def type-id='type-id-2' size-in-bits='64' id='type-id-4'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-6'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-7' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-7'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-12' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-12' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-13' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-10'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-11'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-12'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-14'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-14' size-in-bits='64' id='type-id-15'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-14' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-13'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-16'/>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-17'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='320' id='type-id-8'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-17' id='type-id-18'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-9'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-6' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-5'/>
+    <!-- cds_wfq_queue* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-19'/>
+    <!-- cds_wfq_node* cds_wfq_dequeue_blocking(cds_wfq_queue*) -->
+    <function-decl name='cds_wfq_dequeue_blocking' mangled-name='cds_wfq_dequeue_blocking' filepath='src/wfqueue.c' line='59' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_dequeue_blocking'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='59' column='1'/>
+      <!-- cds_wfq_node* -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- cds_wfq_node* __cds_wfq_dequeue_blocking(cds_wfq_queue*) -->
+    <function-decl name='__cds_wfq_dequeue_blocking' mangled-name='__cds_wfq_dequeue_blocking' filepath='src/wfqueue.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfq_dequeue_blocking'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='59' column='1'/>
+      <!-- cds_wfq_node* -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-20'/>
+    <!-- void cds_wfq_enqueue(cds_wfq_queue*, cds_wfq_node*) -->
+    <function-decl name='cds_wfq_enqueue' mangled-name='cds_wfq_enqueue' filepath='src/wfqueue.c' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_enqueue'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='49' column='1'/>
+      <!-- parameter of type 'cds_wfq_node*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/wfqueue.c' line='49' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfq_destroy(cds_wfq_queue*) -->
+    <function-decl name='cds_wfq_destroy' mangled-name='cds_wfq_destroy' filepath='src/wfqueue.c' line='44' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_destroy'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='44' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfq_init(cds_wfq_queue*) -->
+    <function-decl name='cds_wfq_init' mangled-name='cds_wfq_init' filepath='src/wfqueue.c' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_init'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-19' name='q' filepath='src/wfqueue.c' line='44' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfq_node_init(cds_wfq_node*) -->
+    <function-decl name='cds_wfq_node_init' mangled-name='cds_wfq_node_init' filepath='src/wfqueue.c' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_node_init'>
+      <!-- parameter of type 'cds_wfq_node*' -->
+      <parameter type-id='type-id-2' name='node' filepath='src/wfqueue.c' line='34' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='wfcqueue.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='58' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-22'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='91' column='1' id='type-id-23'>
+      <data-member access='private'>
+        <!-- __cds_wfcq_head* __anonymous_union__::_h -->
+        <var-decl name='_h' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='92' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_wfcq_head* __anonymous_union__::h -->
+        <var-decl name='h' type-id='type-id-25' visibility='default' filepath='../include/urcu/wfcqueue.h' line='93' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __cds_wfcq_head -->
+    <class-decl name='__cds_wfcq_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='67' column='1' id='type-id-26'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node __cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='68' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __cds_wfcq_head* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-24'/>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='71' column='1' id='type-id-27'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-5' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_head* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-25'/>
+    <!-- typedef __anonymous_union__ cds_wfcq_head_ptr_t -->
+    <typedef-decl name='cds_wfcq_head_ptr_t' type-id='type-id-23' filepath='../include/urcu/wfcqueue.h' line='94' column='1' id='type-id-28'/>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='140' column='1' id='type-id-29'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='141' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_tail* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- cds_wfcq_node* __cds_wfcq_next_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_node*) -->
+    <function-decl name='__cds_wfcq_next_nonblocking' mangled-name='__cds_wfcq_next_nonblocking' filepath='src/wfcqueue.c' line='178' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_next_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='179' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='180' column='1'/>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='181' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_next_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_node*) -->
+    <function-decl name='__cds_wfcq_next_blocking' mangled-name='__cds_wfcq_next_blocking' filepath='src/wfcqueue.c' line='170' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_next_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='179' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='180' column='1'/>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='181' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_first_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_first_nonblocking' mangled-name='__cds_wfcq_first_nonblocking' filepath='src/wfcqueue.c' line='163' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_first_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_first_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_first_blocking' mangled-name='__cds_wfcq_first_blocking' filepath='src/wfcqueue.c' line='156' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_first_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- unnamed&#45;enum&#45;underlying&#45;type -->
+    <type-decl name='unnamed-enum-underlying-type' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-31'/>
+    <!-- enum cds_wfcq_ret -->
+    <enum-decl name='cds_wfcq_ret' filepath='../include/urcu/wfcqueue.h' line='47' column='1' id='type-id-32'>
+      <underlying-type type-id='type-id-31'/>
+      <enumerator name='CDS_WFCQ_RET_WOULDBLOCK' value='-1'/>
+      <enumerator name='CDS_WFCQ_RET_DEST_EMPTY' value='0'/>
+      <enumerator name='CDS_WFCQ_RET_DEST_NON_EMPTY' value='1'/>
+      <enumerator name='CDS_WFCQ_RET_SRC_EMPTY' value='2'/>
+    </enum-decl>
+    <!-- cds_wfcq_ret __cds_wfcq_splice_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_splice_nonblocking' mangled-name='__cds_wfcq_splice_nonblocking' filepath='src/wfcqueue.c' line='146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_splice_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='dest_q_head' filepath='src/wfcqueue.c' line='147' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='dest_q_tail' filepath='src/wfcqueue.c' line='148' column='1'/>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='src_q_head' filepath='src/wfcqueue.c' line='149' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='src_q_tail' filepath='src/wfcqueue.c' line='150' column='1'/>
+      <!-- enum cds_wfcq_ret -->
+      <return type-id='type-id-32'/>
+    </function-decl>
+    <!-- cds_wfcq_ret __cds_wfcq_splice_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_splice_blocking' mangled-name='__cds_wfcq_splice_blocking' filepath='src/wfcqueue.c' line='136' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_splice_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='dest_q_head' filepath='src/wfcqueue.c' line='147' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='dest_q_tail' filepath='src/wfcqueue.c' line='148' column='1'/>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='src_q_head' filepath='src/wfcqueue.c' line='149' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='src_q_tail' filepath='src/wfcqueue.c' line='150' column='1'/>
+      <!-- enum cds_wfcq_ret -->
+      <return type-id='type-id-32'/>
+    </function-decl>
+    <!-- int* -->
+    <pointer-type-def type-id='type-id-10' size-in-bits='64' id='type-id-33'/>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_with_state_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, int*) -->
+    <function-decl name='__cds_wfcq_dequeue_with_state_nonblocking' mangled-name='__cds_wfcq_dequeue_with_state_nonblocking' filepath='src/wfcqueue.c' line='128' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_with_state_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='129' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='130' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfcqueue.c' line='131' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_dequeue_nonblocking' mangled-name='__cds_wfcq_dequeue_nonblocking' filepath='src/wfcqueue.c' line='121' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_with_state_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, int*) -->
+    <function-decl name='__cds_wfcq_dequeue_with_state_blocking' mangled-name='__cds_wfcq_dequeue_with_state_blocking' filepath='src/wfcqueue.c' line='113' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_with_state_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='129' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='130' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfcqueue.c' line='131' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_dequeue_blocking' mangled-name='__cds_wfcq_dequeue_blocking' filepath='src/wfcqueue.c' line='106' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_ret cds_wfcq_splice_blocking(cds_wfcq_head*, cds_wfcq_tail*, cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_splice_blocking' mangled-name='cds_wfcq_splice_blocking' filepath='src/wfcqueue.c' line='96' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_splice_blocking'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='dest_q_head' filepath='src/wfcqueue.c' line='97' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='dest_q_tail' filepath='src/wfcqueue.c' line='98' column='1'/>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='src_q_head' filepath='src/wfcqueue.c' line='99' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='src_q_tail' filepath='src/wfcqueue.c' line='100' column='1'/>
+      <!-- enum cds_wfcq_ret -->
+      <return type-id='type-id-32'/>
+    </function-decl>
+    <!-- cds_wfcq_node* cds_wfcq_dequeue_with_state_blocking(cds_wfcq_head*, cds_wfcq_tail*, int*) -->
+    <function-decl name='cds_wfcq_dequeue_with_state_blocking' mangled-name='cds_wfcq_dequeue_with_state_blocking' filepath='src/wfcqueue.c' line='88' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_with_state_blocking'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='89' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='90' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfcqueue.c' line='91' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- cds_wfcq_node* cds_wfcq_dequeue_blocking(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_dequeue_blocking' mangled-name='cds_wfcq_dequeue_blocking' filepath='src/wfcqueue.c' line='81' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_blocking'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='82' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='83' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-22'/>
+    </function-decl>
+    <!-- void cds_wfcq_dequeue_unlock(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_dequeue_unlock' mangled-name='cds_wfcq_dequeue_unlock' filepath='src/wfcqueue.c' line='75' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_unlock'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_dequeue_lock(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_dequeue_lock' mangled-name='cds_wfcq_dequeue_lock' filepath='src/wfcqueue.c' line='69' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_lock'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- bool -->
+    <type-decl name='bool' size-in-bits='8' id='type-id-34'/>
+    <!-- bool cds_wfcq_enqueue(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_node*) -->
+    <function-decl name='cds_wfcq_enqueue' mangled-name='cds_wfcq_enqueue' filepath='src/wfcqueue.c' line='62' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_enqueue'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='62' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='63' column='1'/>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='64' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <!-- bool cds_wfcq_empty(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_empty' mangled-name='cds_wfcq_empty' filepath='src/wfcqueue.c' line='55' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_empty'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-28' name='head' filepath='src/wfcqueue.c' line='55' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='56' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <!-- void __cds_wfcq_init(__cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_init' mangled-name='__cds_wfcq_init' filepath='src/wfcqueue.c' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_init'>
+      <!-- parameter of type '__cds_wfcq_head*' -->
+      <parameter type-id='type-id-24' name='head' filepath='src/wfcqueue.c' line='49' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='50' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_destroy(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_destroy' mangled-name='cds_wfcq_destroy' filepath='src/wfcqueue.c' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_destroy'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_init(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_init' mangled-name='cds_wfcq_init' filepath='src/wfcqueue.c' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_init'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-30' name='tail' filepath='src/wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfcq_node_init(cds_wfcq_node*) -->
+    <function-decl name='cds_wfcq_node_init' mangled-name='cds_wfcq_node_init' filepath='src/wfcqueue.c' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_node_init'>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-22' name='node' filepath='src/wfcqueue.c' line='32' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='wfstack.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct cds_wfs_head -->
+    <class-decl name='cds_wfs_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='81' column='1' id='type-id-35'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_node cds_wfs_head::node -->
+        <var-decl name='node' type-id='type-id-36' visibility='default' filepath='../include/urcu/wfstack.h' line='82' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfs_node -->
+    <class-decl name='cds_wfs_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='71' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_node* cds_wfs_node::next -->
+        <var-decl name='next' type-id='type-id-37' visibility='default' filepath='../include/urcu/wfstack.h' line='72' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfs_node* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-37'/>
+    <!-- cds_wfs_head* -->
+    <pointer-type-def type-id='type-id-35' size-in-bits='64' id='type-id-38'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='109' column='1' id='type-id-39'>
+      <data-member access='private'>
+        <!-- __cds_wfs_stack* __anonymous_union__::_s -->
+        <var-decl name='_s' type-id='type-id-40' visibility='default' filepath='../include/urcu/wfstack.h' line='110' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_wfs_stack* __anonymous_union__::s -->
+        <var-decl name='s' type-id='type-id-41' visibility='default' filepath='../include/urcu/wfstack.h' line='111' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __cds_wfs_stack -->
+    <class-decl name='__cds_wfs_stack' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='85' column='1' id='type-id-42'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_head* __cds_wfs_stack::head -->
+        <var-decl name='head' type-id='type-id-38' visibility='default' filepath='../include/urcu/wfstack.h' line='86' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __cds_wfs_stack* -->
+    <pointer-type-def type-id='type-id-42' size-in-bits='64' id='type-id-40'/>
+    <!-- struct cds_wfs_stack -->
+    <class-decl name='cds_wfs_stack' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfstack.h' line='89' column='1' id='type-id-43'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_head* cds_wfs_stack::head -->
+        <var-decl name='head' type-id='type-id-38' visibility='default' filepath='../include/urcu/wfstack.h' line='90' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfs_stack::lock -->
+        <var-decl name='lock' type-id='type-id-5' visibility='default' filepath='../include/urcu/wfstack.h' line='91' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfs_stack* -->
+    <pointer-type-def type-id='type-id-43' size-in-bits='64' id='type-id-41'/>
+    <!-- typedef __anonymous_union__ cds_wfs_stack_ptr_t -->
+    <typedef-decl name='cds_wfs_stack_ptr_t' type-id='type-id-39' filepath='../include/urcu/wfstack.h' line='112' column='1' id='type-id-44'/>
+    <!-- cds_wfs_head* __cds_wfs_pop_all(cds_wfs_stack_ptr_t) -->
+    <function-decl name='__cds_wfs_pop_all' mangled-name='__cds_wfs_pop_all' filepath='src/wfstack.c' line='126' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_all'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='126' column='1'/>
+      <!-- cds_wfs_head* -->
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_with_state_nonblocking(cds_wfs_stack_ptr_t, int*) -->
+    <function-decl name='__cds_wfs_pop_with_state_nonblocking' mangled-name='__cds_wfs_pop_with_state_nonblocking' filepath='src/wfstack.c' line='120' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_with_state_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='120' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfstack.c' line='121' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_nonblocking(cds_wfs_stack_ptr_t) -->
+    <function-decl name='__cds_wfs_pop_nonblocking' mangled-name='__cds_wfs_pop_nonblocking' filepath='src/wfstack.c' line='114' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='114' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_with_state_blocking(cds_wfs_stack_ptr_t, int*) -->
+    <function-decl name='__cds_wfs_pop_with_state_blocking' mangled-name='__cds_wfs_pop_with_state_blocking' filepath='src/wfstack.c' line='108' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_with_state_blocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='120' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfstack.c' line='121' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_blocking(cds_wfs_stack_ptr_t) -->
+    <function-decl name='__cds_wfs_pop_blocking' mangled-name='__cds_wfs_pop_blocking' filepath='src/wfstack.c' line='102' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_blocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='114' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- void cds_wfs_pop_unlock(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_unlock' mangled-name='cds_wfs_pop_unlock' filepath='src/wfstack.c' line='97' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_unlock'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_pop_lock(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_lock' mangled-name='cds_wfs_pop_lock' filepath='src/wfstack.c' line='92' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_lock'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_next_nonblocking(cds_wfs_node*) -->
+    <function-decl name='cds_wfs_next_nonblocking' mangled-name='cds_wfs_next_nonblocking' filepath='src/wfstack.c' line='87' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_next_nonblocking'>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='87' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_next_blocking(cds_wfs_node*) -->
+    <function-decl name='cds_wfs_next_blocking' mangled-name='cds_wfs_next_blocking' filepath='src/wfstack.c' line='82' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_next_blocking'>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='87' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_first(cds_wfs_head*) -->
+    <function-decl name='cds_wfs_first' mangled-name='cds_wfs_first' filepath='src/wfstack.c' line='77' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_first'>
+      <!-- parameter of type 'cds_wfs_head*' -->
+      <parameter type-id='type-id-38' name='head' filepath='src/wfstack.c' line='77' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_head* cds_wfs_pop_all_blocking(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_all_blocking' mangled-name='cds_wfs_pop_all_blocking' filepath='src/wfstack.c' line='72' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_all_blocking'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='72' column='1'/>
+      <!-- cds_wfs_head* -->
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_pop_with_state_blocking(cds_wfs_stack*, int*) -->
+    <function-decl name='cds_wfs_pop_with_state_blocking' mangled-name='cds_wfs_pop_with_state_blocking' filepath='src/wfstack.c' line='67' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_with_state_blocking'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='67' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-33' name='state' filepath='src/wfstack.c' line='67' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_pop_blocking(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_blocking' mangled-name='cds_wfs_pop_blocking' filepath='src/wfstack.c' line='61' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_blocking'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='61' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- int cds_wfs_push(cds_wfs_stack_ptr_t, cds_wfs_node*) -->
+    <function-decl name='cds_wfs_push' mangled-name='cds_wfs_push' filepath='src/wfstack.c' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_push'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='56' column='1'/>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='56' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-10'/>
+    </function-decl>
+    <!-- bool cds_wfs_empty(cds_wfs_stack_ptr_t) -->
+    <function-decl name='cds_wfs_empty' mangled-name='cds_wfs_empty' filepath='src/wfstack.c' line='51' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_empty'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-44' name='u_stack' filepath='src/wfstack.c' line='51' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <!-- void __cds_wfs_init(__cds_wfs_stack*) -->
+    <function-decl name='__cds_wfs_init' mangled-name='__cds_wfs_init' filepath='src/wfstack.c' line='46' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_init'>
+      <!-- parameter of type '__cds_wfs_stack*' -->
+      <parameter type-id='type-id-40' name='s' filepath='src/wfstack.c' line='46' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_destroy(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_destroy' mangled-name='cds_wfs_destroy' filepath='src/wfstack.c' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_destroy'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_init(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_init' mangled-name='cds_wfs_init' filepath='src/wfstack.c' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_init'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='src/wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+    <!-- void cds_wfs_node_init(cds_wfs_node*) -->
+    <function-decl name='cds_wfs_node_init' mangled-name='cds_wfs_node_init' filepath='src/wfstack.c' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_node_init'>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='src/wfstack.c' line='31' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-20'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-5' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-45'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-48' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-49' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-50' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-50' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-50' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-49'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-51' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-51'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-11' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-11' size-in-bits='64' id='type-id-50'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-17' id='type-id-53'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='384' id='type-id-47'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-17' id='type-id-54'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-48'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-45' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-55'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-55' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-10' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-56'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-56' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-57'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-57' size-in-bits='64' id='type-id-58'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-59'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-60' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-61' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-9' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-60'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-9' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-61'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-59' const='yes' id='type-id-62'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-62' size-in-bits='64' id='type-id-63'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-10' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-63' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-10'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-10' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-63' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-58' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-10'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-mb.so.8.xml b/extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-mb.so.8.xml
new file mode 100644 (file)
index 0000000..d8e736d
--- /dev/null
@@ -0,0 +1,851 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-mb.so.8'>
+<!--
+SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_barrier -->
+    <elf-symbol name='urcu_mb_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu -->
+    <elf-symbol name='urcu_mb_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_mb_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_mb_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu_before_fork -->
+    <elf-symbol name='urcu_mb_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_call_rcu_data_free -->
+    <elf-symbol name='urcu_mb_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_mb_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_create_call_rcu_data -->
+    <elf-symbol name='urcu_mb_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_barrier -->
+    <elf-symbol name='urcu_mb_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_barrier_thread -->
+    <elf-symbol name='urcu_mb_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_exit -->
+    <elf-symbol name='urcu_mb_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_rcu -->
+    <elf-symbol name='urcu_mb_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_register_thread -->
+    <elf-symbol name='urcu_mb_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_defer_unregister_thread -->
+    <elf-symbol name='urcu_mb_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_mb_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_get_call_rcu_data -->
+    <elf-symbol name='urcu_mb_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_get_call_rcu_thread -->
+    <elf-symbol name='urcu_mb_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_mb_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_mb_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_mb_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_init -->
+    <elf-symbol name='urcu_mb_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_read_lock -->
+    <elf-symbol name='urcu_mb_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_read_ongoing -->
+    <elf-symbol name='urcu_mb_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_read_unlock -->
+    <elf-symbol name='urcu_mb_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_mb_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_register_thread -->
+    <elf-symbol name='urcu_mb_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_mb_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_mb_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_synchronize_rcu -->
+    <elf-symbol name='urcu_mb_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_mb_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_unregister_thread -->
+    <elf-symbol name='urcu_mb_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_flavor -->
+    <elf-symbol name='urcu_mb_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_gp -->
+    <elf-symbol name='urcu_mb_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_mb_reader -->
+    <elf-symbol name='urcu_mb_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='66' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='76' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-4' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-3'/>
+    <!-- urcu_gp urcu_mb_gp -->
+    <var-decl name='urcu_mb_gp' type-id='type-id-1' mangled-name='urcu_mb_gp' visibility='default' filepath='../include/urcu/static/urcu-mb.h' line='60' column='1' elf-symbol-id='urcu_mb_gp'/>
+    <!-- struct urcu_reader -->
+    <class-decl name='urcu_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='79' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='81' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char urcu_reader::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_reader::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_reader::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_reader::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='87' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- urcu_reader urcu_mb_reader -->
+    <var-decl name='urcu_mb_reader' type-id='type-id-6' mangled-name='urcu_mb_reader' visibility='default' filepath='../include/urcu/static/urcu-mb.h' line='62' column='1' elf-symbol-id='urcu_mb_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='58' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct urcu_mb_flavor -->
+    <var-decl name='urcu_mb_flavor' type-id='type-id-35' mangled-name='urcu_mb_flavor' visibility='default' filepath='../include/urcu/flavor.h' line='81' column='1' elf-symbol-id='urcu_mb_flavor'/>
+    <!-- void urcu_mb_defer_exit() -->
+    <function-decl name='urcu_mb_defer_exit' mangled-name='urcu_mb_defer_exit' filepath='src/urcu-defer-impl.h' line='467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_defer_unregister_thread() -->
+    <function-decl name='urcu_mb_defer_unregister_thread' mangled-name='urcu_mb_defer_unregister_thread' filepath='src/urcu-defer-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_defer_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_mb_defer_register_thread() -->
+    <function-decl name='urcu_mb_defer_register_thread' mangled-name='urcu_mb_defer_register_thread' filepath='src/urcu-defer-impl.h' line='427' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_mb_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_mb_defer_rcu' mangled-name='urcu_mb_defer_rcu' filepath='src/urcu-defer-impl.h' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_defer_rcu'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_defer_barrier() -->
+    <function-decl name='urcu_mb_defer_barrier' mangled-name='urcu_mb_defer_barrier' filepath='src/urcu-defer-impl.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_defer_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_defer_barrier_thread() -->
+    <function-decl name='urcu_mb_defer_barrier_thread' mangled-name='urcu_mb_defer_barrier_thread' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_defer_barrier_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_mb_unregister_rculfhash_atfork' mangled-name='urcu_mb_unregister_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_unregister_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_mb_register_rculfhash_atfork' mangled-name='urcu_mb_register_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1002' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_register_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_mb_call_rcu_after_fork_child' mangled-name='urcu_mb_call_rcu_after_fork_child' filepath='src/urcu-call-rcu-impl.h' line='960' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_call_rcu_after_fork_child'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_mb_call_rcu_after_fork_parent' mangled-name='urcu_mb_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='938' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_call_rcu_before_fork() -->
+    <function-decl name='urcu_mb_call_rcu_before_fork' mangled-name='urcu_mb_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='911' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_barrier() -->
+    <function-decl name='urcu_mb_barrier' mangled-name='urcu_mb_barrier' filepath='src/urcu-call-rcu-impl.h' line='840' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_mb_free_all_cpu_call_rcu_data' mangled-name='urcu_mb_free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='777' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='140' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='141' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='71' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-2' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_mb_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_mb_call_rcu_data_free' mangled-name='urcu_mb_call_rcu_data_free' filepath='src/urcu-call-rcu-impl.h' line='742' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_call_rcu_data_free'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='742' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_mb_call_rcu' mangled-name='urcu_mb_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='704' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='704' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='705' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_mb_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_mb_create_all_cpu_call_rcu_data' mangled-name='urcu_mb_create_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_create_all_cpu_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='626' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_mb_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_mb_set_thread_call_rcu_data' mangled-name='urcu_mb_set_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_set_thread_call_rcu_data'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='613' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_mb_get_thread_call_rcu_data' mangled-name='urcu_mb_get_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='597' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_get_thread_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_get_call_rcu_data() -->
+    <function-decl name='urcu_mb_get_call_rcu_data' mangled-name='urcu_mb_get_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_get_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_get_default_call_rcu_data() -->
+    <function-decl name='urcu_mb_get_default_call_rcu_data' mangled-name='urcu_mb_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_mb_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_mb_set_cpu_call_rcu_data' mangled-name='urcu_mb_set_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_set_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_mb_create_call_rcu_data' mangled-name='urcu_mb_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='489' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='489' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='490' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_mb_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_mb_get_call_rcu_thread' mangled-name='urcu_mb_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='471' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='471' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_mb_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_mb_get_cpu_call_rcu_data' mangled-name='urcu_mb_get_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_get_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='449' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_mb_unregister_thread() -->
+    <function-decl name='urcu_mb_unregister_thread' mangled-name='urcu_mb_unregister_thread' filepath='src/urcu.c' line='546' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_register_thread() -->
+    <function-decl name='urcu_mb_register_thread' mangled-name='urcu_mb_register_thread' filepath='src/urcu.c' line='532' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_mb_read_ongoing() -->
+    <function-decl name='urcu_mb_read_ongoing' mangled-name='urcu_mb_read_ongoing' filepath='src/urcu.c' line='527' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_read_ongoing'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_mb_read_unlock() -->
+    <function-decl name='urcu_mb_read_unlock' mangled-name='urcu_mb_read_unlock' filepath='src/urcu.c' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_read_unlock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_read_lock() -->
+    <function-decl name='urcu_mb_read_lock' mangled-name='urcu_mb_read_lock' filepath='src/urcu.c' line='517' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_read_lock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_synchronize_rcu() -->
+    <function-decl name='urcu_mb_synchronize_rcu' mangled-name='urcu_mb_synchronize_rcu' filepath='src/urcu.c' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_mb_init() -->
+    <function-decl name='urcu_mb_init' mangled-name='urcu_mb_init' filepath='src/urcu.c' line='103' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_mb_init'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-2' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-2' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-memb.so.8.xml b/extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-memb.so.8.xml
new file mode 100644 (file)
index 0000000..7df5cad
--- /dev/null
@@ -0,0 +1,855 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-memb.so.8'>
+<!--
+SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_barrier -->
+    <elf-symbol name='urcu_memb_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu -->
+    <elf-symbol name='urcu_memb_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_memb_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_memb_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_before_fork -->
+    <elf-symbol name='urcu_memb_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_data_free -->
+    <elf-symbol name='urcu_memb_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_create_call_rcu_data -->
+    <elf-symbol name='urcu_memb_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_barrier -->
+    <elf-symbol name='urcu_memb_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_barrier_thread -->
+    <elf-symbol name='urcu_memb_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_exit -->
+    <elf-symbol name='urcu_memb_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_rcu -->
+    <elf-symbol name='urcu_memb_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_register_thread -->
+    <elf-symbol name='urcu_memb_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_unregister_thread -->
+    <elf-symbol name='urcu_memb_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_call_rcu_thread -->
+    <elf-symbol name='urcu_memb_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_init -->
+    <elf-symbol name='urcu_memb_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_lock -->
+    <elf-symbol name='urcu_memb_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_ongoing -->
+    <elf-symbol name='urcu_memb_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_unlock -->
+    <elf-symbol name='urcu_memb_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_memb_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_register_thread -->
+    <elf-symbol name='urcu_memb_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_memb_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_synchronize_rcu -->
+    <elf-symbol name='urcu_memb_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_memb_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_unregister_thread -->
+    <elf-symbol name='urcu_memb_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_flavor -->
+    <elf-symbol name='urcu_memb_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_gp -->
+    <elf-symbol name='urcu_memb_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_has_sys_membarrier -->
+    <elf-symbol name='urcu_memb_has_sys_membarrier' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_reader -->
+    <elf-symbol name='urcu_memb_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <!-- int urcu_memb_has_sys_membarrier -->
+    <var-decl name='urcu_memb_has_sys_membarrier' type-id='type-id-1' mangled-name='urcu_memb_has_sys_membarrier' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='72' column='1' elf-symbol-id='urcu_memb_has_sys_membarrier'/>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='66' column='1' id='type-id-2'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-4' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='76' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-1' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-4'/>
+    <!-- urcu_gp urcu_memb_gp -->
+    <var-decl name='urcu_memb_gp' type-id='type-id-2' mangled-name='urcu_memb_gp' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='83' column='1' elf-symbol-id='urcu_memb_gp'/>
+    <!-- struct urcu_reader -->
+    <class-decl name='urcu_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='79' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='81' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char urcu_reader::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_reader::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_reader::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_reader::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='87' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- urcu_reader urcu_memb_reader -->
+    <var-decl name='urcu_memb_reader' type-id='type-id-6' mangled-name='urcu_memb_reader' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='85' column='1' elf-symbol-id='urcu_memb_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='58' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct urcu_memb_flavor -->
+    <var-decl name='urcu_memb_flavor' type-id='type-id-35' mangled-name='urcu_memb_flavor' visibility='default' filepath='../include/urcu/flavor.h' line='81' column='1' elf-symbol-id='urcu_memb_flavor'/>
+    <!-- void urcu_memb_defer_exit() -->
+    <function-decl name='urcu_memb_defer_exit' mangled-name='urcu_memb_defer_exit' filepath='src/urcu-defer-impl.h' line='467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_unregister_thread() -->
+    <function-decl name='urcu_memb_defer_unregister_thread' mangled-name='urcu_memb_defer_unregister_thread' filepath='src/urcu-defer-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_defer_register_thread() -->
+    <function-decl name='urcu_memb_defer_register_thread' mangled-name='urcu_memb_defer_register_thread' filepath='src/urcu-defer-impl.h' line='427' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_memb_defer_rcu' mangled-name='urcu_memb_defer_rcu' filepath='src/urcu-defer-impl.h' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_rcu'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_barrier() -->
+    <function-decl name='urcu_memb_defer_barrier' mangled-name='urcu_memb_defer_barrier' filepath='src/urcu-defer-impl.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_barrier_thread() -->
+    <function-decl name='urcu_memb_defer_barrier_thread' mangled-name='urcu_memb_defer_barrier_thread' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_barrier_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_memb_unregister_rculfhash_atfork' mangled-name='urcu_memb_unregister_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_unregister_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_memb_register_rculfhash_atfork' mangled-name='urcu_memb_register_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1002' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_register_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_memb_call_rcu_after_fork_child' mangled-name='urcu_memb_call_rcu_after_fork_child' filepath='src/urcu-call-rcu-impl.h' line='960' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_after_fork_child'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_memb_call_rcu_after_fork_parent' mangled-name='urcu_memb_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='938' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_before_fork() -->
+    <function-decl name='urcu_memb_call_rcu_before_fork' mangled-name='urcu_memb_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='911' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_barrier() -->
+    <function-decl name='urcu_memb_barrier' mangled-name='urcu_memb_barrier' filepath='src/urcu-call-rcu-impl.h' line='840' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_memb_free_all_cpu_call_rcu_data' mangled-name='urcu_memb_free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='777' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-1' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='140' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='141' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='71' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_memb_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_memb_call_rcu_data_free' mangled-name='urcu_memb_call_rcu_data_free' filepath='src/urcu-call-rcu-impl.h' line='742' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_data_free'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='742' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_memb_call_rcu' mangled-name='urcu_memb_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='704' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='704' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='705' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_memb_create_all_cpu_call_rcu_data' mangled-name='urcu_memb_create_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_create_all_cpu_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='626' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_memb_set_thread_call_rcu_data' mangled-name='urcu_memb_set_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_set_thread_call_rcu_data'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='613' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_thread_call_rcu_data' mangled-name='urcu_memb_get_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='597' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_thread_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_call_rcu_data' mangled-name='urcu_memb_get_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_default_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_default_call_rcu_data' mangled-name='urcu_memb_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_memb_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_memb_set_cpu_call_rcu_data' mangled-name='urcu_memb_set_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_set_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_memb_create_call_rcu_data' mangled-name='urcu_memb_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='489' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='489' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='490' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_memb_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_memb_get_call_rcu_thread' mangled-name='urcu_memb_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='471' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='471' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_memb_get_cpu_call_rcu_data' mangled-name='urcu_memb_get_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='449' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_memb_init() -->
+    <function-decl name='urcu_memb_init' mangled-name='urcu_memb_init' filepath='src/urcu.c' line='594' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_init'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_unregister_thread() -->
+    <function-decl name='urcu_memb_unregister_thread' mangled-name='urcu_memb_unregister_thread' filepath='src/urcu.c' line='546' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_register_thread() -->
+    <function-decl name='urcu_memb_register_thread' mangled-name='urcu_memb_register_thread' filepath='src/urcu.c' line='532' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_read_ongoing() -->
+    <function-decl name='urcu_memb_read_ongoing' mangled-name='urcu_memb_read_ongoing' filepath='src/urcu.c' line='527' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_ongoing'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_read_unlock() -->
+    <function-decl name='urcu_memb_read_unlock' mangled-name='urcu_memb_read_unlock' filepath='src/urcu.c' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_unlock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_read_lock() -->
+    <function-decl name='urcu_memb_read_lock' mangled-name='urcu_memb_read_lock' filepath='src/urcu.c' line='517' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_lock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_synchronize_rcu() -->
+    <function-decl name='urcu_memb_synchronize_rcu' mangled-name='urcu_memb_synchronize_rcu' filepath='src/urcu.c' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-qsbr.so.8.xml b/extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-qsbr.so.8.xml
new file mode 100644 (file)
index 0000000..848eb7a
--- /dev/null
@@ -0,0 +1,872 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-qsbr.so.8'>
+<!--
+SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_barrier -->
+    <elf-symbol name='urcu_qsbr_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu -->
+    <elf-symbol name='urcu_qsbr_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_qsbr_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_qsbr_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu_before_fork -->
+    <elf-symbol name='urcu_qsbr_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_call_rcu_data_free -->
+    <elf-symbol name='urcu_qsbr_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_create_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_barrier -->
+    <elf-symbol name='urcu_qsbr_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_barrier_thread -->
+    <elf-symbol name='urcu_qsbr_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_exit -->
+    <elf-symbol name='urcu_qsbr_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_rcu -->
+    <elf-symbol name='urcu_qsbr_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_register_thread -->
+    <elf-symbol name='urcu_qsbr_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_defer_unregister_thread -->
+    <elf-symbol name='urcu_qsbr_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_exit -->
+    <elf-symbol name='urcu_qsbr_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_get_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_get_call_rcu_thread -->
+    <elf-symbol name='urcu_qsbr_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_quiescent_state -->
+    <elf-symbol name='urcu_qsbr_quiescent_state' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_read_lock -->
+    <elf-symbol name='urcu_qsbr_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_read_ongoing -->
+    <elf-symbol name='urcu_qsbr_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_read_unlock -->
+    <elf-symbol name='urcu_qsbr_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_qsbr_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_register_thread -->
+    <elf-symbol name='urcu_qsbr_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_qsbr_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_synchronize_rcu -->
+    <elf-symbol name='urcu_qsbr_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_thread_offline -->
+    <elf-symbol name='urcu_qsbr_thread_offline' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_thread_online -->
+    <elf-symbol name='urcu_qsbr_thread_online' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_qsbr_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_unregister_thread -->
+    <elf-symbol name='urcu_qsbr_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_flavor -->
+    <elf-symbol name='urcu_qsbr_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_gp -->
+    <elf-symbol name='urcu_qsbr_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_qsbr_reader -->
+    <elf-symbol name='urcu_qsbr_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu-qsbr.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='66' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='76' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-4' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-3'/>
+    <!-- urcu_gp urcu_qsbr_gp -->
+    <var-decl name='urcu_qsbr_gp' type-id='type-id-1' mangled-name='urcu_qsbr_gp' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='63' column='1' elf-symbol-id='urcu_qsbr_gp'/>
+    <!-- struct urcu_qsbr_reader -->
+    <class-decl name='urcu_qsbr_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='65' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_qsbr_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_qsbr_reader::node -->
+        <var-decl name='node' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- int urcu_qsbr_reader::waiting -->
+        <var-decl name='waiting' type-id='type-id-4' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1216'>
+        <!-- pthread_t urcu_qsbr_reader::tid -->
+        <var-decl name='tid' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='71' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_qsbr_reader::registered -->
+        <var-decl name='registered' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='73' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-7'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-10' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-10' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-7' size-in-bits='64' id='type-id-10'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-8'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-9'/>
+    <!-- urcu_qsbr_reader urcu_qsbr_reader -->
+    <var-decl name='urcu_qsbr_reader' type-id='type-id-6' mangled-name='urcu_qsbr_reader' visibility='default' filepath='../include/urcu/static/urcu-qsbr.h' line='76' column='1' elf-symbol-id='urcu_qsbr_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-11'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-12' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-17'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-12'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-20'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-21' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='58' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-23' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-23'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-24'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-25' size-in-bits='64' id='type-id-22'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-14'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-27'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-29'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-30' size-in-bits='64' id='type-id-15'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-31'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-29' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-29' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-29' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-27' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-32'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-16'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-11' const='yes' id='type-id-34'/>
+    <!-- const rcu_flavor_struct urcu_qsbr_flavor -->
+    <var-decl name='urcu_qsbr_flavor' type-id='type-id-34' mangled-name='urcu_qsbr_flavor' visibility='default' filepath='../include/urcu/flavor.h' line='81' column='1' elf-symbol-id='urcu_qsbr_flavor'/>
+    <!-- void urcu_qsbr_defer_exit() -->
+    <function-decl name='urcu_qsbr_defer_exit' mangled-name='urcu_qsbr_defer_exit' filepath='src/urcu-defer-impl.h' line='467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_defer_unregister_thread() -->
+    <function-decl name='urcu_qsbr_defer_unregister_thread' mangled-name='urcu_qsbr_defer_unregister_thread' filepath='src/urcu-defer-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_defer_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int urcu_qsbr_defer_register_thread() -->
+    <function-decl name='urcu_qsbr_defer_register_thread' mangled-name='urcu_qsbr_defer_register_thread' filepath='src/urcu-defer-impl.h' line='427' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_qsbr_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_qsbr_defer_rcu' mangled-name='urcu_qsbr_defer_rcu' filepath='src/urcu-defer-impl.h' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_defer_rcu'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-29' name='fct' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='p' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_defer_barrier() -->
+    <function-decl name='urcu_qsbr_defer_barrier' mangled-name='urcu_qsbr_defer_barrier' filepath='src/urcu-defer-impl.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_defer_barrier'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_defer_barrier_thread() -->
+    <function-decl name='urcu_qsbr_defer_barrier_thread' mangled-name='urcu_qsbr_defer_barrier_thread' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_defer_barrier_thread'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_qsbr_unregister_rculfhash_atfork' mangled-name='urcu_qsbr_unregister_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_unregister_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-32' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_qsbr_register_rculfhash_atfork' mangled-name='urcu_qsbr_register_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1002' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_register_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-32' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_qsbr_call_rcu_after_fork_child' mangled-name='urcu_qsbr_call_rcu_after_fork_child' filepath='src/urcu-call-rcu-impl.h' line='960' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_call_rcu_after_fork_child'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_qsbr_call_rcu_after_fork_parent' mangled-name='urcu_qsbr_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='938' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_call_rcu_before_fork() -->
+    <function-decl name='urcu_qsbr_call_rcu_before_fork' mangled-name='urcu_qsbr_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='911' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_barrier() -->
+    <function-decl name='urcu_qsbr_barrier' mangled-name='urcu_qsbr_barrier' filepath='src/urcu-call-rcu-impl.h' line='840' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_barrier'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_qsbr_free_all_cpu_call_rcu_data' mangled-name='urcu_qsbr_free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='777' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-35'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-36' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-7' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='140' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-23' visibility='default' filepath='../include/urcu/wfcqueue.h' line='141' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='71' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-21' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-38' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-39'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-40' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-40'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-43'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-45'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-46' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-46'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-45' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-44'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-47'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='320' id='type-id-41'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-2' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-42'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-39' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-38'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-35' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_qsbr_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_qsbr_call_rcu_data_free' mangled-name='urcu_qsbr_call_rcu_data_free' filepath='src/urcu-call-rcu-impl.h' line='742' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_call_rcu_data_free'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='742' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_qsbr_call_rcu' mangled-name='urcu_qsbr_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='704' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-24' name='head' filepath='src/urcu-call-rcu-impl.h' line='704' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-22' name='func' filepath='src/urcu-call-rcu-impl.h' line='705' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int urcu_qsbr_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_qsbr_create_all_cpu_call_rcu_data' mangled-name='urcu_qsbr_create_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_create_all_cpu_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='626' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_qsbr_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_qsbr_set_thread_call_rcu_data' mangled-name='urcu_qsbr_set_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_set_thread_call_rcu_data'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='613' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_qsbr_get_thread_call_rcu_data' mangled-name='urcu_qsbr_get_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='597' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_get_thread_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_get_call_rcu_data() -->
+    <function-decl name='urcu_qsbr_get_call_rcu_data' mangled-name='urcu_qsbr_get_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_get_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_get_default_call_rcu_data() -->
+    <function-decl name='urcu_qsbr_get_default_call_rcu_data' mangled-name='urcu_qsbr_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_qsbr_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_qsbr_set_cpu_call_rcu_data' mangled-name='urcu_qsbr_set_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_set_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_qsbr_create_call_rcu_data' mangled-name='urcu_qsbr_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='489' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='489' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='490' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_qsbr_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_qsbr_get_call_rcu_thread' mangled-name='urcu_qsbr_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='471' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='471' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-8'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_qsbr_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_qsbr_get_cpu_call_rcu_data' mangled-name='urcu_qsbr_get_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_get_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='449' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_qsbr_exit() -->
+    <function-decl name='urcu_qsbr_exit' mangled-name='urcu_qsbr_exit' filepath='src/urcu-qsbr.c' line='497' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_exit'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_unregister_thread() -->
+    <function-decl name='urcu_qsbr_unregister_thread' mangled-name='urcu_qsbr_unregister_thread' filepath='src/urcu-qsbr.c' line='483' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_register_thread() -->
+    <function-decl name='urcu_qsbr_register_thread' mangled-name='urcu_qsbr_register_thread' filepath='src/urcu-qsbr.c' line='470' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_thread_online() -->
+    <function-decl name='urcu_qsbr_thread_online' mangled-name='urcu_qsbr_thread_online' filepath='src/urcu-qsbr.c' line='465' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_thread_online'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_thread_offline() -->
+    <function-decl name='urcu_qsbr_thread_offline' mangled-name='urcu_qsbr_thread_offline' filepath='src/urcu-qsbr.c' line='459' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_thread_offline'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_quiescent_state() -->
+    <function-decl name='urcu_qsbr_quiescent_state' mangled-name='urcu_qsbr_quiescent_state' filepath='src/urcu-qsbr.c' line='453' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_quiescent_state'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int urcu_qsbr_read_ongoing() -->
+    <function-decl name='urcu_qsbr_read_ongoing' mangled-name='urcu_qsbr_read_ongoing' filepath='src/urcu-qsbr.c' line='447' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_read_ongoing'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_qsbr_read_unlock() -->
+    <function-decl name='urcu_qsbr_read_unlock' mangled-name='urcu_qsbr_read_unlock' filepath='src/urcu-qsbr.c' line='442' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_read_unlock'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_read_lock() -->
+    <function-decl name='urcu_qsbr_read_lock' mangled-name='urcu_qsbr_read_lock' filepath='src/urcu-qsbr.c' line='437' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_read_lock'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- void urcu_qsbr_synchronize_rcu() -->
+    <function-decl name='urcu_qsbr_synchronize_rcu' mangled-name='urcu_qsbr_synchronize_rcu' filepath='src/urcu-qsbr.c' line='347' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_qsbr_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-18'>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-25'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-24'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-24'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-22'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-33'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-32'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-30'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-29'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-28'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27'/>
+      <!-- void -->
+      <return type-id='type-id-17'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-27' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-27'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-38' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-9' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-2' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-47' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-2' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-42' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-42' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-signal.so.8.xml b/extras/abi/0.14/x86_64-pc-linux-gnu/liburcu-signal.so.8.xml
new file mode 100644 (file)
index 0000000..0321432
--- /dev/null
@@ -0,0 +1,858 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-signal.so.8'>
+<!--
+SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_barrier -->
+    <elf-symbol name='urcu_signal_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu -->
+    <elf-symbol name='urcu_signal_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_signal_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_signal_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu_before_fork -->
+    <elf-symbol name='urcu_signal_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_call_rcu_data_free -->
+    <elf-symbol name='urcu_signal_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_signal_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_create_call_rcu_data -->
+    <elf-symbol name='urcu_signal_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_defer_barrier -->
+    <elf-symbol name='urcu_signal_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_defer_barrier_thread -->
+    <elf-symbol name='urcu_signal_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_defer_exit -->
+    <elf-symbol name='urcu_signal_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_defer_rcu -->
+    <elf-symbol name='urcu_signal_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_defer_register_thread -->
+    <elf-symbol name='urcu_signal_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_defer_unregister_thread -->
+    <elf-symbol name='urcu_signal_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_exit -->
+    <elf-symbol name='urcu_signal_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_signal_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_get_call_rcu_data -->
+    <elf-symbol name='urcu_signal_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_get_call_rcu_thread -->
+    <elf-symbol name='urcu_signal_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_signal_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_signal_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_signal_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_init -->
+    <elf-symbol name='urcu_signal_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_read_lock -->
+    <elf-symbol name='urcu_signal_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_read_ongoing -->
+    <elf-symbol name='urcu_signal_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_read_unlock -->
+    <elf-symbol name='urcu_signal_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_signal_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_register_thread -->
+    <elf-symbol name='urcu_signal_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_signal_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_signal_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_synchronize_rcu -->
+    <elf-symbol name='urcu_signal_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_signal_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_unregister_thread -->
+    <elf-symbol name='urcu_signal_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_flavor -->
+    <elf-symbol name='urcu_signal_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_gp -->
+    <elf-symbol name='urcu_signal_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_signal_reader -->
+    <elf-symbol name='urcu_signal_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='66' column='1' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='76' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-2'/>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-4' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-3'/>
+    <!-- urcu_gp urcu_signal_gp -->
+    <var-decl name='urcu_signal_gp' type-id='type-id-1' mangled-name='urcu_signal_gp' visibility='default' filepath='../include/urcu/static/urcu-signal.h' line='61' column='1' elf-symbol-id='urcu_signal_gp'/>
+    <!-- struct urcu_reader -->
+    <class-decl name='urcu_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='79' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-2' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='81' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char urcu_reader::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_reader::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_reader::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_reader::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='87' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- urcu_reader urcu_signal_reader -->
+    <var-decl name='urcu_signal_reader' type-id='type-id-6' mangled-name='urcu_signal_reader' visibility='default' filepath='../include/urcu/static/urcu-signal.h' line='63' column='1' elf-symbol-id='urcu_signal_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='58' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct urcu_signal_flavor -->
+    <var-decl name='urcu_signal_flavor' type-id='type-id-35' mangled-name='urcu_signal_flavor' visibility='default' filepath='../include/urcu/flavor.h' line='81' column='1' elf-symbol-id='urcu_signal_flavor'/>
+    <!-- void urcu_signal_defer_exit() -->
+    <function-decl name='urcu_signal_defer_exit' mangled-name='urcu_signal_defer_exit' filepath='src/urcu-defer-impl.h' line='467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_defer_unregister_thread() -->
+    <function-decl name='urcu_signal_defer_unregister_thread' mangled-name='urcu_signal_defer_unregister_thread' filepath='src/urcu-defer-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_defer_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_signal_defer_register_thread() -->
+    <function-decl name='urcu_signal_defer_register_thread' mangled-name='urcu_signal_defer_register_thread' filepath='src/urcu-defer-impl.h' line='427' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_signal_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_signal_defer_rcu' mangled-name='urcu_signal_defer_rcu' filepath='src/urcu-defer-impl.h' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_defer_rcu'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_defer_barrier() -->
+    <function-decl name='urcu_signal_defer_barrier' mangled-name='urcu_signal_defer_barrier' filepath='src/urcu-defer-impl.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_defer_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_defer_barrier_thread() -->
+    <function-decl name='urcu_signal_defer_barrier_thread' mangled-name='urcu_signal_defer_barrier_thread' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_defer_barrier_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_signal_unregister_rculfhash_atfork' mangled-name='urcu_signal_unregister_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_unregister_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_signal_register_rculfhash_atfork' mangled-name='urcu_signal_register_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1002' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_register_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_signal_call_rcu_after_fork_child' mangled-name='urcu_signal_call_rcu_after_fork_child' filepath='src/urcu-call-rcu-impl.h' line='960' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_call_rcu_after_fork_child'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_signal_call_rcu_after_fork_parent' mangled-name='urcu_signal_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='938' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_call_rcu_before_fork() -->
+    <function-decl name='urcu_signal_call_rcu_before_fork' mangled-name='urcu_signal_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='911' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_barrier() -->
+    <function-decl name='urcu_signal_barrier' mangled-name='urcu_signal_barrier' filepath='src/urcu-call-rcu-impl.h' line='840' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_signal_free_all_cpu_call_rcu_data' mangled-name='urcu_signal_free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='777' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-2' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='140' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='141' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='71' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-4' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-2' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_signal_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_signal_call_rcu_data_free' mangled-name='urcu_signal_call_rcu_data_free' filepath='src/urcu-call-rcu-impl.h' line='742' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_call_rcu_data_free'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='742' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_signal_call_rcu' mangled-name='urcu_signal_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='704' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='704' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='705' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_signal_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_signal_create_all_cpu_call_rcu_data' mangled-name='urcu_signal_create_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_create_all_cpu_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='626' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_signal_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_signal_set_thread_call_rcu_data' mangled-name='urcu_signal_set_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_set_thread_call_rcu_data'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='613' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_signal_get_thread_call_rcu_data' mangled-name='urcu_signal_get_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='597' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_get_thread_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_get_call_rcu_data() -->
+    <function-decl name='urcu_signal_get_call_rcu_data' mangled-name='urcu_signal_get_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_get_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_get_default_call_rcu_data() -->
+    <function-decl name='urcu_signal_get_default_call_rcu_data' mangled-name='urcu_signal_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_signal_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_signal_set_cpu_call_rcu_data' mangled-name='urcu_signal_set_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_set_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_signal_create_call_rcu_data' mangled-name='urcu_signal_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='489' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-2' name='flags' filepath='src/urcu-call-rcu-impl.h' line='489' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='490' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_signal_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_signal_get_call_rcu_thread' mangled-name='urcu_signal_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='471' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='471' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_signal_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_signal_get_cpu_call_rcu_data' mangled-name='urcu_signal_get_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_get_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='449' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_signal_exit() -->
+    <function-decl name='urcu_signal_exit' mangled-name='urcu_signal_exit' filepath='src/urcu.c' line='643' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_exit'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_init() -->
+    <function-decl name='urcu_signal_init' mangled-name='urcu_signal_init' filepath='src/urcu.c' line='626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_init'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_unregister_thread() -->
+    <function-decl name='urcu_signal_unregister_thread' mangled-name='urcu_signal_unregister_thread' filepath='src/urcu.c' line='546' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_register_thread() -->
+    <function-decl name='urcu_signal_register_thread' mangled-name='urcu_signal_register_thread' filepath='src/urcu.c' line='532' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_signal_read_ongoing() -->
+    <function-decl name='urcu_signal_read_ongoing' mangled-name='urcu_signal_read_ongoing' filepath='src/urcu.c' line='527' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_read_ongoing'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void urcu_signal_read_unlock() -->
+    <function-decl name='urcu_signal_read_unlock' mangled-name='urcu_signal_read_unlock' filepath='src/urcu.c' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_read_unlock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_read_lock() -->
+    <function-decl name='urcu_signal_read_lock' mangled-name='urcu_signal_read_lock' filepath='src/urcu.c' line='517' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_read_lock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_signal_synchronize_rcu() -->
+    <function-decl name='urcu_signal_synchronize_rcu' mangled-name='urcu_signal_synchronize_rcu' filepath='src/urcu.c' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_signal_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-2' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-2' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-4' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-3' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.14/x86_64-pc-linux-gnu/liburcu.so.8.xml b/extras/abi/0.14/x86_64-pc-linux-gnu/liburcu.so.8.xml
new file mode 100644 (file)
index 0000000..e9bfeaa
--- /dev/null
@@ -0,0 +1,855 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu.so.8'>
+<!--
+SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- _fini -->
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _init -->
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_barrier -->
+    <elf-symbol name='urcu_memb_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu -->
+    <elf-symbol name='urcu_memb_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_after_fork_child -->
+    <elf-symbol name='urcu_memb_call_rcu_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_after_fork_parent -->
+    <elf-symbol name='urcu_memb_call_rcu_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_before_fork -->
+    <elf-symbol name='urcu_memb_call_rcu_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_call_rcu_data_free -->
+    <elf-symbol name='urcu_memb_call_rcu_data_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_create_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_create_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_create_call_rcu_data -->
+    <elf-symbol name='urcu_memb_create_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_barrier -->
+    <elf-symbol name='urcu_memb_defer_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_barrier_thread -->
+    <elf-symbol name='urcu_memb_defer_barrier_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_exit -->
+    <elf-symbol name='urcu_memb_defer_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_rcu -->
+    <elf-symbol name='urcu_memb_defer_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_register_thread -->
+    <elf-symbol name='urcu_memb_defer_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_defer_unregister_thread -->
+    <elf-symbol name='urcu_memb_defer_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_free_all_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_call_rcu_thread -->
+    <elf-symbol name='urcu_memb_get_call_rcu_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_default_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_default_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_get_thread_call_rcu_data -->
+    <elf-symbol name='urcu_memb_get_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_init -->
+    <elf-symbol name='urcu_memb_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_lock -->
+    <elf-symbol name='urcu_memb_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_ongoing -->
+    <elf-symbol name='urcu_memb_read_ongoing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_read_unlock -->
+    <elf-symbol name='urcu_memb_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_register_rculfhash_atfork -->
+    <elf-symbol name='urcu_memb_register_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_register_thread -->
+    <elf-symbol name='urcu_memb_register_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_set_cpu_call_rcu_data -->
+    <elf-symbol name='urcu_memb_set_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_set_thread_call_rcu_data -->
+    <elf-symbol name='urcu_memb_set_thread_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_synchronize_rcu -->
+    <elf-symbol name='urcu_memb_synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_unregister_rculfhash_atfork -->
+    <elf-symbol name='urcu_memb_unregister_rculfhash_atfork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_unregister_thread -->
+    <elf-symbol name='urcu_memb_unregister_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_flavor -->
+    <elf-symbol name='urcu_memb_flavor' size='112' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_gp -->
+    <elf-symbol name='urcu_memb_gp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_has_sys_membarrier -->
+    <elf-symbol name='urcu_memb_has_sys_membarrier' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_memb_reader -->
+    <elf-symbol name='urcu_memb_reader' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <!-- int urcu_memb_has_sys_membarrier -->
+    <var-decl name='urcu_memb_has_sys_membarrier' type-id='type-id-1' mangled-name='urcu_memb_has_sys_membarrier' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='72' column='1' elf-symbol-id='urcu_memb_has_sys_membarrier'/>
+    <!-- struct urcu_gp -->
+    <class-decl name='urcu_gp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='66' column='1' id='type-id-2'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_gp::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t urcu_gp::futex -->
+        <var-decl name='futex' type-id='type-id-4' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='76' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-1' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-5'/>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-4'/>
+    <!-- urcu_gp urcu_memb_gp -->
+    <var-decl name='urcu_memb_gp' type-id='type-id-2' mangled-name='urcu_memb_gp' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='83' column='1' elf-symbol-id='urcu_memb_gp'/>
+    <!-- struct urcu_reader -->
+    <class-decl name='urcu_reader' size-in-bits='2048' is-struct='yes' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='79' column='1' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int urcu_reader::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='81' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char urcu_reader::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-7' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head urcu_reader::node -->
+        <var-decl name='node' type-id='type-id-8' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t urcu_reader::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int urcu_reader::registered -->
+        <var-decl name='registered' type-id='type-id-10' visibility='default' filepath='../include/urcu/static/urcu-common.h' line='87' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-7'/>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/list.h' line='37' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-11' visibility='default' filepath='../include/urcu/list.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-11'/>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-9'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-10'/>
+    <!-- urcu_reader urcu_memb_reader -->
+    <var-decl name='urcu_memb_reader' type-id='type-id-6' mangled-name='urcu_memb_reader' visibility='default' filepath='../include/urcu/static/urcu-memb.h' line='85' column='1' elf-symbol-id='urcu_memb_reader'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='896' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='42' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='44' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-14' visibility='default' filepath='../include/urcu/flavor.h' line='45' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='46' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-15' visibility='default' filepath='../include/urcu/flavor.h' line='47' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='49' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-16' visibility='default' filepath='../include/urcu/flavor.h' line='50' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='52' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='55' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-13' visibility='default' filepath='../include/urcu/flavor.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::register_rculfhash_atfork -->
+        <var-decl name='register_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='59' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- void (urcu_atfork*)* rcu_flavor_struct::unregister_rculfhash_atfork -->
+        <var-decl name='unregister_rculfhash_atfork' type-id='type-id-17' visibility='default' filepath='../include/urcu/flavor.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- void -->
+    <type-decl name='void' id='type-id-18'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-13'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-14'/>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='../include/urcu/call-rcu.h' line='57' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-22' visibility='default' filepath='../include/urcu/call-rcu.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-23' visibility='default' filepath='../include/urcu/call-rcu.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='58' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='59' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-24'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-25'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-23'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-15'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-28'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-16'/>
+    <!-- struct urcu_atfork -->
+    <class-decl name='urcu_atfork' size-in-bits='256' is-struct='yes' visibility='default' filepath='../include/urcu/flavor.h' line='32' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void (void*)* urcu_atfork::before_fork -->
+        <var-decl name='before_fork' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (void*)* urcu_atfork::after_fork_parent -->
+        <var-decl name='after_fork_parent' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (void*)* urcu_atfork::after_fork_child -->
+        <var-decl name='after_fork_child' type-id='type-id-30' visibility='default' filepath='../include/urcu/flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void* urcu_atfork::priv -->
+        <var-decl name='priv' type-id='type-id-28' visibility='default' filepath='../include/urcu/flavor.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- urcu_atfork* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- void (urcu_atfork*)* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-17'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-35'/>
+    <!-- const rcu_flavor_struct urcu_memb_flavor -->
+    <var-decl name='urcu_memb_flavor' type-id='type-id-35' mangled-name='urcu_memb_flavor' visibility='default' filepath='../include/urcu/flavor.h' line='81' column='1' elf-symbol-id='urcu_memb_flavor'/>
+    <!-- void urcu_memb_defer_exit() -->
+    <function-decl name='urcu_memb_defer_exit' mangled-name='urcu_memb_defer_exit' filepath='src/urcu-defer-impl.h' line='467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_exit'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_unregister_thread() -->
+    <function-decl name='urcu_memb_defer_unregister_thread' mangled-name='urcu_memb_defer_unregister_thread' filepath='src/urcu-defer-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_defer_register_thread() -->
+    <function-decl name='urcu_memb_defer_register_thread' mangled-name='urcu_memb_defer_register_thread' filepath='src/urcu-defer-impl.h' line='427' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_register_thread'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_rcu(void (void*)*, void*) -->
+    <function-decl name='urcu_memb_defer_rcu' mangled-name='urcu_memb_defer_rcu' filepath='src/urcu-defer-impl.h' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_rcu'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30' name='fct' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-defer-impl.h' line='396' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_barrier() -->
+    <function-decl name='urcu_memb_defer_barrier' mangled-name='urcu_memb_defer_barrier' filepath='src/urcu-defer-impl.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_defer_barrier_thread() -->
+    <function-decl name='urcu_memb_defer_barrier_thread' mangled-name='urcu_memb_defer_barrier_thread' filepath='src/urcu-defer-impl.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_defer_barrier_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_unregister_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_memb_unregister_rculfhash_atfork' mangled-name='urcu_memb_unregister_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_unregister_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_register_rculfhash_atfork(urcu_atfork*) -->
+    <function-decl name='urcu_memb_register_rculfhash_atfork' mangled-name='urcu_memb_register_rculfhash_atfork' filepath='src/urcu-call-rcu-impl.h' line='1002' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_register_rculfhash_atfork'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33' name='atfork' filepath='src/urcu-call-rcu-impl.h' line='1012' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_after_fork_child() -->
+    <function-decl name='urcu_memb_call_rcu_after_fork_child' mangled-name='urcu_memb_call_rcu_after_fork_child' filepath='src/urcu-call-rcu-impl.h' line='960' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_after_fork_child'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_after_fork_parent() -->
+    <function-decl name='urcu_memb_call_rcu_after_fork_parent' mangled-name='urcu_memb_call_rcu_after_fork_parent' filepath='src/urcu-call-rcu-impl.h' line='938' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu_before_fork() -->
+    <function-decl name='urcu_memb_call_rcu_before_fork' mangled-name='urcu_memb_call_rcu_before_fork' filepath='src/urcu-call-rcu-impl.h' line='911' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_barrier() -->
+    <function-decl name='urcu_memb_barrier' mangled-name='urcu_memb_barrier' filepath='src/urcu-call-rcu-impl.h' line='840' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_barrier'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_free_all_cpu_call_rcu_data() -->
+    <function-decl name='urcu_memb_free_all_cpu_call_rcu_data' mangled-name='urcu_memb_free_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='777' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='53' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-37' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-38' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-4' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-9' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-1' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-8' visibility='default' filepath='src/urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='140' column='1' id='type-id-37'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='../include/urcu/wfcqueue.h' line='141' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='../include/urcu/wfcqueue.h' line='71' column='1' id='type-id-38'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-22' visibility='default' filepath='../include/urcu/wfcqueue.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-39' visibility='default' filepath='../include/urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-40'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-41' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[40] -->
+        <var-decl name='__size' type-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-43' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='118' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='121' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='122' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='124' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-44' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='154' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='155' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-44'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='82' column='1' id='type-id-46'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='85' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='86' column='1' id='type-id-45'/>
+
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='320' id='type-id-42'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-43'/>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-40' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-39'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-49'/>
+    <!-- void urcu_memb_call_rcu_data_free(call_rcu_data*) -->
+    <function-decl name='urcu_memb_call_rcu_data_free' mangled-name='urcu_memb_call_rcu_data_free' filepath='src/urcu-call-rcu-impl.h' line='742' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu_data_free'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='742' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_call_rcu(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='urcu_memb_call_rcu' mangled-name='urcu_memb_call_rcu' filepath='src/urcu-call-rcu-impl.h' line='704' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_call_rcu'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25' name='head' filepath='src/urcu-call-rcu-impl.h' line='704' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23' name='func' filepath='src/urcu-call-rcu-impl.h' line='705' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_create_all_cpu_call_rcu_data(unsigned long int) -->
+    <function-decl name='urcu_memb_create_all_cpu_call_rcu_data' mangled-name='urcu_memb_create_all_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_create_all_cpu_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='626' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_set_thread_call_rcu_data(call_rcu_data*) -->
+    <function-decl name='urcu_memb_set_thread_call_rcu_data' mangled-name='urcu_memb_set_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_set_thread_call_rcu_data'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='613' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_thread_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_thread_call_rcu_data' mangled-name='urcu_memb_get_thread_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='597' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_thread_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_call_rcu_data' mangled-name='urcu_memb_get_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_default_call_rcu_data() -->
+    <function-decl name='urcu_memb_get_default_call_rcu_data' mangled-name='urcu_memb_get_default_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_default_call_rcu_data'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- int urcu_memb_set_cpu_call_rcu_data(int, call_rcu_data*) -->
+    <function-decl name='urcu_memb_set_cpu_call_rcu_data' mangled-name='urcu_memb_set_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_set_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='513' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_create_call_rcu_data(unsigned long int, int) -->
+    <function-decl name='urcu_memb_create_call_rcu_data' mangled-name='urcu_memb_create_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='489' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_create_call_rcu_data'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='src/urcu-call-rcu-impl.h' line='489' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu_affinity' filepath='src/urcu-call-rcu-impl.h' line='490' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- pthread_t urcu_memb_get_call_rcu_thread(call_rcu_data*) -->
+    <function-decl name='urcu_memb_get_call_rcu_thread' mangled-name='urcu_memb_get_call_rcu_thread' filepath='src/urcu-call-rcu-impl.h' line='471' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_call_rcu_thread'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-49' name='crdp' filepath='src/urcu-call-rcu-impl.h' line='471' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* urcu_memb_get_cpu_call_rcu_data(int) -->
+    <function-decl name='urcu_memb_get_cpu_call_rcu_data' mangled-name='urcu_memb_get_cpu_call_rcu_data' filepath='src/urcu-call-rcu-impl.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_get_cpu_call_rcu_data'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='cpu' filepath='src/urcu-call-rcu-impl.h' line='449' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-49'/>
+    </function-decl>
+    <!-- void urcu_memb_init() -->
+    <function-decl name='urcu_memb_init' mangled-name='urcu_memb_init' filepath='src/urcu.c' line='594' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_init'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_unregister_thread() -->
+    <function-decl name='urcu_memb_unregister_thread' mangled-name='urcu_memb_unregister_thread' filepath='src/urcu.c' line='546' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_unregister_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_register_thread() -->
+    <function-decl name='urcu_memb_register_thread' mangled-name='urcu_memb_register_thread' filepath='src/urcu.c' line='532' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_register_thread'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int urcu_memb_read_ongoing() -->
+    <function-decl name='urcu_memb_read_ongoing' mangled-name='urcu_memb_read_ongoing' filepath='src/urcu.c' line='527' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_ongoing'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void urcu_memb_read_unlock() -->
+    <function-decl name='urcu_memb_read_unlock' mangled-name='urcu_memb_read_unlock' filepath='src/urcu.c' line='522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_unlock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_read_lock() -->
+    <function-decl name='urcu_memb_read_lock' mangled-name='urcu_memb_read_lock' filepath='src/urcu.c' line='517' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_read_lock'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- void urcu_memb_synchronize_rcu() -->
+    <function-decl name='urcu_memb_synchronize_rcu' mangled-name='urcu_memb_synchronize_rcu' filepath='src/urcu.c' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='urcu_memb_synchronize_rcu'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-20'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-19'>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-26'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-27'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-25'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-23'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (urcu_atfork*) -->
+    <function-type size-in-bits='64' id='type-id-34'>
+      <!-- parameter of type 'urcu_atfork*' -->
+      <parameter type-id='type-id-33'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-31'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-30'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-29'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28'/>
+      <!-- void -->
+      <return type-id='type-id-18'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-50'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='src/urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='old' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='_new' filepath='src/urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='src/urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='src/urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-50' name='p' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='v' filepath='src/urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='src/urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-28' name='p' filepath='src/urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-28'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='src' language='LANG_C99'>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-39' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='src/compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __anonymous_union__::__data -->
+        <var-decl name='__data' type-id='type-id-52' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __anonymous_union__::__size[48] -->
+        <var-decl name='__size' type-id='type-id-53' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __anonymous_union__::__align -->
+        <var-decl name='__align' type-id='type-id-54' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='171' column='1' id='type-id-52'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __anonymous_union__  -->
+        <var-decl name='' type-id='type-id-55' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='191' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='192' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='193' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='194' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='195' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union __anonymous_union__ -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='173' column='1' id='type-id-55'>
+      <data-member access='private'>
+        <!-- long long unsigned int __anonymous_union__::__wseq -->
+        <var-decl name='__wseq' type-id='type-id-57' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='175' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- __anonymous_struct__ __anonymous_union__::__wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='180' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-57'/>
+    <!-- struct __anonymous_struct__ -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='176' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __anonymous_struct__::__low -->
+        <var-decl name='__low' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='178' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __anonymous_struct__::__high -->
+        <var-decl name='__high' type-id='type-id-10' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='179' column='1'/>
+      </data-member>
+    </class-decl>
+
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-10' size-in-bits='64' id='type-id-56'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-59'/>
+
+    </array-type-def>
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='384' id='type-id-53'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-60'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-54'/>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-61'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-61' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='src/compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-62'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='9' column='1' id='type-id-63'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-64'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-43' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='184' column='1' id='type-id-65'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-63' const='yes' id='type-id-66'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-67'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='src/compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val' filepath='src/compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val3' filepath='src/compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='src/compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val' filepath='src/compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-67' name='timeout' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-62' name='uaddr2' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-4' name='val3' filepath='src/compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.9/x86_64-pc-linux-gnu/liburcu-bp.so.4.xml b/extras/abi/0.9/x86_64-pc-linux-gnu/liburcu-bp.so.4.xml
new file mode 100644 (file)
index 0000000..0ee16cb
--- /dev/null
@@ -0,0 +1,841 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-bp.so.4'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='liburcu-common.so.4'/>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- call_rcu_after_fork_child_bp -->
+    <elf-symbol name='call_rcu_after_fork_child_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_bp -->
+    <elf-symbol name='call_rcu_after_fork_parent_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_bp -->
+    <elf-symbol name='call_rcu_before_fork_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_bp -->
+    <elf-symbol name='call_rcu_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_data_free_bp -->
+    <elf-symbol name='call_rcu_data_free_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_bp -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_call_rcu_data_bp -->
+    <elf-symbol name='create_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- defer_rcu_bp -->
+    <elf-symbol name='defer_rcu_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data_bp -->
+    <elf-symbol name='free_all_cpu_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_data_bp -->
+    <elf-symbol name='get_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_thread_bp -->
+    <elf-symbol name='get_call_rcu_thread_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_bp -->
+    <elf-symbol name='get_cpu_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_bp -->
+    <elf-symbol name='get_default_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_bp -->
+    <elf-symbol name='get_thread_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_barrier_bp -->
+    <elf-symbol name='rcu_barrier_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_bp_after_fork_child -->
+    <elf-symbol name='rcu_bp_after_fork_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_bp_after_fork_parent -->
+    <elf-symbol name='rcu_bp_after_fork_parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_bp_before_fork -->
+    <elf-symbol name='rcu_bp_before_fork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_bp_register -->
+    <elf-symbol name='rcu_bp_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym_bp -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_bp -->
+    <elf-symbol name='rcu_defer_barrier_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_bp -->
+    <elf-symbol name='rcu_defer_barrier_thread_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_exit_bp -->
+    <elf-symbol name='rcu_defer_exit_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_bp -->
+    <elf-symbol name='rcu_defer_register_thread_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_bp -->
+    <elf-symbol name='rcu_defer_unregister_thread_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym_bp -->
+    <elf-symbol name='rcu_dereference_sym_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_lock_bp -->
+    <elf-symbol name='rcu_read_lock_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_ongoing_bp -->
+    <elf-symbol name='rcu_read_ongoing_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_unlock_bp -->
+    <elf-symbol name='rcu_read_unlock_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym_bp -->
+    <elf-symbol name='rcu_set_pointer_sym_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym_bp -->
+    <elf-symbol name='rcu_xchg_pointer_sym_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_bp -->
+    <elf-symbol name='set_cpu_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_bp -->
+    <elf-symbol name='set_thread_call_rcu_data_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- synchronize_rcu_bp -->
+    <elf-symbol name='synchronize_rcu_bp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_bp -->
+    <elf-symbol name='rcu_flavor_bp' size='96' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_gp_bp -->
+    <elf-symbol name='rcu_gp_bp' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_reader_bp -->
+    <elf-symbol name='rcu_reader_bp' size='8' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- urcu_bp_has_sys_membarrier -->
+    <elf-symbol name='urcu_bp_has_sys_membarrier' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu-bp.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='320' id='type-id-2'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-4'/>
+
+    </array-type-def>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-5'/>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-6'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-7'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-8'/>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- void -->
+    <type-decl name='void' id='type-id-9'/>
+    <!-- struct rcu_gp_bp -->
+    <class-decl name='rcu_gp_bp' size-in-bits='1024' is-struct='yes' visibility='default' filepath='urcu/static/urcu-bp.h' line='76' column='1' id='type-id-10'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_gp_bp::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='urcu/static/urcu-bp.h' line='84' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct rcu_reader_bp -->
+    <class-decl name='rcu_reader_bp' size-in-bits='2048' is-struct='yes' visibility='default' filepath='urcu/static/urcu-bp.h' line='89' column='1' id='type-id-11'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_reader_bp::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='urcu/static/urcu-bp.h' line='91' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head rcu_reader_bp::node -->
+        <var-decl name='node' type-id='type-id-12' visibility='default' filepath='urcu/static/urcu-bp.h' line='93' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t rcu_reader_bp::tid -->
+        <var-decl name='tid' type-id='type-id-13' visibility='default' filepath='urcu/static/urcu-bp.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1216'>
+        <!-- int rcu_reader_bp::alloc -->
+        <var-decl name='alloc' type-id='type-id-5' visibility='default' filepath='urcu/static/urcu-bp.h' line='95' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='./urcu/list.h' line='35' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-14' visibility='default' filepath='./urcu/list.h' line='36' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-14' visibility='default' filepath='./urcu/list.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/bits/pthreadtypes.h' line='27' column='1' id='type-id-13'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='768' is-struct='yes' visibility='default' filepath='./urcu-flavor.h' line='30' column='1' id='type-id-15'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-16' visibility='default' filepath='./urcu-flavor.h' line='31' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-16' visibility='default' filepath='./urcu-flavor.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-17' visibility='default' filepath='./urcu-flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-16' visibility='default' filepath='./urcu-flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-16' visibility='default' filepath='./urcu-flavor.h' line='37' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-19' visibility='default' filepath='./urcu-flavor.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-16' visibility='default' filepath='./urcu-flavor.h' line='40' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-16' visibility='default' filepath='./urcu-flavor.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-16' visibility='default' filepath='./urcu-flavor.h' line='42' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-16' visibility='default' filepath='./urcu-flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-16' visibility='default' filepath='./urcu-flavor.h' line='45' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='./urcu-call-rcu.h' line='59' column='1' id='type-id-20'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-21' visibility='default' filepath='./urcu-call-rcu.h' line='60' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-22' visibility='default' filepath='./urcu-call-rcu.h' line='61' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='59' column='1' id='type-id-21'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-23' visibility='default' filepath='urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='urcu-call-rcu-impl.h' line='54' column='1' id='type-id-24'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-25' visibility='default' filepath='urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-26' visibility='default' filepath='urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-27' visibility='default' filepath='urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-13' visibility='default' filepath='urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-5' visibility='default' filepath='urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-12' visibility='default' filepath='urcu-call-rcu-impl.h' line='70' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='127' column='1' id='type-id-25'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-23' visibility='default' filepath='urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='72' column='1' id='type-id-26'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-21' visibility='default' filepath='urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-28' visibility='default' filepath='urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-29' filepath='/usr/include/bits/pthreadtypes.h' line='72' column='1' id='type-id-28'/>
+    <!-- union {__pthread_mutex_s __data; char __size[40]; long int __align;} -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='67' column='1' id='type-id-29'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __data -->
+        <var-decl name='__data' type-id='type-id-30' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __size[40] -->
+        <var-decl name='__size' type-id='type-id-2' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __align -->
+        <var-decl name='__align' type-id='type-id-6' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='22' column='1' id='type-id-30'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-5' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='24' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='25' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-5' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='26' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='28' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-5' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-7' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-7' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-31' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-32' filepath='/usr/include/bits/thread-shared-types.h' line='53' column='1' id='type-id-31'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='49' column='1' id='type-id-32'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-33' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='51' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-33' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='52' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-34' filepath='/usr/include/bits/stdint-intn.h' line='26' column='1' id='type-id-27'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-5' filepath='/usr/include/bits/types.h' line='41' column='1' id='type-id-34'/>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-24' size-in-bits='64' id='type-id-35'/>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-12' size-in-bits='64' id='type-id-14'/>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-23'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-15' const='yes' id='type-id-36'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-37' size-in-bits='64' id='type-id-17'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-38'/>
+    <!-- rcu_reader_bp* -->
+    <pointer-type-def type-id='type-id-11' size-in-bits='64' id='type-id-39'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-40' size-in-bits='64' id='type-id-16'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-41' size-in-bits='64' id='type-id-22'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-42' size-in-bits='64' id='type-id-18'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-43' size-in-bits='64' id='type-id-19'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-44' size-in-bits='64' id='type-id-45'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-9' size-in-bits='64' id='type-id-46'/>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/>
+    <!-- int urcu_bp_has_sys_membarrier -->
+    <var-decl name='urcu_bp_has_sys_membarrier' type-id='type-id-5' mangled-name='urcu_bp_has_sys_membarrier' visibility='default' filepath='urcu/static/urcu-bp.h' line='105' column='1' elf-symbol-id='urcu_bp_has_sys_membarrier'/>
+    <!-- rcu_gp_bp rcu_gp_bp -->
+    <var-decl name='rcu_gp_bp' type-id='type-id-10' mangled-name='rcu_gp_bp' visibility='default' filepath='urcu/static/urcu-bp.h' line='87' column='1' elf-symbol-id='rcu_gp_bp'/>
+    <!-- rcu_reader_bp* rcu_reader_bp -->
+    <var-decl name='rcu_reader_bp' type-id='type-id-39' mangled-name='rcu_reader_bp' visibility='default' filepath='urcu/static/urcu-bp.h' line='103' column='1' elf-symbol-id='rcu_reader_bp'/>
+    <!-- const rcu_flavor_struct rcu_flavor_bp -->
+    <var-decl name='rcu_flavor_bp' type-id='type-id-36' mangled-name='rcu_flavor_bp' visibility='default' filepath='./urcu-flavor.h' line='64' column='1' elf-symbol-id='rcu_flavor_bp'/>
+    <!-- void rcu_defer_exit_bp() -->
+    <function-decl name='rcu_defer_exit_bp' mangled-name='rcu_defer_exit_bp' filepath='urcu-defer-impl.h' line='466' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_exit_bp'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_defer_unregister_thread_bp() -->
+    <function-decl name='rcu_defer_unregister_thread_bp' mangled-name='rcu_defer_unregister_thread_bp' filepath='urcu-defer-impl.h' line='448' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_unregister_thread_bp'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int rcu_defer_register_thread_bp() -->
+    <function-decl name='rcu_defer_register_thread_bp' mangled-name='rcu_defer_register_thread_bp' filepath='urcu-defer-impl.h' line='426' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_register_thread_bp'>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- void defer_rcu_bp(void (void*)*, void*) -->
+    <function-decl name='defer_rcu_bp' mangled-name='defer_rcu_bp' filepath='urcu-defer-impl.h' line='395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_bp'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-45' name='fct' filepath='urcu-defer-impl.h' line='395' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-46' name='p' filepath='urcu-defer-impl.h' line='395' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_bp() -->
+    <function-decl name='rcu_defer_barrier_bp' mangled-name='rcu_defer_barrier_bp' filepath='urcu-defer-impl.h' line='281' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_bp'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_thread_bp() -->
+    <function-decl name='rcu_defer_barrier_thread_bp' mangled-name='rcu_defer_barrier_thread_bp' filepath='urcu-defer-impl.h' line='261' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_bp'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_child_bp() -->
+    <function-decl name='call_rcu_after_fork_child_bp' mangled-name='call_rcu_after_fork_child_bp' filepath='urcu-call-rcu-impl.h' line='949' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_bp'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_parent_bp() -->
+    <function-decl name='call_rcu_after_fork_parent_bp' mangled-name='call_rcu_after_fork_parent_bp' filepath='urcu-call-rcu-impl.h' line='931' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_parent_bp'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_before_fork_bp() -->
+    <function-decl name='call_rcu_before_fork_bp' mangled-name='call_rcu_before_fork_bp' filepath='urcu-call-rcu-impl.h' line='909' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_before_fork_bp'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_barrier_bp() -->
+    <function-decl name='rcu_barrier_bp' mangled-name='rcu_barrier_bp' filepath='urcu-call-rcu-impl.h' line='838' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_barrier_bp'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void free_all_cpu_call_rcu_data_bp() -->
+    <function-decl name='free_all_cpu_call_rcu_data_bp' mangled-name='free_all_cpu_call_rcu_data_bp' filepath='urcu-call-rcu-impl.h' line='775' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_all_cpu_call_rcu_data_bp'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_data_free_bp(call_rcu_data*) -->
+    <function-decl name='call_rcu_data_free_bp' mangled-name='call_rcu_data_free_bp' filepath='urcu-call-rcu-impl.h' line='743' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_data_free_bp'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='743' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_bp(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='call_rcu_bp' mangled-name='call_rcu_bp' filepath='urcu-call-rcu-impl.h' line='705' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_bp'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-38' name='head' filepath='urcu-call-rcu-impl.h' line='705' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-22' name='func' filepath='urcu-call-rcu-impl.h' line='706' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int create_all_cpu_call_rcu_data_bp(unsigned long int) -->
+    <function-decl name='create_all_cpu_call_rcu_data_bp' mangled-name='create_all_cpu_call_rcu_data_bp' filepath='urcu-call-rcu-impl.h' line='627' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_bp'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='urcu-call-rcu-impl.h' line='627' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- void set_thread_call_rcu_data_bp(call_rcu_data*) -->
+    <function-decl name='set_thread_call_rcu_data_bp' mangled-name='set_thread_call_rcu_data_bp' filepath='urcu-call-rcu-impl.h' line='614' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_thread_call_rcu_data_bp'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='614' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* get_thread_call_rcu_data_bp() -->
+    <function-decl name='get_thread_call_rcu_data_bp' mangled-name='get_thread_call_rcu_data_bp' filepath='urcu-call-rcu-impl.h' line='598' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_thread_call_rcu_data_bp'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- call_rcu_data* get_call_rcu_data_bp() -->
+    <function-decl name='get_call_rcu_data_bp' mangled-name='get_call_rcu_data_bp' filepath='urcu-call-rcu-impl.h' line='578' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_data_bp'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- call_rcu_data* get_default_call_rcu_data_bp() -->
+    <function-decl name='get_default_call_rcu_data_bp' mangled-name='get_default_call_rcu_data_bp' filepath='urcu-call-rcu-impl.h' line='553' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_default_call_rcu_data_bp'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- int set_cpu_call_rcu_data_bp(int, call_rcu_data*) -->
+    <function-decl name='set_cpu_call_rcu_data_bp' mangled-name='set_cpu_call_rcu_data_bp' filepath='urcu-call-rcu-impl.h' line='514' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_cpu_call_rcu_data_bp'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='cpu' filepath='urcu-call-rcu-impl.h' line='514' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='514' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- call_rcu_data* create_call_rcu_data_bp(unsigned long int, int) -->
+    <function-decl name='create_call_rcu_data_bp' mangled-name='create_call_rcu_data_bp' filepath='urcu-call-rcu-impl.h' line='490' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_call_rcu_data_bp'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='urcu-call-rcu-impl.h' line='490' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='cpu_affinity' filepath='urcu-call-rcu-impl.h' line='491' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- pthread_t get_call_rcu_thread_bp(call_rcu_data*) -->
+    <function-decl name='get_call_rcu_thread_bp' mangled-name='get_call_rcu_thread_bp' filepath='urcu-call-rcu-impl.h' line='472' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_thread_bp'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='472' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-13'/>
+    </function-decl>
+    <!-- call_rcu_data* get_cpu_call_rcu_data_bp(int) -->
+    <function-decl name='get_cpu_call_rcu_data_bp' mangled-name='get_cpu_call_rcu_data_bp' filepath='urcu-call-rcu-impl.h' line='450' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_bp'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='cpu' filepath='urcu-call-rcu-impl.h' line='450' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- void* rcu_cmpxchg_pointer_sym_bp(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym_bp' mangled-name='rcu_cmpxchg_pointer_sym_bp' filepath='urcu-bp.c' line='721' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym_bp'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-47' name='p' filepath='urcu-bp.c' line='721' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-46' name='old' filepath='urcu-bp.c' line='721' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-46' name='_new' filepath='urcu-bp.c' line='721' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-46'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym_bp(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym_bp' mangled-name='rcu_xchg_pointer_sym_bp' filepath='urcu-bp.c' line='715' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym_bp'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-47' name='p' filepath='urcu-bp.c' line='715' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-46' name='v' filepath='urcu-bp.c' line='715' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-46'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym_bp(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym_bp' mangled-name='rcu_set_pointer_sym_bp' filepath='urcu-bp.c' line='708' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym_bp'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-47' name='p' filepath='urcu-bp.c' line='708' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-46' name='v' filepath='urcu-bp.c' line='708' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-46'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym_bp(void*) -->
+    <function-decl name='rcu_dereference_sym_bp' mangled-name='rcu_dereference_sym_bp' filepath='urcu-bp.c' line='703' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym_bp'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-46' name='p' filepath='urcu-bp.c' line='703' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-46'/>
+    </function-decl>
+    <!-- void rcu_bp_after_fork_child() -->
+    <function-decl name='rcu_bp_after_fork_child' mangled-name='rcu_bp_after_fork_child' filepath='urcu-bp.c' line='690' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_bp_after_fork_child'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_bp_after_fork_parent() -->
+    <function-decl name='rcu_bp_after_fork_parent' mangled-name='rcu_bp_after_fork_parent' filepath='urcu-bp.c' line='655' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_bp_after_fork_parent'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_bp_before_fork() -->
+    <function-decl name='rcu_bp_before_fork' mangled-name='rcu_bp_before_fork' filepath='urcu-bp.c' line='641' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_bp_before_fork'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_bp_register() -->
+    <function-decl name='rcu_bp_register' mangled-name='rcu_bp_register' filepath='urcu-bp.c' line='518' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_bp_register'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int rcu_read_ongoing_bp() -->
+    <function-decl name='rcu_read_ongoing_bp' mangled-name='rcu_read_ongoing_bp' filepath='urcu-bp.c' line='351' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_ongoing_bp'>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- void rcu_read_unlock_bp() -->
+    <function-decl name='rcu_read_unlock_bp' mangled-name='rcu_read_unlock_bp' filepath='urcu-bp.c' line='346' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_unlock_bp'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_read_lock_bp() -->
+    <function-decl name='rcu_read_lock_bp' mangled-name='rcu_read_lock_bp' filepath='urcu-bp.c' line='341' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_lock_bp'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void synchronize_rcu_bp() -->
+    <function-decl name='synchronize_rcu_bp' mangled-name='synchronize_rcu_bp' filepath='urcu-bp.c' line='258' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='synchronize_rcu_bp'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-37'>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-40'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-41'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-38'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-42'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-38'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-22'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-43'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-45'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-46'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-44'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-46'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-47' name='p' filepath='urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-46' name='old' filepath='urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-46' name='_new' filepath='urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-46'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-47' name='p' filepath='urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-46' name='v' filepath='urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-46'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-47' name='p' filepath='urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-46' name='v' filepath='urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-46'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-46' name='p' filepath='urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-46'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='384' id='type-id-48'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-49'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-50'/>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-51'/>
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='64' id='type-id-52'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-53'/>
+
+    </array-type-def>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-54' filepath='/usr/include/bits/pthreadtypes.h' line='80' column='1' id='type-id-55'/>
+    <!-- union {__pthread_cond_s __data; char __size[48]; long long int __align;} -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='75' column='1' id='type-id-54'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __data -->
+        <var-decl name='__data' type-id='type-id-56' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __size[48] -->
+        <var-decl name='__size' type-id='type-id-48' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __align -->
+        <var-decl name='__align' type-id='type-id-50' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='92' column='1' id='type-id-56'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- union {long long unsigned int __wseq; struct {unsigned int __low; unsigned int __high;} __wseq32;} -->
+        <var-decl name='' type-id='type-id-57' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-52' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='112' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-52' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='113' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='114' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='115' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-52' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='116' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union {long long unsigned int __wseq; struct {unsigned int __low; unsigned int __high;} __wseq32;} -->
+    <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='94' column='1' id='type-id-57'>
+      <data-member access='private'>
+        <!-- long long unsigned int __wseq -->
+        <var-decl name='__wseq' type-id='type-id-51' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='96' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- struct {unsigned int __low; unsigned int __high;} __wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-58' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='101' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct {unsigned int __low; unsigned int __high;} -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='97' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __low -->
+        <var-decl name='__low' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='99' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __high -->
+        <var-decl name='__high' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='100' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='10' column='1' id='type-id-59'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-60' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-61' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='16' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-6' filepath='/usr/include/bits/types.h' line='160' column='1' id='type-id-60'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-6' filepath='/usr/include/bits/types.h' line='197' column='1' id='type-id-61'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-59' const='yes' id='type-id-62'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-62' size-in-bits='64' id='type-id-63'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-64'/>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-28' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-55' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-64' name='uaddr' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='op' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-27' name='val' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-63' name='timeout' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-64' name='uaddr2' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-27' name='val3' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-64' name='uaddr' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='op' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-27' name='val' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-63' name='timeout' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-64' name='uaddr2' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-27' name='val3' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.9/x86_64-pc-linux-gnu/liburcu-cds.so.4.xml b/extras/abi/0.9/x86_64-pc-linux-gnu/liburcu-cds.so.4.xml
new file mode 100644 (file)
index 0000000..58a6a9b
--- /dev/null
@@ -0,0 +1,1187 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-cds.so.4'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='liburcu-common.so.4'/>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- __cds_lfs_init -->
+    <elf-symbol name='__cds_lfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_lfs_pop -->
+    <elf-symbol name='__cds_lfs_pop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_lfs_pop_all -->
+    <elf-symbol name='__cds_lfs_pop_all' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- _cds_lfht_new -->
+    <elf-symbol name='_cds_lfht_new' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_add -->
+    <elf-symbol name='cds_lfht_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_add_replace -->
+    <elf-symbol name='cds_lfht_add_replace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_add_unique -->
+    <elf-symbol name='cds_lfht_add_unique' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_count_nodes -->
+    <elf-symbol name='cds_lfht_count_nodes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_del -->
+    <elf-symbol name='cds_lfht_del' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_destroy -->
+    <elf-symbol name='cds_lfht_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_first -->
+    <elf-symbol name='cds_lfht_first' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_fls_ulong -->
+    <elf-symbol name='cds_lfht_fls_ulong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_get_count_order_u32 -->
+    <elf-symbol name='cds_lfht_get_count_order_u32' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_get_count_order_ulong -->
+    <elf-symbol name='cds_lfht_get_count_order_ulong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_is_node_deleted -->
+    <elf-symbol name='cds_lfht_is_node_deleted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_lookup -->
+    <elf-symbol name='cds_lfht_lookup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_next -->
+    <elf-symbol name='cds_lfht_next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_next_duplicate -->
+    <elf-symbol name='cds_lfht_next_duplicate' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_replace -->
+    <elf-symbol name='cds_lfht_replace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_resize -->
+    <elf-symbol name='cds_lfht_resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_dequeue_rcu -->
+    <elf-symbol name='cds_lfq_dequeue_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_destroy_rcu -->
+    <elf-symbol name='cds_lfq_destroy_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_enqueue_rcu -->
+    <elf-symbol name='cds_lfq_enqueue_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_init_rcu -->
+    <elf-symbol name='cds_lfq_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfq_node_init_rcu -->
+    <elf-symbol name='cds_lfq_node_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_destroy -->
+    <elf-symbol name='cds_lfs_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_empty -->
+    <elf-symbol name='cds_lfs_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_init -->
+    <elf-symbol name='cds_lfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_init_rcu -->
+    <elf-symbol name='cds_lfs_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_node_init -->
+    <elf-symbol name='cds_lfs_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_node_init_rcu -->
+    <elf-symbol name='cds_lfs_node_init_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_all_blocking -->
+    <elf-symbol name='cds_lfs_pop_all_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_blocking -->
+    <elf-symbol name='cds_lfs_pop_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_lock -->
+    <elf-symbol name='cds_lfs_pop_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_rcu -->
+    <elf-symbol name='cds_lfs_pop_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_pop_unlock -->
+    <elf-symbol name='cds_lfs_pop_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_push -->
+    <elf-symbol name='cds_lfs_push' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfs_push_rcu -->
+    <elf-symbol name='cds_lfs_push_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_mm_chunk -->
+    <elf-symbol name='cds_lfht_mm_chunk' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_mm_mmap -->
+    <elf-symbol name='cds_lfht_mm_mmap' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_lfht_mm_order -->
+    <elf-symbol name='cds_lfht_mm_order' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='rculfqueue.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <!-- void -->
+    <type-decl name='void' id='type-id-2'/>
+    <!-- struct cds_lfq_node_rcu -->
+    <class-decl name='cds_lfq_node_rcu' size-in-bits='128' is-struct='yes' visibility='default' filepath='urcu/rculfqueue.h' line='35' column='1' id='type-id-3'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfq_node_rcu* cds_lfq_node_rcu::next -->
+        <var-decl name='next' type-id='type-id-4' visibility='default' filepath='urcu/rculfqueue.h' line='36' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int cds_lfq_node_rcu::dummy -->
+        <var-decl name='dummy' type-id='type-id-1' visibility='default' filepath='urcu/rculfqueue.h' line='37' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_lfq_queue_rcu -->
+    <class-decl name='cds_lfq_queue_rcu' size-in-bits='192' is-struct='yes' visibility='default' filepath='urcu/rculfqueue.h' line='40' column='1' id='type-id-5'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfq_node_rcu* cds_lfq_queue_rcu::head -->
+        <var-decl name='head' type-id='type-id-4' visibility='default' filepath='urcu/rculfqueue.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_lfq_node_rcu* cds_lfq_queue_rcu::tail -->
+        <var-decl name='tail' type-id='type-id-4' visibility='default' filepath='urcu/rculfqueue.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* cds_lfq_queue_rcu::queue_call_rcu -->
+        <var-decl name='queue_call_rcu' type-id='type-id-6' visibility='default' filepath='urcu/rculfqueue.h' line='42' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='./urcu-call-rcu.h' line='59' column='1' id='type-id-7'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-8' visibility='default' filepath='./urcu-call-rcu.h' line='60' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-9' visibility='default' filepath='./urcu-call-rcu.h' line='61' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='./urcu/wfcqueue.h' line='59' column='1' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-10' visibility='default' filepath='./urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfq_node_rcu* -->
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-4'/>
+    <!-- cds_lfq_queue_rcu* -->
+    <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-11'/>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-10'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-7' size-in-bits='64' id='type-id-12'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-13' size-in-bits='64' id='type-id-9'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-14' size-in-bits='64' id='type-id-6'/>
+    <!-- cds_lfq_node_rcu* cds_lfq_dequeue_rcu(cds_lfq_queue_rcu*) -->
+    <function-decl name='cds_lfq_dequeue_rcu' mangled-name='cds_lfq_dequeue_rcu' filepath='rculfqueue.c' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_dequeue_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-11' name='q' filepath='rculfqueue.c' line='56' column='1'/>
+      <!-- cds_lfq_node_rcu* -->
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <!-- void cds_lfq_enqueue_rcu(cds_lfq_queue_rcu*, cds_lfq_node_rcu*) -->
+    <function-decl name='cds_lfq_enqueue_rcu' mangled-name='cds_lfq_enqueue_rcu' filepath='rculfqueue.c' line='50' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_enqueue_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-11' name='q' filepath='rculfqueue.c' line='50' column='1'/>
+      <!-- parameter of type 'cds_lfq_node_rcu*' -->
+      <parameter type-id='type-id-4' name='node' filepath='rculfqueue.c' line='50' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- int cds_lfq_destroy_rcu(cds_lfq_queue_rcu*) -->
+    <function-decl name='cds_lfq_destroy_rcu' mangled-name='cds_lfq_destroy_rcu' filepath='rculfqueue.c' line='45' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_destroy_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-11' name='q' filepath='rculfqueue.c' line='45' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void cds_lfq_init_rcu(cds_lfq_queue_rcu*, void (rcu_head*, void (rcu_head*)*)*) -->
+    <function-decl name='cds_lfq_init_rcu' mangled-name='cds_lfq_init_rcu' filepath='rculfqueue.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_init_rcu'>
+      <!-- parameter of type 'cds_lfq_queue_rcu*' -->
+      <parameter type-id='type-id-11' name='q' filepath='rculfqueue.c' line='38' column='1'/>
+      <!-- parameter of type 'void (rcu_head*, void (rcu_head*)*)*' -->
+      <parameter type-id='type-id-6' name='queue_call_rcu' filepath='rculfqueue.c' line='39' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void cds_lfq_node_init_rcu(cds_lfq_node_rcu*) -->
+    <function-decl name='cds_lfq_node_init_rcu' mangled-name='cds_lfq_node_init_rcu' filepath='rculfqueue.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfq_node_init_rcu'>
+      <!-- parameter of type 'cds_lfq_node_rcu*' -->
+      <parameter type-id='type-id-4' name='node' filepath='rculfqueue.c' line='33' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-13'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-12'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-14'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-12'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-9'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfstack.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+    <!-- struct cds_lfs_node_rcu -->
+    <class-decl name='cds_lfs_node_rcu' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/rculfstack.h' line='37' column='1' id='type-id-15'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node_rcu* cds_lfs_node_rcu::next -->
+        <var-decl name='next' type-id='type-id-16' visibility='default' filepath='urcu/rculfstack.h' line='38' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_lfs_stack_rcu -->
+    <class-decl name='cds_lfs_stack_rcu' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/rculfstack.h' line='41' column='1' id='type-id-17'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node_rcu* cds_lfs_stack_rcu::head -->
+        <var-decl name='head' type-id='type-id-16' visibility='default' filepath='urcu/rculfstack.h' line='42' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- cds_lfs_node_rcu* -->
+    <pointer-type-def type-id='type-id-15' size-in-bits='64' id='type-id-16'/>
+    <!-- cds_lfs_stack_rcu* -->
+    <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-18'/>
+    <!-- cds_lfs_node_rcu* cds_lfs_pop_rcu(cds_lfs_stack_rcu*) -->
+    <function-decl name='cds_lfs_pop_rcu' mangled-name='cds_lfs_pop_rcu' filepath='rculfstack.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_rcu'>
+      <!-- parameter of type 'cds_lfs_stack_rcu*' -->
+      <parameter type-id='type-id-18' name='s' filepath='rculfstack.c' line='53' column='1'/>
+      <!-- cds_lfs_node_rcu* -->
+      <return type-id='type-id-16'/>
+    </function-decl>
+    <!-- int cds_lfs_push_rcu(cds_lfs_stack_rcu*, cds_lfs_node_rcu*) -->
+    <function-decl name='cds_lfs_push_rcu' mangled-name='cds_lfs_push_rcu' filepath='rculfstack.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_push_rcu'>
+      <!-- parameter of type 'cds_lfs_stack_rcu*' -->
+      <parameter type-id='type-id-18' name='s' filepath='rculfstack.c' line='47' column='1'/>
+      <!-- parameter of type 'cds_lfs_node_rcu*' -->
+      <parameter type-id='type-id-16' name='node' filepath='rculfstack.c' line='48' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- void cds_lfs_init_rcu(cds_lfs_stack_rcu*) -->
+    <function-decl name='cds_lfs_init_rcu' mangled-name='cds_lfs_init_rcu' filepath='rculfstack.c' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_init_rcu'>
+      <!-- parameter of type 'cds_lfs_stack_rcu*' -->
+      <parameter type-id='type-id-18' name='s' filepath='rculfstack.c' line='42' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void cds_lfs_node_init_rcu(cds_lfs_node_rcu*) -->
+    <function-decl name='cds_lfs_node_init_rcu' mangled-name='cds_lfs_node_init_rcu' filepath='rculfstack.c' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_node_init_rcu'>
+      <!-- parameter of type 'cds_lfs_node_rcu*' -->
+      <parameter type-id='type-id-16' name='node' filepath='rculfstack.c' line='37' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='lfstack.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+
+    <!-- bool -->
+    <type-decl name='bool' size-in-bits='8' id='type-id-19'/>
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-20'/>
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-20' size-in-bits='320' id='type-id-21'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-22' id='type-id-23'/>
+
+    </array-type-def>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-24'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-25'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-26'/>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-22'/>
+    <!-- struct cds_lfs_head -->
+    <class-decl name='cds_lfs_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/lfstack.h' line='69' column='1' id='type-id-27'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node cds_lfs_head::node -->
+        <var-decl name='node' type-id='type-id-28' visibility='default' filepath='urcu/lfstack.h' line='70' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_lfs_node -->
+    <class-decl name='cds_lfs_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/lfstack.h' line='59' column='1' id='type-id-28'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_node* cds_lfs_node::next -->
+        <var-decl name='next' type-id='type-id-29' visibility='default' filepath='urcu/lfstack.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __anonymous_union__ cds_lfs_stack_ptr_t -->
+    <typedef-decl name='cds_lfs_stack_ptr_t' type-id='type-id-30' filepath='urcu/lfstack.h' line='90' column='1' id='type-id-31'/>
+    <!-- union {__cds_lfs_stack* _s; cds_lfs_stack* s;} -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='urcu/lfstack.h' line='87' column='1' id='type-id-30'>
+      <data-member access='private'>
+        <!-- __cds_lfs_stack* _s -->
+        <var-decl name='_s' type-id='type-id-32' visibility='default' filepath='urcu/lfstack.h' line='88' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_lfs_stack* s -->
+        <var-decl name='s' type-id='type-id-33' visibility='default' filepath='urcu/lfstack.h' line='89' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __cds_lfs_stack -->
+    <class-decl name='__cds_lfs_stack' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/lfstack.h' line='73' column='1' id='type-id-34'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_head* __cds_lfs_stack::head -->
+        <var-decl name='head' type-id='type-id-35' visibility='default' filepath='urcu/lfstack.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_lfs_stack -->
+    <class-decl name='cds_lfs_stack' size-in-bits='384' is-struct='yes' visibility='default' filepath='urcu/lfstack.h' line='77' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfs_head* cds_lfs_stack::head -->
+        <var-decl name='head' type-id='type-id-35' visibility='default' filepath='urcu/lfstack.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_lfs_stack::lock -->
+        <var-decl name='lock' type-id='type-id-37' visibility='default' filepath='urcu/lfstack.h' line='79' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __anonymous_union__1 pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-38' filepath='/usr/include/bits/pthreadtypes.h' line='72' column='1' id='type-id-37'/>
+    <!-- union {__pthread_mutex_s __data; char __size[40]; long int __align;} -->
+    <union-decl name='__anonymous_union__1' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='67' column='1' id='type-id-38'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __data -->
+        <var-decl name='__data' type-id='type-id-39' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __size[40] -->
+        <var-decl name='__size' type-id='type-id-21' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __align -->
+        <var-decl name='__align' type-id='type-id-24' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='22' column='1' id='type-id-39'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-1' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='24' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-26' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='25' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-1' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='26' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-26' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='28' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-1' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-25' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-25' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-40' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-41' filepath='/usr/include/bits/thread-shared-types.h' line='53' column='1' id='type-id-40'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='49' column='1' id='type-id-41'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-42' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='51' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-42' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='52' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __cds_lfs_stack* -->
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-32'/>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-41' size-in-bits='64' id='type-id-42'/>
+    <!-- cds_lfs_head* -->
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-35'/>
+    <!-- cds_lfs_node* -->
+    <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-29'/>
+    <!-- cds_lfs_stack* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-33'/>
+    <!-- cds_lfs_head* __cds_lfs_pop_all(cds_lfs_stack_ptr_t) -->
+    <function-decl name='__cds_lfs_pop_all' mangled-name='__cds_lfs_pop_all' filepath='lfstack.c' line='88' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_lfs_pop_all'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-31' name='s' filepath='lfstack.c' line='88' column='1'/>
+      <!-- cds_lfs_head* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- cds_lfs_node* __cds_lfs_pop(cds_lfs_stack_ptr_t) -->
+    <function-decl name='__cds_lfs_pop' mangled-name='__cds_lfs_pop' filepath='lfstack.c' line='83' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_lfs_pop'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-31' name='s' filepath='lfstack.c' line='83' column='1'/>
+      <!-- cds_lfs_node* -->
+      <return type-id='type-id-29'/>
+    </function-decl>
+    <!-- void cds_lfs_pop_unlock(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_unlock' mangled-name='cds_lfs_pop_unlock' filepath='lfstack.c' line='78' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_unlock'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-33' name='s' filepath='lfstack.c' line='78' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void cds_lfs_pop_lock(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_lock' mangled-name='cds_lfs_pop_lock' filepath='lfstack.c' line='73' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_lock'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-33' name='s' filepath='lfstack.c' line='73' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- cds_lfs_head* cds_lfs_pop_all_blocking(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_all_blocking' mangled-name='cds_lfs_pop_all_blocking' filepath='lfstack.c' line='68' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_all_blocking'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-33' name='s' filepath='lfstack.c' line='68' column='1'/>
+      <!-- cds_lfs_head* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- cds_lfs_node* cds_lfs_pop_blocking(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_pop_blocking' mangled-name='cds_lfs_pop_blocking' filepath='lfstack.c' line='63' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_pop_blocking'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-33' name='s' filepath='lfstack.c' line='63' column='1'/>
+      <!-- cds_lfs_node* -->
+      <return type-id='type-id-29'/>
+    </function-decl>
+    <!-- bool cds_lfs_push(cds_lfs_stack_ptr_t, cds_lfs_node*) -->
+    <function-decl name='cds_lfs_push' mangled-name='cds_lfs_push' filepath='lfstack.c' line='58' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_push'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-31' name='s' filepath='lfstack.c' line='58' column='1'/>
+      <!-- parameter of type 'cds_lfs_node*' -->
+      <parameter type-id='type-id-29' name='node' filepath='lfstack.c' line='58' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-19'/>
+    </function-decl>
+    <!-- bool cds_lfs_empty(cds_lfs_stack_ptr_t) -->
+    <function-decl name='cds_lfs_empty' mangled-name='cds_lfs_empty' filepath='lfstack.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_empty'>
+      <!-- parameter of type 'typedef cds_lfs_stack_ptr_t' -->
+      <parameter type-id='type-id-31' name='s' filepath='lfstack.c' line='53' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-19'/>
+    </function-decl>
+    <!-- void __cds_lfs_init(__cds_lfs_stack*) -->
+    <function-decl name='__cds_lfs_init' mangled-name='__cds_lfs_init' filepath='lfstack.c' line='48' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_lfs_init'>
+      <!-- parameter of type '__cds_lfs_stack*' -->
+      <parameter type-id='type-id-32' name='s' filepath='lfstack.c' line='48' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void cds_lfs_destroy(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_destroy' mangled-name='cds_lfs_destroy' filepath='lfstack.c' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_destroy'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-33' name='s' filepath='lfstack.c' line='43' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void cds_lfs_init(cds_lfs_stack*) -->
+    <function-decl name='cds_lfs_init' mangled-name='cds_lfs_init' filepath='lfstack.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_init'>
+      <!-- parameter of type 'cds_lfs_stack*' -->
+      <parameter type-id='type-id-33' name='s' filepath='lfstack.c' line='38' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void cds_lfs_node_init(cds_lfs_node*) -->
+    <function-decl name='cds_lfs_node_init' mangled-name='cds_lfs_node_init' filepath='lfstack.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfs_node_init'>
+      <!-- parameter of type 'cds_lfs_node*' -->
+      <parameter type-id='type-id-29' name='node' filepath='lfstack.c' line='33' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+
+
+
+    <!-- cds_lfht_node*[64] -->
+    <array-type-def dimensions='1' type-id='type-id-43' size-in-bits='4096' id='type-id-44'>
+      <!-- <anonymous range>[64] -->
+      <subrange length='64' type-id='type-id-22' id='type-id-45'/>
+
+    </array-type-def>
+    <!-- cds_lfht_node*[] -->
+    <array-type-def dimensions='1' type-id='type-id-43' size-in-bits='infinite' id='type-id-46'>
+      <!-- <anonymous range>[] -->
+      <subrange length='infinite' type-id='type-id-22' id='type-id-47'/>
+
+    </array-type-def>
+    <!-- char[56] -->
+    <array-type-def dimensions='1' type-id='type-id-20' size-in-bits='448' id='type-id-48'>
+      <!-- <anonymous range>[56] -->
+      <subrange length='56' type-id='type-id-22' id='type-id-49'/>
+
+    </array-type-def>
+    <!-- struct cds_lfht -->
+    <class-decl name='cds_lfht' size-in-bits='5248' is-struct='yes' visibility='default' filepath='./rculfhash-internal.h' line='68' column='1' id='type-id-50'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int cds_lfht::max_nr_buckets -->
+        <var-decl name='max_nr_buckets' type-id='type-id-22' visibility='default' filepath='./rculfhash-internal.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- const cds_lfht_mm_type* cds_lfht::mm -->
+        <var-decl name='mm' type-id='type-id-51' visibility='default' filepath='./rculfhash-internal.h' line='71' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- const rcu_flavor_struct* cds_lfht::flavor -->
+        <var-decl name='flavor' type-id='type-id-52' visibility='default' filepath='./rculfhash-internal.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- long int cds_lfht::count -->
+        <var-decl name='count' type-id='type-id-24' visibility='default' filepath='./rculfhash-internal.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- pthread_mutex_t cds_lfht::resize_mutex -->
+        <var-decl name='resize_mutex' type-id='type-id-37' visibility='default' filepath='./rculfhash-internal.h' line='83' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- pthread_attr_t* cds_lfht::resize_attr -->
+        <var-decl name='resize_attr' type-id='type-id-53' visibility='default' filepath='./rculfhash-internal.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- unsigned int cds_lfht::in_progress_resize -->
+        <var-decl name='in_progress_resize' type-id='type-id-26' visibility='default' filepath='./rculfhash-internal.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='672'>
+        <!-- unsigned int cds_lfht::in_progress_destroy -->
+        <var-decl name='in_progress_destroy' type-id='type-id-26' visibility='default' filepath='./rculfhash-internal.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- unsigned long int cds_lfht::resize_target -->
+        <var-decl name='resize_target' type-id='type-id-22' visibility='default' filepath='./rculfhash-internal.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- int cds_lfht::resize_initiated -->
+        <var-decl name='resize_initiated' type-id='type-id-1' visibility='default' filepath='./rculfhash-internal.h' line='87' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='800'>
+        <!-- int cds_lfht::flags -->
+        <var-decl name='flags' type-id='type-id-1' visibility='default' filepath='./rculfhash-internal.h' line='92' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- unsigned long int cds_lfht::min_alloc_buckets_order -->
+        <var-decl name='min_alloc_buckets_order' type-id='type-id-22' visibility='default' filepath='./rculfhash-internal.h' line='93' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='896'>
+        <!-- unsigned long int cds_lfht::min_nr_alloc_buckets -->
+        <var-decl name='min_nr_alloc_buckets' type-id='type-id-22' visibility='default' filepath='./rculfhash-internal.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='960'>
+        <!-- ht_items_count* cds_lfht::split_count -->
+        <var-decl name='split_count' type-id='type-id-54' visibility='default' filepath='./rculfhash-internal.h' line='95' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- unsigned long int cds_lfht::size -->
+        <var-decl name='size' type-id='type-id-22' visibility='default' filepath='./rculfhash-internal.h' line='100' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1088'>
+        <!-- cds_lfht_node* (cds_lfht*, unsigned long int)* cds_lfht::bucket_at -->
+        <var-decl name='bucket_at' type-id='type-id-55' visibility='default' filepath='./rculfhash-internal.h' line='105' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- union {cds_lfht_node* tbl_order[64]; cds_lfht_node* tbl_chunk[]; cds_lfht_node* tbl_mmap;} -->
+        <var-decl name='' type-id='type-id-56' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_lfht_mm_type -->
+    <class-decl name='cds_lfht_mm_type' size-in-bits='256' is-struct='yes' visibility='default' filepath='./urcu/rculfhash.h' line='105' column='1' id='type-id-57'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfht* (unsigned long int, unsigned long int)* cds_lfht_mm_type::alloc_cds_lfht -->
+        <var-decl name='alloc_cds_lfht' type-id='type-id-58' visibility='default' filepath='./urcu/rculfhash.h' line='106' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* cds_lfht_mm_type::alloc_bucket_table -->
+        <var-decl name='alloc_bucket_table' type-id='type-id-59' visibility='default' filepath='./urcu/rculfhash.h' line='108' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- void ()* cds_lfht_mm_type::free_bucket_table -->
+        <var-decl name='free_bucket_table' type-id='type-id-59' visibility='default' filepath='./urcu/rculfhash.h' line='109' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- cds_lfht_node* (cds_lfht*, unsigned long int)* cds_lfht_mm_type::bucket_at -->
+        <var-decl name='bucket_at' type-id='type-id-55' visibility='default' filepath='./urcu/rculfhash.h' line='110' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_lfht_node -->
+    <class-decl name='cds_lfht_node' size-in-bits='128' is-struct='yes' visibility='default' filepath='./urcu/rculfhash.h' line='60' column='1' id='type-id-60'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfht_node* cds_lfht_node::next -->
+        <var-decl name='next' type-id='type-id-43' visibility='default' filepath='./urcu/rculfhash.h' line='61' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- unsigned long int cds_lfht_node::reverse_hash -->
+        <var-decl name='reverse_hash' type-id='type-id-22' visibility='default' filepath='./urcu/rculfhash.h' line='62' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='768' is-struct='yes' visibility='default' filepath='./urcu-flavor.h' line='30' column='1' id='type-id-61'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-62' visibility='default' filepath='./urcu-flavor.h' line='31' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-62' visibility='default' filepath='./urcu-flavor.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-63' visibility='default' filepath='./urcu-flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-62' visibility='default' filepath='./urcu-flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-6' visibility='default' filepath='./urcu-flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-62' visibility='default' filepath='./urcu-flavor.h' line='37' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-64' visibility='default' filepath='./urcu-flavor.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-62' visibility='default' filepath='./urcu-flavor.h' line='40' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-62' visibility='default' filepath='./urcu-flavor.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-62' visibility='default' filepath='./urcu-flavor.h' line='42' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-62' visibility='default' filepath='./urcu-flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-62' visibility='default' filepath='./urcu-flavor.h' line='45' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef pthread_attr_t pthread_attr_t -->
+    <typedef-decl name='pthread_attr_t' type-id='type-id-65' filepath='/usr/include/bits/pthreadtypes.h' line='62' column='1' id='type-id-66'/>
+    <!-- union pthread_attr_t -->
+    <union-decl name='pthread_attr_t' size-in-bits='448' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='56' column='1' id='type-id-65'>
+      <data-member access='private'>
+        <!-- char pthread_attr_t::__size[56] -->
+        <var-decl name='__size' type-id='type-id-48' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int pthread_attr_t::__align -->
+        <var-decl name='__align' type-id='type-id-24' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='59' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct ht_items_count -->
+    <class-decl name='ht_items_count' size-in-bits='1024' is-struct='yes' visibility='default' filepath='rculfhash.c' line='335' column='1' id='type-id-67'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int ht_items_count::add -->
+        <var-decl name='add' type-id='type-id-22' visibility='default' filepath='rculfhash.c' line='336' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- unsigned long int ht_items_count::del -->
+        <var-decl name='del' type-id='type-id-22' visibility='default' filepath='rculfhash.c' line='336' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union {cds_lfht_node* tbl_order[64]; cds_lfht_node* tbl_chunk[]; cds_lfht_node* tbl_mmap;} -->
+    <union-decl name='__anonymous_union__' size-in-bits='4096' is-anonymous='yes' visibility='default' filepath='./rculfhash-internal.h' line='111' column='1' id='type-id-56'>
+      <data-member access='private'>
+        <!-- cds_lfht_node* tbl_order[64] -->
+        <var-decl name='tbl_order' type-id='type-id-44' visibility='default' filepath='./rculfhash-internal.h' line='120' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_lfht_node* tbl_chunk[] -->
+        <var-decl name='tbl_chunk' type-id='type-id-46' visibility='default' filepath='./rculfhash-internal.h' line='132' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_lfht_node* tbl_mmap -->
+        <var-decl name='tbl_mmap' type-id='type-id-43' visibility='default' filepath='./rculfhash-internal.h' line='138' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct cds_lfht_iter -->
+    <class-decl name='cds_lfht_iter' size-in-bits='128' is-struct='yes' visibility='default' filepath='./urcu/rculfhash.h' line='66' column='1' id='type-id-68'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_lfht_node* cds_lfht_iter::node -->
+        <var-decl name='node' type-id='type-id-43' visibility='default' filepath='./urcu/rculfhash.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_lfht_node* cds_lfht_iter::next -->
+        <var-decl name='next' type-id='type-id-43' visibility='default' filepath='./urcu/rculfhash.h' line='67' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef int (cds_lfht_node*, void*)* cds_lfht_match_fct -->
+    <typedef-decl name='cds_lfht_match_fct' type-id='type-id-69' filepath='./urcu/rculfhash.h' line='83' column='1' id='type-id-70'/>
+    <!-- typedef __uint32_t uint32_t -->
+    <typedef-decl name='uint32_t' type-id='type-id-71' filepath='/usr/include/bits/stdint-uintn.h' line='26' column='1' id='type-id-72'/>
+    <!-- typedef unsigned int __uint32_t -->
+    <typedef-decl name='__uint32_t' type-id='type-id-26' filepath='/usr/include/bits/types.h' line='42' column='1' id='type-id-71'/>
+    <!-- cds_lfht* -->
+    <pointer-type-def type-id='type-id-50' size-in-bits='64' id='type-id-73'/>
+    <!-- cds_lfht* (unsigned long int, unsigned long int)* -->
+    <pointer-type-def type-id='type-id-74' size-in-bits='64' id='type-id-58'/>
+    <!-- cds_lfht_iter* -->
+    <pointer-type-def type-id='type-id-68' size-in-bits='64' id='type-id-75'/>
+    <!-- cds_lfht_node* -->
+    <pointer-type-def type-id='type-id-60' size-in-bits='64' id='type-id-43'/>
+    <!-- cds_lfht_node* (cds_lfht*, unsigned long int)* -->
+    <pointer-type-def type-id='type-id-76' size-in-bits='64' id='type-id-55'/>
+    <!-- const cds_lfht_mm_type -->
+    <qualified-type-def type-id='type-id-57' const='yes' id='type-id-77'/>
+    <!-- const cds_lfht_mm_type* -->
+    <pointer-type-def type-id='type-id-77' size-in-bits='64' id='type-id-51'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-61' const='yes' id='type-id-78'/>
+    <!-- const rcu_flavor_struct* -->
+    <pointer-type-def type-id='type-id-78' size-in-bits='64' id='type-id-52'/>
+    <!-- ht_items_count* -->
+    <pointer-type-def type-id='type-id-67' size-in-bits='64' id='type-id-54'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-79' size-in-bits='64' id='type-id-63'/>
+    <!-- int (cds_lfht_node*, void*)* -->
+    <pointer-type-def type-id='type-id-80' size-in-bits='64' id='type-id-69'/>
+    <!-- long int* -->
+    <pointer-type-def type-id='type-id-24' size-in-bits='64' id='type-id-81'/>
+    <!-- pthread_attr_t* -->
+    <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-53'/>
+    <!-- pthread_attr_t** -->
+    <pointer-type-def type-id='type-id-53' size-in-bits='64' id='type-id-82'/>
+    <!-- unsigned long int* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-83'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-84' size-in-bits='64' id='type-id-62'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-85' size-in-bits='64' id='type-id-59'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-86' size-in-bits='64' id='type-id-64'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-87' size-in-bits='64' id='type-id-88'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-2' size-in-bits='64' id='type-id-89'/>
+    <!-- void cds_lfht_resize(cds_lfht*, unsigned long int) -->
+    <function-decl name='cds_lfht_resize' mangled-name='cds_lfht_resize' filepath='rculfhash.c' line='1933' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_resize'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-73' name='ht' filepath='rculfhash.c' line='1933' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-22' name='new_size' filepath='rculfhash.c' line='1933' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void cds_lfht_count_nodes(cds_lfht*, long int*, unsigned long int*, long int*) -->
+    <function-decl name='cds_lfht_count_nodes' mangled-name='cds_lfht_count_nodes' filepath='rculfhash.c' line='1810' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_count_nodes'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-73' name='ht' filepath='rculfhash.c' line='1810' column='1'/>
+      <!-- parameter of type 'long int*' -->
+      <parameter type-id='type-id-81' name='approx_before' filepath='rculfhash.c' line='1811' column='1'/>
+      <!-- parameter of type 'unsigned long int*' -->
+      <parameter type-id='type-id-83' name='count' filepath='rculfhash.c' line='1812' column='1'/>
+      <!-- parameter of type 'long int*' -->
+      <parameter type-id='type-id-81' name='approx_after' filepath='rculfhash.c' line='1813' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- int cds_lfht_destroy(cds_lfht*, pthread_attr_t**) -->
+    <function-decl name='cds_lfht_destroy' mangled-name='cds_lfht_destroy' filepath='rculfhash.c' line='1775' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_destroy'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-73' name='ht' filepath='rculfhash.c' line='1775' column='1'/>
+      <!-- parameter of type 'pthread_attr_t**' -->
+      <parameter type-id='type-id-82' name='attr' filepath='rculfhash.c' line='1775' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int cds_lfht_is_node_deleted(cds_lfht_node*) -->
+    <function-decl name='cds_lfht_is_node_deleted' mangled-name='cds_lfht_is_node_deleted' filepath='rculfhash.c' line='1732' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_is_node_deleted'>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-43' name='node' filepath='rculfhash.c' line='1732' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int cds_lfht_del(cds_lfht*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_del' mangled-name='cds_lfht_del' filepath='rculfhash.c' line='1716' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_del'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-73' name='ht' filepath='rculfhash.c' line='1716' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-43' name='node' filepath='rculfhash.c' line='1716' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int cds_lfht_replace(cds_lfht*, cds_lfht_iter*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_replace' mangled-name='cds_lfht_replace' filepath='rculfhash.c' line='1695' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_replace'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-73' name='ht' filepath='rculfhash.c' line='1695' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-75' name='old_iter' filepath='rculfhash.c' line='1696' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-22' name='hash' filepath='rculfhash.c' line='1697' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-70' name='match' filepath='rculfhash.c' line='1698' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-89' name='key' filepath='rculfhash.c' line='1699' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-43' name='new_node' filepath='rculfhash.c' line='1700' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- cds_lfht_node* cds_lfht_add_replace(cds_lfht*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_add_replace' mangled-name='cds_lfht_add_replace' filepath='rculfhash.c' line='1672' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_add_replace'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-73' name='ht' filepath='rculfhash.c' line='1672' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-22' name='hash' filepath='rculfhash.c' line='1673' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-70' name='match' filepath='rculfhash.c' line='1674' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-89' name='key' filepath='rculfhash.c' line='1675' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-43' name='node' filepath='rculfhash.c' line='1676' column='1'/>
+      <!-- cds_lfht_node* -->
+      <return type-id='type-id-43'/>
+    </function-decl>
+    <!-- cds_lfht_node* cds_lfht_add_unique(cds_lfht*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_add_unique' mangled-name='cds_lfht_add_unique' filepath='rculfhash.c' line='1655' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_add_unique'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-73' name='ht' filepath='rculfhash.c' line='1655' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-22' name='hash' filepath='rculfhash.c' line='1656' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-70' name='match' filepath='rculfhash.c' line='1657' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-89' name='key' filepath='rculfhash.c' line='1658' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-43' name='node' filepath='rculfhash.c' line='1659' column='1'/>
+      <!-- cds_lfht_node* -->
+      <return type-id='type-id-43'/>
+    </function-decl>
+    <!-- void cds_lfht_add(cds_lfht*, unsigned long int, cds_lfht_node*) -->
+    <function-decl name='cds_lfht_add' mangled-name='cds_lfht_add' filepath='rculfhash.c' line='1644' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_add'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-73' name='ht' filepath='rculfhash.c' line='1644' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-22' name='hash' filepath='rculfhash.c' line='1644' column='1'/>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-43' name='node' filepath='rculfhash.c' line='1645' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void cds_lfht_first(cds_lfht*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_first' mangled-name='cds_lfht_first' filepath='rculfhash.c' line='1634' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_first'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-73' name='ht' filepath='rculfhash.c' line='1634' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-75' name='iter' filepath='rculfhash.c' line='1634' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void cds_lfht_next(cds_lfht*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_next' mangled-name='cds_lfht_next' filepath='rculfhash.c' line='1612' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_next'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-73' name='ht' filepath='rculfhash.c' line='1612' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-75' name='iter' filepath='rculfhash.c' line='1612' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void cds_lfht_next_duplicate(cds_lfht*, cds_lfht_match_fct, void*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_next_duplicate' mangled-name='cds_lfht_next_duplicate' filepath='rculfhash.c' line='1579' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_next_duplicate'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-73' name='ht' filepath='rculfhash.c' line='1579' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-70' name='match' filepath='rculfhash.c' line='1579' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-89' name='key' filepath='rculfhash.c' line='1580' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-75' name='iter' filepath='rculfhash.c' line='1580' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- void cds_lfht_lookup(cds_lfht*, unsigned long int, cds_lfht_match_fct, void*, cds_lfht_iter*) -->
+    <function-decl name='cds_lfht_lookup' mangled-name='cds_lfht_lookup' filepath='rculfhash.c' line='1541' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_lookup'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-73' name='ht' filepath='rculfhash.c' line='1541' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-22' name='hash' filepath='rculfhash.c' line='1541' column='1'/>
+      <!-- parameter of type 'typedef cds_lfht_match_fct' -->
+      <parameter type-id='type-id-70' name='match' filepath='rculfhash.c' line='1542' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-89' name='key' filepath='rculfhash.c' line='1542' column='1'/>
+      <!-- parameter of type 'cds_lfht_iter*' -->
+      <parameter type-id='type-id-75' name='iter' filepath='rculfhash.c' line='1543' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-decl>
+    <!-- cds_lfht* _cds_lfht_new(unsigned long int, unsigned long int, unsigned long int, int, const cds_lfht_mm_type*, const rcu_flavor_struct*, pthread_attr_t*) -->
+    <function-decl name='_cds_lfht_new' mangled-name='_cds_lfht_new' filepath='rculfhash.c' line='1467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_cds_lfht_new'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-22' name='init_size' filepath='rculfhash.c' line='1467' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-22' name='min_nr_alloc_buckets' filepath='rculfhash.c' line='1468' column='1'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-22' name='max_nr_buckets' filepath='rculfhash.c' line='1469' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='flags' filepath='rculfhash.c' line='1470' column='1'/>
+      <!-- parameter of type 'const cds_lfht_mm_type*' -->
+      <parameter type-id='type-id-51' name='mm' filepath='rculfhash.c' line='1471' column='1'/>
+      <!-- parameter of type 'const rcu_flavor_struct*' -->
+      <parameter type-id='type-id-52' name='flavor' filepath='rculfhash.c' line='1472' column='1'/>
+      <!-- parameter of type 'pthread_attr_t*' -->
+      <parameter type-id='type-id-53' name='attr' filepath='rculfhash.c' line='1473' column='1'/>
+      <!-- cds_lfht* -->
+      <return type-id='type-id-73'/>
+    </function-decl>
+    <!-- int cds_lfht_get_count_order_ulong(unsigned long int) -->
+    <function-decl name='cds_lfht_get_count_order_ulong' mangled-name='cds_lfht_get_count_order_ulong' filepath='rculfhash.c' line='551' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_get_count_order_ulong'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-22' name='x' filepath='rculfhash.c' line='551' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int cds_lfht_get_count_order_u32(uint32_t) -->
+    <function-decl name='cds_lfht_get_count_order_u32' mangled-name='cds_lfht_get_count_order_u32' filepath='rculfhash.c' line='539' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_get_count_order_u32'>
+      <!-- parameter of type 'typedef uint32_t' -->
+      <parameter type-id='type-id-72' name='x' filepath='rculfhash.c' line='539' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- unsigned int cds_lfht_fls_ulong(unsigned long int) -->
+    <function-decl name='cds_lfht_fls_ulong' mangled-name='cds_lfht_fls_ulong' filepath='rculfhash.c' line='526' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_lfht_fls_ulong'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-22' name='x' filepath='rculfhash.c' line='526' column='1'/>
+      <!-- unsigned int -->
+      <return type-id='type-id-26'/>
+    </function-decl>
+    <!-- cds_lfht* (unsigned long int, unsigned long int) -->
+    <function-type size-in-bits='64' id='type-id-74'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-22'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-22'/>
+      <!-- cds_lfht* -->
+      <return type-id='type-id-73'/>
+    </function-type>
+    <!-- cds_lfht_node* (cds_lfht*, unsigned long int) -->
+    <function-type size-in-bits='64' id='type-id-76'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-73'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-22'/>
+      <!-- cds_lfht_node* -->
+      <return type-id='type-id-43'/>
+    </function-type>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-79'>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-type>
+    <!-- int (cds_lfht_node*, void*) -->
+    <function-type size-in-bits='64' id='type-id-80'>
+      <!-- parameter of type 'cds_lfht_node*' -->
+      <parameter type-id='type-id-43'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-89'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-84'>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-type>
+    <!-- void (cds_lfht*, unsigned long int) -->
+    <function-type size-in-bits='64' id='type-id-85'>
+      <!-- parameter of type 'cds_lfht*' -->
+      <parameter type-id='type-id-73' name='ht'/>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-22' name='new_size'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-86'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-88'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-89'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-87'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-89'/>
+      <!-- void -->
+      <return type-id='type-id-2'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash-mm-order.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+    <!-- const cds_lfht_mm_type cds_lfht_mm_order -->
+    <var-decl name='cds_lfht_mm_order' type-id='type-id-77' mangled-name='cds_lfht_mm_order' visibility='default' filepath='./urcu/rculfhash.h' line='114' column='1' elf-symbol-id='cds_lfht_mm_order'/>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash-mm-chunk.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+    <!-- const cds_lfht_mm_type cds_lfht_mm_chunk -->
+    <var-decl name='cds_lfht_mm_chunk' type-id='type-id-77' mangled-name='cds_lfht_mm_chunk' visibility='default' filepath='./urcu/rculfhash.h' line='115' column='1' elf-symbol-id='cds_lfht_mm_chunk'/>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='rculfhash-mm-mmap.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+    <!-- const cds_lfht_mm_type cds_lfht_mm_mmap -->
+    <var-decl name='cds_lfht_mm_mmap' type-id='type-id-77' mangled-name='cds_lfht_mm_mmap' visibility='default' filepath='./urcu/rculfhash.h' line='116' column='1' elf-symbol-id='cds_lfht_mm_mmap'/>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-20' size-in-bits='384' id='type-id-90'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-22' id='type-id-91'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-92'/>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-93'/>
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-26' size-in-bits='64' id='type-id-94'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-22' id='type-id-95'/>
+
+    </array-type-def>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-96' filepath='/usr/include/bits/pthreadtypes.h' line='80' column='1' id='type-id-97'/>
+    <!-- union {__pthread_cond_s __data; char __size[48]; long long int __align;} -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='75' column='1' id='type-id-96'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __data -->
+        <var-decl name='__data' type-id='type-id-98' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __size[48] -->
+        <var-decl name='__size' type-id='type-id-90' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __align -->
+        <var-decl name='__align' type-id='type-id-92' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='92' column='1' id='type-id-98'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- union {long long unsigned int __wseq; struct {unsigned int __low; unsigned int __high;} __wseq32;} -->
+        <var-decl name='' type-id='type-id-99' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-94' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='112' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-94' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='113' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-26' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='114' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-26' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='115' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-94' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='116' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union {long long unsigned int __wseq; struct {unsigned int __low; unsigned int __high;} __wseq32;} -->
+    <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='94' column='1' id='type-id-99'>
+      <data-member access='private'>
+        <!-- long long unsigned int __wseq -->
+        <var-decl name='__wseq' type-id='type-id-93' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='96' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- struct {unsigned int __low; unsigned int __high;} __wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-100' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='101' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct {unsigned int __low; unsigned int __high;} -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='97' column='1' id='type-id-100'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __low -->
+        <var-decl name='__low' type-id='type-id-26' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='99' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __high -->
+        <var-decl name='__high' type-id='type-id-26' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='100' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-101' filepath='/usr/include/bits/stdint-intn.h' line='26' column='1' id='type-id-102'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-1' filepath='/usr/include/bits/types.h' line='41' column='1' id='type-id-101'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='10' column='1' id='type-id-103'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-104' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-105' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='16' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-24' filepath='/usr/include/bits/types.h' line='160' column='1' id='type-id-104'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-24' filepath='/usr/include/bits/types.h' line='197' column='1' id='type-id-105'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-103' const='yes' id='type-id-106'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-106' size-in-bits='64' id='type-id-107'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-102' size-in-bits='64' id='type-id-108'/>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-37' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-97' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-108' name='uaddr' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-102' name='val' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-107' name='timeout' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-108' name='uaddr2' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-102' name='val3' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-108' name='uaddr' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-1' name='op' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-102' name='val' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-107' name='timeout' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-108' name='uaddr2' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-102' name='val3' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-1'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.9/x86_64-pc-linux-gnu/liburcu-common.so.4.xml b/extras/abi/0.9/x86_64-pc-linux-gnu/liburcu-common.so.4.xml
new file mode 100644 (file)
index 0000000..73fe288
--- /dev/null
@@ -0,0 +1,906 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-common.so.4'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- __cds_wfcq_dequeue_blocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_dequeue_nonblocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_dequeue_with_state_blocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_dequeue_with_state_nonblocking -->
+    <elf-symbol name='__cds_wfcq_dequeue_with_state_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_first_blocking -->
+    <elf-symbol name='__cds_wfcq_first_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_first_nonblocking -->
+    <elf-symbol name='__cds_wfcq_first_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_init -->
+    <elf-symbol name='__cds_wfcq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_next_blocking -->
+    <elf-symbol name='__cds_wfcq_next_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_next_nonblocking -->
+    <elf-symbol name='__cds_wfcq_next_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_splice_blocking -->
+    <elf-symbol name='__cds_wfcq_splice_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfcq_splice_nonblocking -->
+    <elf-symbol name='__cds_wfcq_splice_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfq_dequeue_blocking -->
+    <elf-symbol name='__cds_wfq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_init -->
+    <elf-symbol name='__cds_wfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_all -->
+    <elf-symbol name='__cds_wfs_pop_all' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_blocking -->
+    <elf-symbol name='__cds_wfs_pop_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_nonblocking -->
+    <elf-symbol name='__cds_wfs_pop_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_with_state_blocking -->
+    <elf-symbol name='__cds_wfs_pop_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __cds_wfs_pop_with_state_nonblocking -->
+    <elf-symbol name='__cds_wfs_pop_with_state_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_blocking -->
+    <elf-symbol name='cds_wfcq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_lock -->
+    <elf-symbol name='cds_wfcq_dequeue_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_unlock -->
+    <elf-symbol name='cds_wfcq_dequeue_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_dequeue_with_state_blocking -->
+    <elf-symbol name='cds_wfcq_dequeue_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_destroy -->
+    <elf-symbol name='cds_wfcq_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_empty -->
+    <elf-symbol name='cds_wfcq_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_enqueue -->
+    <elf-symbol name='cds_wfcq_enqueue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_init -->
+    <elf-symbol name='cds_wfcq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_node_init -->
+    <elf-symbol name='cds_wfcq_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfcq_splice_blocking -->
+    <elf-symbol name='cds_wfcq_splice_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_dequeue_blocking -->
+    <elf-symbol name='cds_wfq_dequeue_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_destroy -->
+    <elf-symbol name='cds_wfq_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_enqueue -->
+    <elf-symbol name='cds_wfq_enqueue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_init -->
+    <elf-symbol name='cds_wfq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfq_node_init -->
+    <elf-symbol name='cds_wfq_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_destroy -->
+    <elf-symbol name='cds_wfs_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_empty -->
+    <elf-symbol name='cds_wfs_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_first -->
+    <elf-symbol name='cds_wfs_first' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_init -->
+    <elf-symbol name='cds_wfs_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_next_blocking -->
+    <elf-symbol name='cds_wfs_next_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_next_nonblocking -->
+    <elf-symbol name='cds_wfs_next_nonblocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_node_init -->
+    <elf-symbol name='cds_wfs_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_all_blocking -->
+    <elf-symbol name='cds_wfs_pop_all_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_blocking -->
+    <elf-symbol name='cds_wfs_pop_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_lock -->
+    <elf-symbol name='cds_wfs_pop_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_unlock -->
+    <elf-symbol name='cds_wfs_pop_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_pop_with_state_blocking -->
+    <elf-symbol name='cds_wfs_pop_with_state_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- cds_wfs_push -->
+    <elf-symbol name='cds_wfs_push' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='wfqueue.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='320' id='type-id-2'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-4'/>
+
+    </array-type-def>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-5'/>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-6'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-7'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-8'/>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- void -->
+    <type-decl name='void' id='type-id-9'/>
+    <!-- struct cds_wfq_node -->
+    <class-decl name='cds_wfq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/wfqueue.h' line='48' column='1' id='type-id-10'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfq_node* cds_wfq_node::next -->
+        <var-decl name='next' type-id='type-id-11' visibility='default' filepath='urcu/wfqueue.h' line='49' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfq_queue -->
+    <class-decl name='cds_wfq_queue' size-in-bits='512' is-struct='yes' visibility='default' filepath='urcu/wfqueue.h' line='52' column='1' id='type-id-12'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfq_node* cds_wfq_queue::head -->
+        <var-decl name='head' type-id='type-id-11' visibility='default' filepath='urcu/wfqueue.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfq_node** cds_wfq_queue::tail -->
+        <var-decl name='tail' type-id='type-id-13' visibility='default' filepath='urcu/wfqueue.h' line='53' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- cds_wfq_node cds_wfq_queue::dummy -->
+        <var-decl name='dummy' type-id='type-id-10' visibility='default' filepath='urcu/wfqueue.h' line='54' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- pthread_mutex_t cds_wfq_queue::lock -->
+        <var-decl name='lock' type-id='type-id-14' visibility='default' filepath='urcu/wfqueue.h' line='55' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-15' filepath='/usr/include/bits/pthreadtypes.h' line='72' column='1' id='type-id-14'/>
+    <!-- union {__pthread_mutex_s __data; char __size[40]; long int __align;} -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='67' column='1' id='type-id-15'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __data -->
+        <var-decl name='__data' type-id='type-id-16' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __size[40] -->
+        <var-decl name='__size' type-id='type-id-2' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __align -->
+        <var-decl name='__align' type-id='type-id-6' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='22' column='1' id='type-id-16'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-5' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='24' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='25' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-5' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='26' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='28' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-5' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-7' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-7' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-17' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-18' filepath='/usr/include/bits/thread-shared-types.h' line='53' column='1' id='type-id-17'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='49' column='1' id='type-id-18'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-19' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='51' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-19' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='52' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-19'/>
+    <!-- cds_wfq_node* -->
+    <pointer-type-def type-id='type-id-10' size-in-bits='64' id='type-id-11'/>
+    <!-- cds_wfq_node** -->
+    <pointer-type-def type-id='type-id-11' size-in-bits='64' id='type-id-13'/>
+    <!-- cds_wfq_queue* -->
+    <pointer-type-def type-id='type-id-12' size-in-bits='64' id='type-id-20'/>
+    <!-- cds_wfq_node* cds_wfq_dequeue_blocking(cds_wfq_queue*) -->
+    <function-decl name='cds_wfq_dequeue_blocking' mangled-name='cds_wfq_dequeue_blocking' filepath='wfqueue.c' line='59' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_dequeue_blocking'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-20' name='q' filepath='wfqueue.c' line='59' column='1'/>
+      <!-- cds_wfq_node* -->
+      <return type-id='type-id-11'/>
+    </function-decl>
+    <!-- cds_wfq_node* __cds_wfq_dequeue_blocking(cds_wfq_queue*) -->
+    <function-decl name='__cds_wfq_dequeue_blocking' mangled-name='__cds_wfq_dequeue_blocking' filepath='wfqueue.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfq_dequeue_blocking'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-20' name='q' filepath='wfqueue.c' line='54' column='1'/>
+      <!-- cds_wfq_node* -->
+      <return type-id='type-id-11'/>
+    </function-decl>
+    <!-- void cds_wfq_enqueue(cds_wfq_queue*, cds_wfq_node*) -->
+    <function-decl name='cds_wfq_enqueue' mangled-name='cds_wfq_enqueue' filepath='wfqueue.c' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_enqueue'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-20' name='q' filepath='wfqueue.c' line='49' column='1'/>
+      <!-- parameter of type 'cds_wfq_node*' -->
+      <parameter type-id='type-id-11' name='node' filepath='wfqueue.c' line='49' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void cds_wfq_destroy(cds_wfq_queue*) -->
+    <function-decl name='cds_wfq_destroy' mangled-name='cds_wfq_destroy' filepath='wfqueue.c' line='44' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_destroy'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-20' name='q' filepath='wfqueue.c' line='44' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void cds_wfq_init(cds_wfq_queue*) -->
+    <function-decl name='cds_wfq_init' mangled-name='cds_wfq_init' filepath='wfqueue.c' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_init'>
+      <!-- parameter of type 'cds_wfq_queue*' -->
+      <parameter type-id='type-id-20' name='q' filepath='wfqueue.c' line='39' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void cds_wfq_node_init(cds_wfq_node*) -->
+    <function-decl name='cds_wfq_node_init' mangled-name='cds_wfq_node_init' filepath='wfqueue.c' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfq_node_init'>
+      <!-- parameter of type 'cds_wfq_node*' -->
+      <parameter type-id='type-id-11' name='node' filepath='wfqueue.c' line='34' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='wfcqueue.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+    <!-- bool -->
+    <type-decl name='bool' size-in-bits='8' id='type-id-21'/>
+    <!-- unnamed&#45;enum&#45;underlying&#45;type -->
+    <type-decl name='unnamed-enum-underlying-type' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-22'/>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='59' column='1' id='type-id-23'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-24' visibility='default' filepath='urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __anonymous_union__ cds_wfcq_head_ptr_t -->
+    <typedef-decl name='cds_wfcq_head_ptr_t' type-id='type-id-25' filepath='urcu/wfcqueue.h' line='86' column='1' id='type-id-26'/>
+    <!-- union {__cds_wfcq_head* _h; cds_wfcq_head* h;} -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='urcu/wfcqueue.h' line='83' column='1' id='type-id-25'>
+      <data-member access='private'>
+        <!-- __cds_wfcq_head* _h -->
+        <var-decl name='_h' type-id='type-id-27' visibility='default' filepath='urcu/wfcqueue.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_wfcq_head* h -->
+        <var-decl name='h' type-id='type-id-28' visibility='default' filepath='urcu/wfcqueue.h' line='85' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __cds_wfcq_head -->
+    <class-decl name='__cds_wfcq_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='68' column='1' id='type-id-29'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node __cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-23' visibility='default' filepath='urcu/wfcqueue.h' line='69' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='72' column='1' id='type-id-30'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-23' visibility='default' filepath='urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-14' visibility='default' filepath='urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='127' column='1' id='type-id-31'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-24' visibility='default' filepath='urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- enum cds_wfcq_ret -->
+    <enum-decl name='cds_wfcq_ret' filepath='urcu/wfcqueue.h' line='48' column='1' id='type-id-32'>
+      <underlying-type type-id='type-id-22'/>
+      <enumerator name='CDS_WFCQ_RET_WOULDBLOCK' value='-1'/>
+      <enumerator name='CDS_WFCQ_RET_DEST_EMPTY' value='0'/>
+      <enumerator name='CDS_WFCQ_RET_DEST_NON_EMPTY' value='1'/>
+      <enumerator name='CDS_WFCQ_RET_SRC_EMPTY' value='2'/>
+    </enum-decl>
+    <!-- __cds_wfcq_head* -->
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-27'/>
+    <!-- cds_wfcq_head* -->
+    <pointer-type-def type-id='type-id-30' size-in-bits='64' id='type-id-28'/>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-23' size-in-bits='64' id='type-id-24'/>
+    <!-- cds_wfcq_tail* -->
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-33'/>
+    <!-- int* -->
+    <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-34'/>
+    <!-- cds_wfcq_node* __cds_wfcq_next_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_node*) -->
+    <function-decl name='__cds_wfcq_next_nonblocking' mangled-name='__cds_wfcq_next_nonblocking' filepath='wfcqueue.c' line='178' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_next_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-26' name='head' filepath='wfcqueue.c' line='179' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='tail' filepath='wfcqueue.c' line='180' column='1'/>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-24' name='node' filepath='wfcqueue.c' line='181' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-24'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_next_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_node*) -->
+    <function-decl name='__cds_wfcq_next_blocking' mangled-name='__cds_wfcq_next_blocking' filepath='wfcqueue.c' line='170' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_next_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-26' name='head' filepath='wfcqueue.c' line='171' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='tail' filepath='wfcqueue.c' line='172' column='1'/>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-24' name='node' filepath='wfcqueue.c' line='173' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-24'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_first_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_first_nonblocking' mangled-name='__cds_wfcq_first_nonblocking' filepath='wfcqueue.c' line='163' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_first_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-26' name='head' filepath='wfcqueue.c' line='164' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='tail' filepath='wfcqueue.c' line='165' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-24'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_first_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_first_blocking' mangled-name='__cds_wfcq_first_blocking' filepath='wfcqueue.c' line='156' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_first_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-26' name='head' filepath='wfcqueue.c' line='157' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='tail' filepath='wfcqueue.c' line='158' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-24'/>
+    </function-decl>
+    <!-- cds_wfcq_ret __cds_wfcq_splice_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_splice_nonblocking' mangled-name='__cds_wfcq_splice_nonblocking' filepath='wfcqueue.c' line='146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_splice_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-26' name='dest_q_head' filepath='wfcqueue.c' line='147' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='dest_q_tail' filepath='wfcqueue.c' line='148' column='1'/>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-26' name='src_q_head' filepath='wfcqueue.c' line='149' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='src_q_tail' filepath='wfcqueue.c' line='150' column='1'/>
+      <!-- enum cds_wfcq_ret -->
+      <return type-id='type-id-32'/>
+    </function-decl>
+    <!-- cds_wfcq_ret __cds_wfcq_splice_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_splice_blocking' mangled-name='__cds_wfcq_splice_blocking' filepath='wfcqueue.c' line='136' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_splice_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-26' name='dest_q_head' filepath='wfcqueue.c' line='137' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='dest_q_tail' filepath='wfcqueue.c' line='138' column='1'/>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-26' name='src_q_head' filepath='wfcqueue.c' line='139' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='src_q_tail' filepath='wfcqueue.c' line='140' column='1'/>
+      <!-- enum cds_wfcq_ret -->
+      <return type-id='type-id-32'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_with_state_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, int*) -->
+    <function-decl name='__cds_wfcq_dequeue_with_state_nonblocking' mangled-name='__cds_wfcq_dequeue_with_state_nonblocking' filepath='wfcqueue.c' line='128' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_with_state_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-26' name='head' filepath='wfcqueue.c' line='129' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='tail' filepath='wfcqueue.c' line='130' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-34' name='state' filepath='wfcqueue.c' line='131' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-24'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_nonblocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_dequeue_nonblocking' mangled-name='__cds_wfcq_dequeue_nonblocking' filepath='wfcqueue.c' line='121' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-26' name='head' filepath='wfcqueue.c' line='122' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='tail' filepath='wfcqueue.c' line='123' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-24'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_with_state_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*, int*) -->
+    <function-decl name='__cds_wfcq_dequeue_with_state_blocking' mangled-name='__cds_wfcq_dequeue_with_state_blocking' filepath='wfcqueue.c' line='113' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_with_state_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-26' name='head' filepath='wfcqueue.c' line='114' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='tail' filepath='wfcqueue.c' line='115' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-34' name='state' filepath='wfcqueue.c' line='116' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-24'/>
+    </function-decl>
+    <!-- cds_wfcq_node* __cds_wfcq_dequeue_blocking(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_dequeue_blocking' mangled-name='__cds_wfcq_dequeue_blocking' filepath='wfcqueue.c' line='106' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_dequeue_blocking'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-26' name='head' filepath='wfcqueue.c' line='107' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='tail' filepath='wfcqueue.c' line='108' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-24'/>
+    </function-decl>
+    <!-- cds_wfcq_ret cds_wfcq_splice_blocking(cds_wfcq_head*, cds_wfcq_tail*, cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_splice_blocking' mangled-name='cds_wfcq_splice_blocking' filepath='wfcqueue.c' line='96' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_splice_blocking'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-28' name='dest_q_head' filepath='wfcqueue.c' line='97' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='dest_q_tail' filepath='wfcqueue.c' line='98' column='1'/>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-28' name='src_q_head' filepath='wfcqueue.c' line='99' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='src_q_tail' filepath='wfcqueue.c' line='100' column='1'/>
+      <!-- enum cds_wfcq_ret -->
+      <return type-id='type-id-32'/>
+    </function-decl>
+    <!-- cds_wfcq_node* cds_wfcq_dequeue_with_state_blocking(cds_wfcq_head*, cds_wfcq_tail*, int*) -->
+    <function-decl name='cds_wfcq_dequeue_with_state_blocking' mangled-name='cds_wfcq_dequeue_with_state_blocking' filepath='wfcqueue.c' line='88' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_with_state_blocking'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-28' name='head' filepath='wfcqueue.c' line='89' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='tail' filepath='wfcqueue.c' line='90' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-34' name='state' filepath='wfcqueue.c' line='91' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-24'/>
+    </function-decl>
+    <!-- cds_wfcq_node* cds_wfcq_dequeue_blocking(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_dequeue_blocking' mangled-name='cds_wfcq_dequeue_blocking' filepath='wfcqueue.c' line='81' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_blocking'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-28' name='head' filepath='wfcqueue.c' line='82' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='tail' filepath='wfcqueue.c' line='83' column='1'/>
+      <!-- cds_wfcq_node* -->
+      <return type-id='type-id-24'/>
+    </function-decl>
+    <!-- void cds_wfcq_dequeue_unlock(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_dequeue_unlock' mangled-name='cds_wfcq_dequeue_unlock' filepath='wfcqueue.c' line='75' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_unlock'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-28' name='head' filepath='wfcqueue.c' line='75' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='tail' filepath='wfcqueue.c' line='76' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void cds_wfcq_dequeue_lock(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_dequeue_lock' mangled-name='cds_wfcq_dequeue_lock' filepath='wfcqueue.c' line='69' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_dequeue_lock'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-28' name='head' filepath='wfcqueue.c' line='69' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='tail' filepath='wfcqueue.c' line='70' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- bool cds_wfcq_enqueue(cds_wfcq_head_ptr_t, cds_wfcq_tail*, cds_wfcq_node*) -->
+    <function-decl name='cds_wfcq_enqueue' mangled-name='cds_wfcq_enqueue' filepath='wfcqueue.c' line='62' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_enqueue'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-26' name='head' filepath='wfcqueue.c' line='62' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='tail' filepath='wfcqueue.c' line='63' column='1'/>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-24' name='node' filepath='wfcqueue.c' line='64' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-21'/>
+    </function-decl>
+    <!-- bool cds_wfcq_empty(cds_wfcq_head_ptr_t, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_empty' mangled-name='cds_wfcq_empty' filepath='wfcqueue.c' line='55' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_empty'>
+      <!-- parameter of type 'typedef cds_wfcq_head_ptr_t' -->
+      <parameter type-id='type-id-26' name='head' filepath='wfcqueue.c' line='55' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='tail' filepath='wfcqueue.c' line='56' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-21'/>
+    </function-decl>
+    <!-- void __cds_wfcq_init(__cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='__cds_wfcq_init' mangled-name='__cds_wfcq_init' filepath='wfcqueue.c' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfcq_init'>
+      <!-- parameter of type '__cds_wfcq_head*' -->
+      <parameter type-id='type-id-27' name='head' filepath='wfcqueue.c' line='49' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='tail' filepath='wfcqueue.c' line='50' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void cds_wfcq_destroy(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_destroy' mangled-name='cds_wfcq_destroy' filepath='wfcqueue.c' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_destroy'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-28' name='head' filepath='wfcqueue.c' line='43' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='tail' filepath='wfcqueue.c' line='44' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void cds_wfcq_init(cds_wfcq_head*, cds_wfcq_tail*) -->
+    <function-decl name='cds_wfcq_init' mangled-name='cds_wfcq_init' filepath='wfcqueue.c' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_init'>
+      <!-- parameter of type 'cds_wfcq_head*' -->
+      <parameter type-id='type-id-28' name='head' filepath='wfcqueue.c' line='37' column='1'/>
+      <!-- parameter of type 'cds_wfcq_tail*' -->
+      <parameter type-id='type-id-33' name='tail' filepath='wfcqueue.c' line='38' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void cds_wfcq_node_init(cds_wfcq_node*) -->
+    <function-decl name='cds_wfcq_node_init' mangled-name='cds_wfcq_node_init' filepath='wfcqueue.c' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfcq_node_init'>
+      <!-- parameter of type 'cds_wfcq_node*' -->
+      <parameter type-id='type-id-24' name='node' filepath='wfcqueue.c' line='32' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='wfstack.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+    <!-- struct cds_wfs_head -->
+    <class-decl name='cds_wfs_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/wfstack.h' line='82' column='1' id='type-id-35'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_node cds_wfs_head::node -->
+        <var-decl name='node' type-id='type-id-36' visibility='default' filepath='urcu/wfstack.h' line='83' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfs_node -->
+    <class-decl name='cds_wfs_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/wfstack.h' line='72' column='1' id='type-id-36'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_node* cds_wfs_node::next -->
+        <var-decl name='next' type-id='type-id-37' visibility='default' filepath='urcu/wfstack.h' line='73' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __anonymous_union__ cds_wfs_stack_ptr_t -->
+    <typedef-decl name='cds_wfs_stack_ptr_t' type-id='type-id-38' filepath='urcu/wfstack.h' line='103' column='1' id='type-id-39'/>
+    <!-- union {__cds_wfs_stack* _s; cds_wfs_stack* s;} -->
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='urcu/wfstack.h' line='100' column='1' id='type-id-38'>
+      <data-member access='private'>
+        <!-- __cds_wfs_stack* _s -->
+        <var-decl name='_s' type-id='type-id-40' visibility='default' filepath='urcu/wfstack.h' line='101' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- cds_wfs_stack* s -->
+        <var-decl name='s' type-id='type-id-41' visibility='default' filepath='urcu/wfstack.h' line='102' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __cds_wfs_stack -->
+    <class-decl name='__cds_wfs_stack' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/wfstack.h' line='86' column='1' id='type-id-42'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_head* __cds_wfs_stack::head -->
+        <var-decl name='head' type-id='type-id-43' visibility='default' filepath='urcu/wfstack.h' line='87' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfs_stack -->
+    <class-decl name='cds_wfs_stack' size-in-bits='384' is-struct='yes' visibility='default' filepath='urcu/wfstack.h' line='90' column='1' id='type-id-44'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfs_head* cds_wfs_stack::head -->
+        <var-decl name='head' type-id='type-id-43' visibility='default' filepath='urcu/wfstack.h' line='91' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfs_stack::lock -->
+        <var-decl name='lock' type-id='type-id-14' visibility='default' filepath='urcu/wfstack.h' line='92' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __cds_wfs_stack* -->
+    <pointer-type-def type-id='type-id-42' size-in-bits='64' id='type-id-40'/>
+    <!-- cds_wfs_head* -->
+    <pointer-type-def type-id='type-id-35' size-in-bits='64' id='type-id-43'/>
+    <!-- cds_wfs_node* -->
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-37'/>
+    <!-- cds_wfs_stack* -->
+    <pointer-type-def type-id='type-id-44' size-in-bits='64' id='type-id-41'/>
+    <!-- cds_wfs_head* __cds_wfs_pop_all(cds_wfs_stack_ptr_t) -->
+    <function-decl name='__cds_wfs_pop_all' mangled-name='__cds_wfs_pop_all' filepath='wfstack.c' line='126' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_all'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-39' name='u_stack' filepath='wfstack.c' line='126' column='1'/>
+      <!-- cds_wfs_head* -->
+      <return type-id='type-id-43'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_with_state_nonblocking(cds_wfs_stack_ptr_t, int*) -->
+    <function-decl name='__cds_wfs_pop_with_state_nonblocking' mangled-name='__cds_wfs_pop_with_state_nonblocking' filepath='wfstack.c' line='120' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_with_state_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-39' name='u_stack' filepath='wfstack.c' line='120' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-34' name='state' filepath='wfstack.c' line='121' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_nonblocking(cds_wfs_stack_ptr_t) -->
+    <function-decl name='__cds_wfs_pop_nonblocking' mangled-name='__cds_wfs_pop_nonblocking' filepath='wfstack.c' line='114' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_nonblocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-39' name='u_stack' filepath='wfstack.c' line='114' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_with_state_blocking(cds_wfs_stack_ptr_t, int*) -->
+    <function-decl name='__cds_wfs_pop_with_state_blocking' mangled-name='__cds_wfs_pop_with_state_blocking' filepath='wfstack.c' line='108' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_with_state_blocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-39' name='u_stack' filepath='wfstack.c' line='108' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-34' name='state' filepath='wfstack.c' line='109' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* __cds_wfs_pop_blocking(cds_wfs_stack_ptr_t) -->
+    <function-decl name='__cds_wfs_pop_blocking' mangled-name='__cds_wfs_pop_blocking' filepath='wfstack.c' line='102' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_pop_blocking'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-39' name='u_stack' filepath='wfstack.c' line='102' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- void cds_wfs_pop_unlock(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_unlock' mangled-name='cds_wfs_pop_unlock' filepath='wfstack.c' line='97' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_unlock'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='wfstack.c' line='97' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void cds_wfs_pop_lock(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_lock' mangled-name='cds_wfs_pop_lock' filepath='wfstack.c' line='92' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_lock'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='wfstack.c' line='92' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_next_nonblocking(cds_wfs_node*) -->
+    <function-decl name='cds_wfs_next_nonblocking' mangled-name='cds_wfs_next_nonblocking' filepath='wfstack.c' line='87' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_next_nonblocking'>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='wfstack.c' line='87' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_next_blocking(cds_wfs_node*) -->
+    <function-decl name='cds_wfs_next_blocking' mangled-name='cds_wfs_next_blocking' filepath='wfstack.c' line='82' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_next_blocking'>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='wfstack.c' line='82' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_first(cds_wfs_head*) -->
+    <function-decl name='cds_wfs_first' mangled-name='cds_wfs_first' filepath='wfstack.c' line='77' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_first'>
+      <!-- parameter of type 'cds_wfs_head*' -->
+      <parameter type-id='type-id-43' name='head' filepath='wfstack.c' line='77' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_head* cds_wfs_pop_all_blocking(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_all_blocking' mangled-name='cds_wfs_pop_all_blocking' filepath='wfstack.c' line='72' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_all_blocking'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='wfstack.c' line='72' column='1'/>
+      <!-- cds_wfs_head* -->
+      <return type-id='type-id-43'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_pop_with_state_blocking(cds_wfs_stack*, int*) -->
+    <function-decl name='cds_wfs_pop_with_state_blocking' mangled-name='cds_wfs_pop_with_state_blocking' filepath='wfstack.c' line='67' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_with_state_blocking'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='wfstack.c' line='67' column='1'/>
+      <!-- parameter of type 'int*' -->
+      <parameter type-id='type-id-34' name='state' filepath='wfstack.c' line='67' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- cds_wfs_node* cds_wfs_pop_blocking(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_pop_blocking' mangled-name='cds_wfs_pop_blocking' filepath='wfstack.c' line='61' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_pop_blocking'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='wfstack.c' line='61' column='1'/>
+      <!-- cds_wfs_node* -->
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <!-- int cds_wfs_push(cds_wfs_stack_ptr_t, cds_wfs_node*) -->
+    <function-decl name='cds_wfs_push' mangled-name='cds_wfs_push' filepath='wfstack.c' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_push'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-39' name='u_stack' filepath='wfstack.c' line='56' column='1'/>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='wfstack.c' line='56' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- bool cds_wfs_empty(cds_wfs_stack_ptr_t) -->
+    <function-decl name='cds_wfs_empty' mangled-name='cds_wfs_empty' filepath='wfstack.c' line='51' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_empty'>
+      <!-- parameter of type 'typedef cds_wfs_stack_ptr_t' -->
+      <parameter type-id='type-id-39' name='u_stack' filepath='wfstack.c' line='51' column='1'/>
+      <!-- bool -->
+      <return type-id='type-id-21'/>
+    </function-decl>
+    <!-- void __cds_wfs_init(__cds_wfs_stack*) -->
+    <function-decl name='__cds_wfs_init' mangled-name='__cds_wfs_init' filepath='wfstack.c' line='46' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cds_wfs_init'>
+      <!-- parameter of type '__cds_wfs_stack*' -->
+      <parameter type-id='type-id-40' name='s' filepath='wfstack.c' line='46' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void cds_wfs_destroy(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_destroy' mangled-name='cds_wfs_destroy' filepath='wfstack.c' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_destroy'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='wfstack.c' line='41' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void cds_wfs_init(cds_wfs_stack*) -->
+    <function-decl name='cds_wfs_init' mangled-name='cds_wfs_init' filepath='wfstack.c' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_init'>
+      <!-- parameter of type 'cds_wfs_stack*' -->
+      <parameter type-id='type-id-41' name='s' filepath='wfstack.c' line='36' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void cds_wfs_node_init(cds_wfs_node*) -->
+    <function-decl name='cds_wfs_node_init' mangled-name='cds_wfs_node_init' filepath='wfstack.c' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cds_wfs_node_init'>
+      <!-- parameter of type 'cds_wfs_node*' -->
+      <parameter type-id='type-id-37' name='node' filepath='wfstack.c' line='31' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='384' id='type-id-45'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-46'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-47'/>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-48'/>
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='64' id='type-id-49'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-50'/>
+
+    </array-type-def>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-51' filepath='/usr/include/bits/pthreadtypes.h' line='80' column='1' id='type-id-52'/>
+    <!-- union {__pthread_cond_s __data; char __size[48]; long long int __align;} -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='75' column='1' id='type-id-51'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __data -->
+        <var-decl name='__data' type-id='type-id-53' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __size[48] -->
+        <var-decl name='__size' type-id='type-id-45' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __align -->
+        <var-decl name='__align' type-id='type-id-47' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='92' column='1' id='type-id-53'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- union {long long unsigned int __wseq; struct {unsigned int __low; unsigned int __high;} __wseq32;} -->
+        <var-decl name='' type-id='type-id-54' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-49' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='112' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-49' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='113' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='114' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='115' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-49' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='116' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union {long long unsigned int __wseq; struct {unsigned int __low; unsigned int __high;} __wseq32;} -->
+    <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='94' column='1' id='type-id-54'>
+      <data-member access='private'>
+        <!-- long long unsigned int __wseq -->
+        <var-decl name='__wseq' type-id='type-id-48' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='96' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- struct {unsigned int __low; unsigned int __high;} __wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-55' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='101' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct {unsigned int __low; unsigned int __high;} -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='97' column='1' id='type-id-55'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __low -->
+        <var-decl name='__low' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='99' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __high -->
+        <var-decl name='__high' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='100' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-56' filepath='/usr/include/bits/stdint-intn.h' line='26' column='1' id='type-id-57'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-5' filepath='/usr/include/bits/types.h' line='41' column='1' id='type-id-56'/>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='10' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-59' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-60' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='16' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-6' filepath='/usr/include/bits/types.h' line='160' column='1' id='type-id-59'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-6' filepath='/usr/include/bits/types.h' line='197' column='1' id='type-id-60'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-58' const='yes' id='type-id-61'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-61' size-in-bits='64' id='type-id-62'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-57' size-in-bits='64' id='type-id-63'/>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-14' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-52' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='op' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-62' name='timeout' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val3' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='op' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-62' name='timeout' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-57' name='val3' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.9/x86_64-pc-linux-gnu/liburcu-mb.so.4.xml b/extras/abi/0.9/x86_64-pc-linux-gnu/liburcu-mb.so.4.xml
new file mode 100644 (file)
index 0000000..e09bed2
--- /dev/null
@@ -0,0 +1,792 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-mb.so.4'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='liburcu-common.so.4'/>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- call_rcu_after_fork_child_mb -->
+    <elf-symbol name='call_rcu_after_fork_child_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_mb -->
+    <elf-symbol name='call_rcu_after_fork_parent_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_mb -->
+    <elf-symbol name='call_rcu_before_fork_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_data_free_mb -->
+    <elf-symbol name='call_rcu_data_free_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_mb -->
+    <elf-symbol name='call_rcu_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_mb -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_call_rcu_data_mb -->
+    <elf-symbol name='create_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- defer_rcu_mb -->
+    <elf-symbol name='defer_rcu_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data_mb -->
+    <elf-symbol name='free_all_cpu_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_data_mb -->
+    <elf-symbol name='get_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_thread_mb -->
+    <elf-symbol name='get_call_rcu_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_mb -->
+    <elf-symbol name='get_cpu_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_mb -->
+    <elf-symbol name='get_default_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_mb -->
+    <elf-symbol name='get_thread_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_barrier_mb -->
+    <elf-symbol name='rcu_barrier_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_mb -->
+    <elf-symbol name='rcu_defer_barrier_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_mb -->
+    <elf-symbol name='rcu_defer_barrier_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_exit_mb -->
+    <elf-symbol name='rcu_defer_exit_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_mb -->
+    <elf-symbol name='rcu_defer_register_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_mb -->
+    <elf-symbol name='rcu_defer_unregister_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_init_mb -->
+    <elf-symbol name='rcu_init_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_lock_mb -->
+    <elf-symbol name='rcu_read_lock_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_ongoing_mb -->
+    <elf-symbol name='rcu_read_ongoing_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_unlock_mb -->
+    <elf-symbol name='rcu_read_unlock_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_register_thread_mb -->
+    <elf-symbol name='rcu_register_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_unregister_thread_mb -->
+    <elf-symbol name='rcu_unregister_thread_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_mb -->
+    <elf-symbol name='set_cpu_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_mb -->
+    <elf-symbol name='set_thread_call_rcu_data_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- synchronize_rcu_mb -->
+    <elf-symbol name='synchronize_rcu_mb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_mb -->
+    <elf-symbol name='rcu_flavor_mb' size='96' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_gp_mb -->
+    <elf-symbol name='rcu_gp_mb' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_reader_mb -->
+    <elf-symbol name='rcu_reader_mb' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='320' id='type-id-2'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-4'/>
+
+    </array-type-def>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-5'/>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-6'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-7'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-8'/>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- void -->
+    <type-decl name='void' id='type-id-9'/>
+    <!-- struct rcu_gp_mb -->
+    <class-decl name='rcu_gp_mb' size-in-bits='1024' is-struct='yes' visibility='default' filepath='urcu/static/urcu.h' line='127' column='1' id='type-id-10'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_gp_mb::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='urcu/static/urcu.h' line='135' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t rcu_gp_mb::futex -->
+        <var-decl name='futex' type-id='type-id-11' visibility='default' filepath='urcu/static/urcu.h' line='137' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-12' filepath='/usr/include/bits/stdint-intn.h' line='26' column='1' id='type-id-11'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-5' filepath='/usr/include/bits/types.h' line='41' column='1' id='type-id-12'/>
+    <!-- struct rcu_reader_mb -->
+    <class-decl name='rcu_reader_mb' size-in-bits='2048' is-struct='yes' visibility='default' filepath='urcu/static/urcu.h' line='142' column='1' id='type-id-13'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_reader_mb::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='urcu/static/urcu.h' line='144' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char rcu_reader_mb::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-1' visibility='default' filepath='urcu/static/urcu.h' line='145' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head rcu_reader_mb::node -->
+        <var-decl name='node' type-id='type-id-14' visibility='default' filepath='urcu/static/urcu.h' line='147' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t rcu_reader_mb::tid -->
+        <var-decl name='tid' type-id='type-id-15' visibility='default' filepath='urcu/static/urcu.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int rcu_reader_mb::registered -->
+        <var-decl name='registered' type-id='type-id-8' visibility='default' filepath='urcu/static/urcu.h' line='150' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='./urcu/list.h' line='35' column='1' id='type-id-14'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-16' visibility='default' filepath='./urcu/list.h' line='36' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-16' visibility='default' filepath='./urcu/list.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/bits/pthreadtypes.h' line='27' column='1' id='type-id-15'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='768' is-struct='yes' visibility='default' filepath='./urcu-flavor.h' line='30' column='1' id='type-id-17'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='31' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-19' visibility='default' filepath='./urcu-flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-20' visibility='default' filepath='./urcu-flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='37' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-21' visibility='default' filepath='./urcu-flavor.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='40' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='42' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='45' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='./urcu-call-rcu.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-23' visibility='default' filepath='./urcu-call-rcu.h' line='60' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-24' visibility='default' filepath='./urcu-call-rcu.h' line='61' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='59' column='1' id='type-id-23'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-25' visibility='default' filepath='urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='urcu-call-rcu-impl.h' line='54' column='1' id='type-id-26'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-27' visibility='default' filepath='urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-28' visibility='default' filepath='urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-11' visibility='default' filepath='urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-15' visibility='default' filepath='urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-5' visibility='default' filepath='urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-14' visibility='default' filepath='urcu-call-rcu-impl.h' line='70' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='127' column='1' id='type-id-27'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-25' visibility='default' filepath='urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='72' column='1' id='type-id-28'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-23' visibility='default' filepath='urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-29' visibility='default' filepath='urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-30' filepath='/usr/include/bits/pthreadtypes.h' line='72' column='1' id='type-id-29'/>
+    <!-- union {__pthread_mutex_s __data; char __size[40]; long int __align;} -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='67' column='1' id='type-id-30'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __data -->
+        <var-decl name='__data' type-id='type-id-31' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __size[40] -->
+        <var-decl name='__size' type-id='type-id-2' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __align -->
+        <var-decl name='__align' type-id='type-id-6' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='22' column='1' id='type-id-31'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-5' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='24' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='25' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-5' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='26' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='28' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-5' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-7' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-7' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-32' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-33' filepath='/usr/include/bits/thread-shared-types.h' line='53' column='1' id='type-id-32'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='49' column='1' id='type-id-33'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-34' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='51' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-34' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='52' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-34'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-35'/>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-14' size-in-bits='64' id='type-id-16'/>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-23' size-in-bits='64' id='type-id-25'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-17' const='yes' id='type-id-36'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-37' size-in-bits='64' id='type-id-19'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-38'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-39' size-in-bits='64' id='type-id-18'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-40' size-in-bits='64' id='type-id-24'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-41' size-in-bits='64' id='type-id-20'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-42' size-in-bits='64' id='type-id-21'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-43' size-in-bits='64' id='type-id-44'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-9' size-in-bits='64' id='type-id-45'/>
+    <!-- rcu_gp_mb rcu_gp_mb -->
+    <var-decl name='rcu_gp_mb' type-id='type-id-10' mangled-name='rcu_gp_mb' visibility='default' filepath='urcu/static/urcu.h' line='140' column='1' elf-symbol-id='rcu_gp_mb'/>
+    <!-- rcu_reader_mb rcu_reader_mb -->
+    <var-decl name='rcu_reader_mb' type-id='type-id-13' mangled-name='rcu_reader_mb' visibility='default' filepath='urcu/static/urcu.h' line='153' column='1' elf-symbol-id='rcu_reader_mb'/>
+    <!-- const rcu_flavor_struct rcu_flavor_mb -->
+    <var-decl name='rcu_flavor_mb' type-id='type-id-36' mangled-name='rcu_flavor_mb' visibility='default' filepath='./urcu-flavor.h' line='64' column='1' elf-symbol-id='rcu_flavor_mb'/>
+    <!-- void rcu_defer_exit_mb() -->
+    <function-decl name='rcu_defer_exit_mb' mangled-name='rcu_defer_exit_mb' filepath='urcu-defer-impl.h' line='466' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_exit_mb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_defer_unregister_thread_mb() -->
+    <function-decl name='rcu_defer_unregister_thread_mb' mangled-name='rcu_defer_unregister_thread_mb' filepath='urcu-defer-impl.h' line='448' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_unregister_thread_mb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int rcu_defer_register_thread_mb() -->
+    <function-decl name='rcu_defer_register_thread_mb' mangled-name='rcu_defer_register_thread_mb' filepath='urcu-defer-impl.h' line='426' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_register_thread_mb'>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- void defer_rcu_mb(void (void*)*, void*) -->
+    <function-decl name='defer_rcu_mb' mangled-name='defer_rcu_mb' filepath='urcu-defer-impl.h' line='395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_mb'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-44' name='fct' filepath='urcu-defer-impl.h' line='395' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='p' filepath='urcu-defer-impl.h' line='395' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_mb() -->
+    <function-decl name='rcu_defer_barrier_mb' mangled-name='rcu_defer_barrier_mb' filepath='urcu-defer-impl.h' line='281' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_mb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_thread_mb() -->
+    <function-decl name='rcu_defer_barrier_thread_mb' mangled-name='rcu_defer_barrier_thread_mb' filepath='urcu-defer-impl.h' line='261' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_mb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_child_mb() -->
+    <function-decl name='call_rcu_after_fork_child_mb' mangled-name='call_rcu_after_fork_child_mb' filepath='urcu-call-rcu-impl.h' line='949' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_mb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_parent_mb() -->
+    <function-decl name='call_rcu_after_fork_parent_mb' mangled-name='call_rcu_after_fork_parent_mb' filepath='urcu-call-rcu-impl.h' line='931' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_parent_mb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_before_fork_mb() -->
+    <function-decl name='call_rcu_before_fork_mb' mangled-name='call_rcu_before_fork_mb' filepath='urcu-call-rcu-impl.h' line='909' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_before_fork_mb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_barrier_mb() -->
+    <function-decl name='rcu_barrier_mb' mangled-name='rcu_barrier_mb' filepath='urcu-call-rcu-impl.h' line='838' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_barrier_mb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void free_all_cpu_call_rcu_data_mb() -->
+    <function-decl name='free_all_cpu_call_rcu_data_mb' mangled-name='free_all_cpu_call_rcu_data_mb' filepath='urcu-call-rcu-impl.h' line='775' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_all_cpu_call_rcu_data_mb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_data_free_mb(call_rcu_data*) -->
+    <function-decl name='call_rcu_data_free_mb' mangled-name='call_rcu_data_free_mb' filepath='urcu-call-rcu-impl.h' line='743' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_data_free_mb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='743' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_mb(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='call_rcu_mb' mangled-name='call_rcu_mb' filepath='urcu-call-rcu-impl.h' line='705' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_mb'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-38' name='head' filepath='urcu-call-rcu-impl.h' line='705' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-24' name='func' filepath='urcu-call-rcu-impl.h' line='706' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int create_all_cpu_call_rcu_data_mb(unsigned long int) -->
+    <function-decl name='create_all_cpu_call_rcu_data_mb' mangled-name='create_all_cpu_call_rcu_data_mb' filepath='urcu-call-rcu-impl.h' line='627' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_mb'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='urcu-call-rcu-impl.h' line='627' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- void set_thread_call_rcu_data_mb(call_rcu_data*) -->
+    <function-decl name='set_thread_call_rcu_data_mb' mangled-name='set_thread_call_rcu_data_mb' filepath='urcu-call-rcu-impl.h' line='614' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_thread_call_rcu_data_mb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='614' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* get_thread_call_rcu_data_mb() -->
+    <function-decl name='get_thread_call_rcu_data_mb' mangled-name='get_thread_call_rcu_data_mb' filepath='urcu-call-rcu-impl.h' line='598' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_thread_call_rcu_data_mb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- call_rcu_data* get_call_rcu_data_mb() -->
+    <function-decl name='get_call_rcu_data_mb' mangled-name='get_call_rcu_data_mb' filepath='urcu-call-rcu-impl.h' line='578' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_data_mb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- call_rcu_data* get_default_call_rcu_data_mb() -->
+    <function-decl name='get_default_call_rcu_data_mb' mangled-name='get_default_call_rcu_data_mb' filepath='urcu-call-rcu-impl.h' line='553' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_default_call_rcu_data_mb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- int set_cpu_call_rcu_data_mb(int, call_rcu_data*) -->
+    <function-decl name='set_cpu_call_rcu_data_mb' mangled-name='set_cpu_call_rcu_data_mb' filepath='urcu-call-rcu-impl.h' line='514' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_cpu_call_rcu_data_mb'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='cpu' filepath='urcu-call-rcu-impl.h' line='514' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='514' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- call_rcu_data* create_call_rcu_data_mb(unsigned long int, int) -->
+    <function-decl name='create_call_rcu_data_mb' mangled-name='create_call_rcu_data_mb' filepath='urcu-call-rcu-impl.h' line='490' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_call_rcu_data_mb'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='urcu-call-rcu-impl.h' line='490' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='cpu_affinity' filepath='urcu-call-rcu-impl.h' line='491' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- pthread_t get_call_rcu_thread_mb(call_rcu_data*) -->
+    <function-decl name='get_call_rcu_thread_mb' mangled-name='get_call_rcu_thread_mb' filepath='urcu-call-rcu-impl.h' line='472' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_thread_mb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='472' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- call_rcu_data* get_cpu_call_rcu_data_mb(int) -->
+    <function-decl name='get_cpu_call_rcu_data_mb' mangled-name='get_cpu_call_rcu_data_mb' filepath='urcu-call-rcu-impl.h' line='450' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_mb'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='cpu' filepath='urcu-call-rcu-impl.h' line='450' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- void rcu_unregister_thread_mb() -->
+    <function-decl name='rcu_unregister_thread_mb' mangled-name='rcu_unregister_thread_mb' filepath='urcu.c' line='526' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_unregister_thread_mb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_register_thread_mb() -->
+    <function-decl name='rcu_register_thread_mb' mangled-name='rcu_register_thread_mb' filepath='urcu.c' line='512' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_register_thread_mb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int rcu_read_ongoing_mb() -->
+    <function-decl name='rcu_read_ongoing_mb' mangled-name='rcu_read_ongoing_mb' filepath='urcu.c' line='507' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_ongoing_mb'>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- void rcu_read_unlock_mb() -->
+    <function-decl name='rcu_read_unlock_mb' mangled-name='rcu_read_unlock_mb' filepath='urcu.c' line='502' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_unlock_mb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_read_lock_mb() -->
+    <function-decl name='rcu_read_lock_mb' mangled-name='rcu_read_lock_mb' filepath='urcu.c' line='497' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_lock_mb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void synchronize_rcu_mb() -->
+    <function-decl name='synchronize_rcu_mb' mangled-name='synchronize_rcu_mb' filepath='urcu.c' line='376' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='synchronize_rcu_mb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_init_mb() -->
+    <function-decl name='rcu_init_mb' mangled-name='rcu_init_mb' filepath='urcu.c' line='87' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_init_mb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-37'>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-39'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-40'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-38'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-41'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-38'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-24'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-42'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-44'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-43'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-46'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-46' name='p' filepath='urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='old' filepath='urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='_new' filepath='urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-45'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-46' name='p' filepath='urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='v' filepath='urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-45'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-46' name='p' filepath='urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='v' filepath='urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-45'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='p' filepath='urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-45'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='384' id='type-id-47'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-49'/>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-50'/>
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='64' id='type-id-51'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-52'/>
+
+    </array-type-def>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-53' filepath='/usr/include/bits/pthreadtypes.h' line='80' column='1' id='type-id-54'/>
+    <!-- union {__pthread_cond_s __data; char __size[48]; long long int __align;} -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='75' column='1' id='type-id-53'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __data -->
+        <var-decl name='__data' type-id='type-id-55' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __size[48] -->
+        <var-decl name='__size' type-id='type-id-47' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __align -->
+        <var-decl name='__align' type-id='type-id-49' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='92' column='1' id='type-id-55'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- union {long long unsigned int __wseq; struct {unsigned int __low; unsigned int __high;} __wseq32;} -->
+        <var-decl name='' type-id='type-id-56' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-51' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='112' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-51' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='113' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='114' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='115' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-51' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='116' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union {long long unsigned int __wseq; struct {unsigned int __low; unsigned int __high;} __wseq32;} -->
+    <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='94' column='1' id='type-id-56'>
+      <data-member access='private'>
+        <!-- long long unsigned int __wseq -->
+        <var-decl name='__wseq' type-id='type-id-50' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='96' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- struct {unsigned int __low; unsigned int __high;} __wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-57' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='101' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct {unsigned int __low; unsigned int __high;} -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='97' column='1' id='type-id-57'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __low -->
+        <var-decl name='__low' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='99' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __high -->
+        <var-decl name='__high' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='100' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='10' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-59' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-60' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='16' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-6' filepath='/usr/include/bits/types.h' line='160' column='1' id='type-id-59'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-6' filepath='/usr/include/bits/types.h' line='197' column='1' id='type-id-60'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-58' const='yes' id='type-id-61'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-61' size-in-bits='64' id='type-id-62'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-11' size-in-bits='64' id='type-id-63'/>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-29' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-54' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='op' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-11' name='val' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-62' name='timeout' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-11' name='val3' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='op' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-11' name='val' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-62' name='timeout' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-11' name='val3' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.9/x86_64-pc-linux-gnu/liburcu-qsbr.so.4.xml b/extras/abi/0.9/x86_64-pc-linux-gnu/liburcu-qsbr.so.4.xml
new file mode 100644 (file)
index 0000000..ad6c8ec
--- /dev/null
@@ -0,0 +1,813 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-qsbr.so.4'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='liburcu-common.so.4'/>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- call_rcu_after_fork_child_qsbr -->
+    <elf-symbol name='call_rcu_after_fork_child_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_qsbr -->
+    <elf-symbol name='call_rcu_after_fork_parent_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_qsbr -->
+    <elf-symbol name='call_rcu_before_fork_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_data_free_qsbr -->
+    <elf-symbol name='call_rcu_data_free_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_qsbr -->
+    <elf-symbol name='call_rcu_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_qsbr -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_call_rcu_data_qsbr -->
+    <elf-symbol name='create_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- defer_rcu_qsbr -->
+    <elf-symbol name='defer_rcu_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data -->
+    <elf-symbol name='free_all_cpu_call_rcu_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_data_qsbr -->
+    <elf-symbol name='get_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_thread_qsbr -->
+    <elf-symbol name='get_call_rcu_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_qsbr -->
+    <elf-symbol name='get_cpu_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_qsbr -->
+    <elf-symbol name='get_default_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_qsbr -->
+    <elf-symbol name='get_thread_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_barrier_qsbr -->
+    <elf-symbol name='rcu_barrier_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_qsbr -->
+    <elf-symbol name='rcu_defer_barrier_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_qsbr -->
+    <elf-symbol name='rcu_defer_barrier_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_exit_qsbr -->
+    <elf-symbol name='rcu_defer_exit_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_qsbr -->
+    <elf-symbol name='rcu_defer_register_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_qsbr -->
+    <elf-symbol name='rcu_defer_unregister_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_exit_qsbr -->
+    <elf-symbol name='rcu_exit_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_quiescent_state_qsbr -->
+    <elf-symbol name='rcu_quiescent_state_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_lock_qsbr -->
+    <elf-symbol name='rcu_read_lock_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_ongoing_qsbr -->
+    <elf-symbol name='rcu_read_ongoing_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_unlock_qsbr -->
+    <elf-symbol name='rcu_read_unlock_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_register_thread_qsbr -->
+    <elf-symbol name='rcu_register_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_thread_offline_qsbr -->
+    <elf-symbol name='rcu_thread_offline_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_thread_online_qsbr -->
+    <elf-symbol name='rcu_thread_online_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_unregister_thread_qsbr -->
+    <elf-symbol name='rcu_unregister_thread_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_qsbr -->
+    <elf-symbol name='set_cpu_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_qsbr -->
+    <elf-symbol name='set_thread_call_rcu_data_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- synchronize_rcu_qsbr -->
+    <elf-symbol name='synchronize_rcu_qsbr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_qsbr -->
+    <elf-symbol name='rcu_flavor_qsbr' size='96' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_gp_qsbr -->
+    <elf-symbol name='rcu_gp_qsbr' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_reader_qsbr -->
+    <elf-symbol name='rcu_reader_qsbr' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu-qsbr.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='320' id='type-id-2'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-4'/>
+
+    </array-type-def>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-5'/>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-6'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-7'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-8'/>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- void -->
+    <type-decl name='void' id='type-id-9'/>
+    <!-- struct rcu_gp_qsbr -->
+    <class-decl name='rcu_gp_qsbr' size-in-bits='1024' is-struct='yes' visibility='default' filepath='urcu/static/urcu-qsbr.h' line='68' column='1' id='type-id-10'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_gp_qsbr::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='urcu/static/urcu-qsbr.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t rcu_gp_qsbr::futex -->
+        <var-decl name='futex' type-id='type-id-11' visibility='default' filepath='urcu/static/urcu-qsbr.h' line='76' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-12' filepath='/usr/include/bits/stdint-intn.h' line='26' column='1' id='type-id-11'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-5' filepath='/usr/include/bits/types.h' line='41' column='1' id='type-id-12'/>
+    <!-- struct rcu_reader_qsbr -->
+    <class-decl name='rcu_reader_qsbr' size-in-bits='2048' is-struct='yes' visibility='default' filepath='urcu/static/urcu-qsbr.h' line='81' column='1' id='type-id-13'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_reader_qsbr::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='urcu/static/urcu-qsbr.h' line='83' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head rcu_reader_qsbr::node -->
+        <var-decl name='node' type-id='type-id-14' visibility='default' filepath='urcu/static/urcu-qsbr.h' line='85' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- int rcu_reader_qsbr::waiting -->
+        <var-decl name='waiting' type-id='type-id-5' visibility='default' filepath='urcu/static/urcu-qsbr.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1216'>
+        <!-- pthread_t rcu_reader_qsbr::tid -->
+        <var-decl name='tid' type-id='type-id-15' visibility='default' filepath='urcu/static/urcu-qsbr.h' line='87' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int rcu_reader_qsbr::registered -->
+        <var-decl name='registered' type-id='type-id-8' visibility='default' filepath='urcu/static/urcu-qsbr.h' line='89' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='./urcu/list.h' line='35' column='1' id='type-id-14'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-16' visibility='default' filepath='./urcu/list.h' line='36' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-16' visibility='default' filepath='./urcu/list.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/bits/pthreadtypes.h' line='27' column='1' id='type-id-15'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='768' is-struct='yes' visibility='default' filepath='./urcu-flavor.h' line='30' column='1' id='type-id-17'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='31' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-19' visibility='default' filepath='./urcu-flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-20' visibility='default' filepath='./urcu-flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='37' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-21' visibility='default' filepath='./urcu-flavor.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='40' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='42' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='45' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='./urcu-call-rcu.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-23' visibility='default' filepath='./urcu-call-rcu.h' line='60' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-24' visibility='default' filepath='./urcu-call-rcu.h' line='61' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='59' column='1' id='type-id-23'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-25' visibility='default' filepath='urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='urcu-call-rcu-impl.h' line='54' column='1' id='type-id-26'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-27' visibility='default' filepath='urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-28' visibility='default' filepath='urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-11' visibility='default' filepath='urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-15' visibility='default' filepath='urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-5' visibility='default' filepath='urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-14' visibility='default' filepath='urcu-call-rcu-impl.h' line='70' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='127' column='1' id='type-id-27'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-25' visibility='default' filepath='urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='72' column='1' id='type-id-28'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-23' visibility='default' filepath='urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-29' visibility='default' filepath='urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-30' filepath='/usr/include/bits/pthreadtypes.h' line='72' column='1' id='type-id-29'/>
+    <!-- union {__pthread_mutex_s __data; char __size[40]; long int __align;} -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='67' column='1' id='type-id-30'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __data -->
+        <var-decl name='__data' type-id='type-id-31' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __size[40] -->
+        <var-decl name='__size' type-id='type-id-2' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __align -->
+        <var-decl name='__align' type-id='type-id-6' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='22' column='1' id='type-id-31'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-5' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='24' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='25' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-5' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='26' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='28' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-5' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-7' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-7' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-32' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-33' filepath='/usr/include/bits/thread-shared-types.h' line='53' column='1' id='type-id-32'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='49' column='1' id='type-id-33'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-34' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='51' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-34' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='52' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-34'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-35'/>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-14' size-in-bits='64' id='type-id-16'/>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-23' size-in-bits='64' id='type-id-25'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-17' const='yes' id='type-id-36'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-37' size-in-bits='64' id='type-id-19'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-38'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-39' size-in-bits='64' id='type-id-18'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-40' size-in-bits='64' id='type-id-24'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-41' size-in-bits='64' id='type-id-20'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-42' size-in-bits='64' id='type-id-21'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-43' size-in-bits='64' id='type-id-44'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-9' size-in-bits='64' id='type-id-45'/>
+    <!-- rcu_gp_qsbr rcu_gp_qsbr -->
+    <var-decl name='rcu_gp_qsbr' type-id='type-id-10' mangled-name='rcu_gp_qsbr' visibility='default' filepath='urcu/static/urcu-qsbr.h' line='79' column='1' elf-symbol-id='rcu_gp_qsbr'/>
+    <!-- rcu_reader_qsbr rcu_reader_qsbr -->
+    <var-decl name='rcu_reader_qsbr' type-id='type-id-13' mangled-name='rcu_reader_qsbr' visibility='default' filepath='urcu/static/urcu-qsbr.h' line='92' column='1' elf-symbol-id='rcu_reader_qsbr'/>
+    <!-- const rcu_flavor_struct rcu_flavor_qsbr -->
+    <var-decl name='rcu_flavor_qsbr' type-id='type-id-36' mangled-name='rcu_flavor_qsbr' visibility='default' filepath='./urcu-flavor.h' line='64' column='1' elf-symbol-id='rcu_flavor_qsbr'/>
+    <!-- void rcu_defer_exit_qsbr() -->
+    <function-decl name='rcu_defer_exit_qsbr' mangled-name='rcu_defer_exit_qsbr' filepath='urcu-defer-impl.h' line='466' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_exit_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_defer_unregister_thread_qsbr() -->
+    <function-decl name='rcu_defer_unregister_thread_qsbr' mangled-name='rcu_defer_unregister_thread_qsbr' filepath='urcu-defer-impl.h' line='448' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_unregister_thread_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int rcu_defer_register_thread_qsbr() -->
+    <function-decl name='rcu_defer_register_thread_qsbr' mangled-name='rcu_defer_register_thread_qsbr' filepath='urcu-defer-impl.h' line='426' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_register_thread_qsbr'>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- void defer_rcu_qsbr(void (void*)*, void*) -->
+    <function-decl name='defer_rcu_qsbr' mangled-name='defer_rcu_qsbr' filepath='urcu-defer-impl.h' line='395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_qsbr'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-44' name='fct' filepath='urcu-defer-impl.h' line='395' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='p' filepath='urcu-defer-impl.h' line='395' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_qsbr() -->
+    <function-decl name='rcu_defer_barrier_qsbr' mangled-name='rcu_defer_barrier_qsbr' filepath='urcu-defer-impl.h' line='281' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_thread_qsbr() -->
+    <function-decl name='rcu_defer_barrier_thread_qsbr' mangled-name='rcu_defer_barrier_thread_qsbr' filepath='urcu-defer-impl.h' line='261' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_child_qsbr() -->
+    <function-decl name='call_rcu_after_fork_child_qsbr' mangled-name='call_rcu_after_fork_child_qsbr' filepath='urcu-call-rcu-impl.h' line='949' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_parent_qsbr() -->
+    <function-decl name='call_rcu_after_fork_parent_qsbr' mangled-name='call_rcu_after_fork_parent_qsbr' filepath='urcu-call-rcu-impl.h' line='931' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_parent_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_before_fork_qsbr() -->
+    <function-decl name='call_rcu_before_fork_qsbr' mangled-name='call_rcu_before_fork_qsbr' filepath='urcu-call-rcu-impl.h' line='909' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_before_fork_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_barrier_qsbr() -->
+    <function-decl name='rcu_barrier_qsbr' mangled-name='rcu_barrier_qsbr' filepath='urcu-call-rcu-impl.h' line='838' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_barrier_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void free_all_cpu_call_rcu_data() -->
+    <function-decl name='free_all_cpu_call_rcu_data' mangled-name='free_all_cpu_call_rcu_data' filepath='urcu-call-rcu-impl.h' line='775' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_all_cpu_call_rcu_data'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_data_free_qsbr(call_rcu_data*) -->
+    <function-decl name='call_rcu_data_free_qsbr' mangled-name='call_rcu_data_free_qsbr' filepath='urcu-call-rcu-impl.h' line='743' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_data_free_qsbr'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='743' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_qsbr(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='call_rcu_qsbr' mangled-name='call_rcu_qsbr' filepath='urcu-call-rcu-impl.h' line='705' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_qsbr'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-38' name='head' filepath='urcu-call-rcu-impl.h' line='705' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-24' name='func' filepath='urcu-call-rcu-impl.h' line='706' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int create_all_cpu_call_rcu_data_qsbr(unsigned long int) -->
+    <function-decl name='create_all_cpu_call_rcu_data_qsbr' mangled-name='create_all_cpu_call_rcu_data_qsbr' filepath='urcu-call-rcu-impl.h' line='627' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_qsbr'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='urcu-call-rcu-impl.h' line='627' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- void set_thread_call_rcu_data_qsbr(call_rcu_data*) -->
+    <function-decl name='set_thread_call_rcu_data_qsbr' mangled-name='set_thread_call_rcu_data_qsbr' filepath='urcu-call-rcu-impl.h' line='614' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_thread_call_rcu_data_qsbr'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='614' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* get_thread_call_rcu_data_qsbr() -->
+    <function-decl name='get_thread_call_rcu_data_qsbr' mangled-name='get_thread_call_rcu_data_qsbr' filepath='urcu-call-rcu-impl.h' line='598' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_thread_call_rcu_data_qsbr'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- call_rcu_data* get_call_rcu_data_qsbr() -->
+    <function-decl name='get_call_rcu_data_qsbr' mangled-name='get_call_rcu_data_qsbr' filepath='urcu-call-rcu-impl.h' line='578' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_data_qsbr'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- call_rcu_data* get_default_call_rcu_data_qsbr() -->
+    <function-decl name='get_default_call_rcu_data_qsbr' mangled-name='get_default_call_rcu_data_qsbr' filepath='urcu-call-rcu-impl.h' line='553' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_default_call_rcu_data_qsbr'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- int set_cpu_call_rcu_data_qsbr(int, call_rcu_data*) -->
+    <function-decl name='set_cpu_call_rcu_data_qsbr' mangled-name='set_cpu_call_rcu_data_qsbr' filepath='urcu-call-rcu-impl.h' line='514' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_cpu_call_rcu_data_qsbr'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='cpu' filepath='urcu-call-rcu-impl.h' line='514' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='514' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- call_rcu_data* create_call_rcu_data_qsbr(unsigned long int, int) -->
+    <function-decl name='create_call_rcu_data_qsbr' mangled-name='create_call_rcu_data_qsbr' filepath='urcu-call-rcu-impl.h' line='490' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_call_rcu_data_qsbr'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='urcu-call-rcu-impl.h' line='490' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='cpu_affinity' filepath='urcu-call-rcu-impl.h' line='491' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- pthread_t get_call_rcu_thread_qsbr(call_rcu_data*) -->
+    <function-decl name='get_call_rcu_thread_qsbr' mangled-name='get_call_rcu_thread_qsbr' filepath='urcu-call-rcu-impl.h' line='472' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_thread_qsbr'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='472' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- call_rcu_data* get_cpu_call_rcu_data_qsbr(int) -->
+    <function-decl name='get_cpu_call_rcu_data_qsbr' mangled-name='get_cpu_call_rcu_data_qsbr' filepath='urcu-call-rcu-impl.h' line='450' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_qsbr'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='cpu' filepath='urcu-call-rcu-impl.h' line='450' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- void rcu_exit_qsbr() -->
+    <function-decl name='rcu_exit_qsbr' mangled-name='rcu_exit_qsbr' filepath='urcu-qsbr.c' line='492' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_exit_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_unregister_thread_qsbr() -->
+    <function-decl name='rcu_unregister_thread_qsbr' mangled-name='rcu_unregister_thread_qsbr' filepath='urcu-qsbr.c' line='478' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_unregister_thread_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_register_thread_qsbr() -->
+    <function-decl name='rcu_register_thread_qsbr' mangled-name='rcu_register_thread_qsbr' filepath='urcu-qsbr.c' line='465' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_register_thread_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_thread_online_qsbr() -->
+    <function-decl name='rcu_thread_online_qsbr' mangled-name='rcu_thread_online_qsbr' filepath='urcu-qsbr.c' line='460' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_thread_online_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_thread_offline_qsbr() -->
+    <function-decl name='rcu_thread_offline_qsbr' mangled-name='rcu_thread_offline_qsbr' filepath='urcu-qsbr.c' line='455' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_thread_offline_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_quiescent_state_qsbr() -->
+    <function-decl name='rcu_quiescent_state_qsbr' mangled-name='rcu_quiescent_state_qsbr' filepath='urcu-qsbr.c' line='450' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_quiescent_state_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int rcu_read_ongoing_qsbr() -->
+    <function-decl name='rcu_read_ongoing_qsbr' mangled-name='rcu_read_ongoing_qsbr' filepath='urcu-qsbr.c' line='445' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_ongoing_qsbr'>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- void rcu_read_unlock_qsbr() -->
+    <function-decl name='rcu_read_unlock_qsbr' mangled-name='rcu_read_unlock_qsbr' filepath='urcu-qsbr.c' line='440' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_unlock_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_read_lock_qsbr() -->
+    <function-decl name='rcu_read_lock_qsbr' mangled-name='rcu_read_lock_qsbr' filepath='urcu-qsbr.c' line='435' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_lock_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void synchronize_rcu_qsbr() -->
+    <function-decl name='synchronize_rcu_qsbr' mangled-name='synchronize_rcu_qsbr' filepath='urcu-qsbr.c' line='345' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='synchronize_rcu_qsbr'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-37'>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-39'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-40'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-38'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-41'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-38'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-24'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-42'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-44'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-43'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-46'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-46' name='p' filepath='urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='old' filepath='urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='_new' filepath='urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-45'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-46' name='p' filepath='urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='v' filepath='urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-45'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-46' name='p' filepath='urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='v' filepath='urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-45'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='p' filepath='urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-45'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='384' id='type-id-47'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-49'/>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-50'/>
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='64' id='type-id-51'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-52'/>
+
+    </array-type-def>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-53' filepath='/usr/include/bits/pthreadtypes.h' line='80' column='1' id='type-id-54'/>
+    <!-- union {__pthread_cond_s __data; char __size[48]; long long int __align;} -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='75' column='1' id='type-id-53'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __data -->
+        <var-decl name='__data' type-id='type-id-55' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __size[48] -->
+        <var-decl name='__size' type-id='type-id-47' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __align -->
+        <var-decl name='__align' type-id='type-id-49' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='92' column='1' id='type-id-55'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- union {long long unsigned int __wseq; struct {unsigned int __low; unsigned int __high;} __wseq32;} -->
+        <var-decl name='' type-id='type-id-56' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-51' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='112' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-51' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='113' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='114' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='115' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-51' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='116' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union {long long unsigned int __wseq; struct {unsigned int __low; unsigned int __high;} __wseq32;} -->
+    <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='94' column='1' id='type-id-56'>
+      <data-member access='private'>
+        <!-- long long unsigned int __wseq -->
+        <var-decl name='__wseq' type-id='type-id-50' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='96' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- struct {unsigned int __low; unsigned int __high;} __wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-57' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='101' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct {unsigned int __low; unsigned int __high;} -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='97' column='1' id='type-id-57'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __low -->
+        <var-decl name='__low' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='99' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __high -->
+        <var-decl name='__high' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='100' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='10' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-59' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-60' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='16' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-6' filepath='/usr/include/bits/types.h' line='160' column='1' id='type-id-59'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-6' filepath='/usr/include/bits/types.h' line='197' column='1' id='type-id-60'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-58' const='yes' id='type-id-61'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-61' size-in-bits='64' id='type-id-62'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-11' size-in-bits='64' id='type-id-63'/>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-29' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-54' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='op' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-11' name='val' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-62' name='timeout' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-11' name='val3' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='op' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-11' name='val' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-62' name='timeout' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-11' name='val3' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.9/x86_64-pc-linux-gnu/liburcu-signal.so.4.xml b/extras/abi/0.9/x86_64-pc-linux-gnu/liburcu-signal.so.4.xml
new file mode 100644 (file)
index 0000000..f61bc43
--- /dev/null
@@ -0,0 +1,799 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu-signal.so.4'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='liburcu-common.so.4'/>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- call_rcu_after_fork_child_sig -->
+    <elf-symbol name='call_rcu_after_fork_child_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_sig -->
+    <elf-symbol name='call_rcu_after_fork_parent_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_sig -->
+    <elf-symbol name='call_rcu_before_fork_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_data_free_sig -->
+    <elf-symbol name='call_rcu_data_free_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_sig -->
+    <elf-symbol name='call_rcu_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_sig -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_call_rcu_data_sig -->
+    <elf-symbol name='create_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- defer_rcu_sig -->
+    <elf-symbol name='defer_rcu_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data_sig -->
+    <elf-symbol name='free_all_cpu_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_data_sig -->
+    <elf-symbol name='get_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_thread_sig -->
+    <elf-symbol name='get_call_rcu_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_sig -->
+    <elf-symbol name='get_cpu_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_sig -->
+    <elf-symbol name='get_default_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_sig -->
+    <elf-symbol name='get_thread_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_barrier_sig -->
+    <elf-symbol name='rcu_barrier_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_sig -->
+    <elf-symbol name='rcu_defer_barrier_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_sig -->
+    <elf-symbol name='rcu_defer_barrier_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_exit_sig -->
+    <elf-symbol name='rcu_defer_exit_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_sig -->
+    <elf-symbol name='rcu_defer_register_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_sig -->
+    <elf-symbol name='rcu_defer_unregister_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_exit_sig -->
+    <elf-symbol name='rcu_exit_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_init_sig -->
+    <elf-symbol name='rcu_init_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_lock_sig -->
+    <elf-symbol name='rcu_read_lock_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_ongoing_sig -->
+    <elf-symbol name='rcu_read_ongoing_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_unlock_sig -->
+    <elf-symbol name='rcu_read_unlock_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_register_thread_sig -->
+    <elf-symbol name='rcu_register_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_unregister_thread_sig -->
+    <elf-symbol name='rcu_unregister_thread_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_sig -->
+    <elf-symbol name='set_cpu_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_sig -->
+    <elf-symbol name='set_thread_call_rcu_data_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- synchronize_rcu_sig -->
+    <elf-symbol name='synchronize_rcu_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_sig -->
+    <elf-symbol name='rcu_flavor_sig' size='96' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_gp_sig -->
+    <elf-symbol name='rcu_gp_sig' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_reader_sig -->
+    <elf-symbol name='rcu_reader_sig' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='320' id='type-id-2'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-4'/>
+
+    </array-type-def>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-5'/>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-6'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-7'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-8'/>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- void -->
+    <type-decl name='void' id='type-id-9'/>
+    <!-- struct rcu_gp_sig -->
+    <class-decl name='rcu_gp_sig' size-in-bits='1024' is-struct='yes' visibility='default' filepath='urcu/static/urcu.h' line='127' column='1' id='type-id-10'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_gp_sig::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='urcu/static/urcu.h' line='135' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t rcu_gp_sig::futex -->
+        <var-decl name='futex' type-id='type-id-11' visibility='default' filepath='urcu/static/urcu.h' line='137' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-12' filepath='/usr/include/bits/stdint-intn.h' line='26' column='1' id='type-id-11'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-5' filepath='/usr/include/bits/types.h' line='41' column='1' id='type-id-12'/>
+    <!-- struct rcu_reader_sig -->
+    <class-decl name='rcu_reader_sig' size-in-bits='2048' is-struct='yes' visibility='default' filepath='urcu/static/urcu.h' line='142' column='1' id='type-id-13'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_reader_sig::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='urcu/static/urcu.h' line='144' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char rcu_reader_sig::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-1' visibility='default' filepath='urcu/static/urcu.h' line='145' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head rcu_reader_sig::node -->
+        <var-decl name='node' type-id='type-id-14' visibility='default' filepath='urcu/static/urcu.h' line='147' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t rcu_reader_sig::tid -->
+        <var-decl name='tid' type-id='type-id-15' visibility='default' filepath='urcu/static/urcu.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int rcu_reader_sig::registered -->
+        <var-decl name='registered' type-id='type-id-8' visibility='default' filepath='urcu/static/urcu.h' line='150' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='./urcu/list.h' line='35' column='1' id='type-id-14'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-16' visibility='default' filepath='./urcu/list.h' line='36' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-16' visibility='default' filepath='./urcu/list.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/bits/pthreadtypes.h' line='27' column='1' id='type-id-15'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='768' is-struct='yes' visibility='default' filepath='./urcu-flavor.h' line='30' column='1' id='type-id-17'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='31' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-19' visibility='default' filepath='./urcu-flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-20' visibility='default' filepath='./urcu-flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='37' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-21' visibility='default' filepath='./urcu-flavor.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='40' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='42' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='45' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='./urcu-call-rcu.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-23' visibility='default' filepath='./urcu-call-rcu.h' line='60' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-24' visibility='default' filepath='./urcu-call-rcu.h' line='61' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='59' column='1' id='type-id-23'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-25' visibility='default' filepath='urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='urcu-call-rcu-impl.h' line='54' column='1' id='type-id-26'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-27' visibility='default' filepath='urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-28' visibility='default' filepath='urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-11' visibility='default' filepath='urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-15' visibility='default' filepath='urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-5' visibility='default' filepath='urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-14' visibility='default' filepath='urcu-call-rcu-impl.h' line='70' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='127' column='1' id='type-id-27'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-25' visibility='default' filepath='urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='72' column='1' id='type-id-28'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-23' visibility='default' filepath='urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-29' visibility='default' filepath='urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-30' filepath='/usr/include/bits/pthreadtypes.h' line='72' column='1' id='type-id-29'/>
+    <!-- union {__pthread_mutex_s __data; char __size[40]; long int __align;} -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='67' column='1' id='type-id-30'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __data -->
+        <var-decl name='__data' type-id='type-id-31' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __size[40] -->
+        <var-decl name='__size' type-id='type-id-2' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __align -->
+        <var-decl name='__align' type-id='type-id-6' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='22' column='1' id='type-id-31'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-5' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='24' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='25' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-5' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='26' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='28' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-5' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-7' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-7' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-32' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-33' filepath='/usr/include/bits/thread-shared-types.h' line='53' column='1' id='type-id-32'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='49' column='1' id='type-id-33'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-34' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='51' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-34' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='52' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-34'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-35'/>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-14' size-in-bits='64' id='type-id-16'/>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-23' size-in-bits='64' id='type-id-25'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-17' const='yes' id='type-id-36'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-37' size-in-bits='64' id='type-id-19'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-38'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-39' size-in-bits='64' id='type-id-18'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-40' size-in-bits='64' id='type-id-24'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-41' size-in-bits='64' id='type-id-20'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-42' size-in-bits='64' id='type-id-21'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-43' size-in-bits='64' id='type-id-44'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-9' size-in-bits='64' id='type-id-45'/>
+    <!-- rcu_gp_sig rcu_gp_sig -->
+    <var-decl name='rcu_gp_sig' type-id='type-id-10' mangled-name='rcu_gp_sig' visibility='default' filepath='urcu/static/urcu.h' line='140' column='1' elf-symbol-id='rcu_gp_sig'/>
+    <!-- rcu_reader_sig rcu_reader_sig -->
+    <var-decl name='rcu_reader_sig' type-id='type-id-13' mangled-name='rcu_reader_sig' visibility='default' filepath='urcu/static/urcu.h' line='153' column='1' elf-symbol-id='rcu_reader_sig'/>
+    <!-- const rcu_flavor_struct rcu_flavor_sig -->
+    <var-decl name='rcu_flavor_sig' type-id='type-id-36' mangled-name='rcu_flavor_sig' visibility='default' filepath='./urcu-flavor.h' line='64' column='1' elf-symbol-id='rcu_flavor_sig'/>
+    <!-- void rcu_defer_exit_sig() -->
+    <function-decl name='rcu_defer_exit_sig' mangled-name='rcu_defer_exit_sig' filepath='urcu-defer-impl.h' line='466' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_exit_sig'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_defer_unregister_thread_sig() -->
+    <function-decl name='rcu_defer_unregister_thread_sig' mangled-name='rcu_defer_unregister_thread_sig' filepath='urcu-defer-impl.h' line='448' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_unregister_thread_sig'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int rcu_defer_register_thread_sig() -->
+    <function-decl name='rcu_defer_register_thread_sig' mangled-name='rcu_defer_register_thread_sig' filepath='urcu-defer-impl.h' line='426' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_register_thread_sig'>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- void defer_rcu_sig(void (void*)*, void*) -->
+    <function-decl name='defer_rcu_sig' mangled-name='defer_rcu_sig' filepath='urcu-defer-impl.h' line='395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_sig'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-44' name='fct' filepath='urcu-defer-impl.h' line='395' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='p' filepath='urcu-defer-impl.h' line='395' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_sig() -->
+    <function-decl name='rcu_defer_barrier_sig' mangled-name='rcu_defer_barrier_sig' filepath='urcu-defer-impl.h' line='281' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_sig'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_thread_sig() -->
+    <function-decl name='rcu_defer_barrier_thread_sig' mangled-name='rcu_defer_barrier_thread_sig' filepath='urcu-defer-impl.h' line='261' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_sig'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_child_sig() -->
+    <function-decl name='call_rcu_after_fork_child_sig' mangled-name='call_rcu_after_fork_child_sig' filepath='urcu-call-rcu-impl.h' line='949' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_sig'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_parent_sig() -->
+    <function-decl name='call_rcu_after_fork_parent_sig' mangled-name='call_rcu_after_fork_parent_sig' filepath='urcu-call-rcu-impl.h' line='931' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_parent_sig'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_before_fork_sig() -->
+    <function-decl name='call_rcu_before_fork_sig' mangled-name='call_rcu_before_fork_sig' filepath='urcu-call-rcu-impl.h' line='909' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_before_fork_sig'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_barrier_sig() -->
+    <function-decl name='rcu_barrier_sig' mangled-name='rcu_barrier_sig' filepath='urcu-call-rcu-impl.h' line='838' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_barrier_sig'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void free_all_cpu_call_rcu_data_sig() -->
+    <function-decl name='free_all_cpu_call_rcu_data_sig' mangled-name='free_all_cpu_call_rcu_data_sig' filepath='urcu-call-rcu-impl.h' line='775' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_all_cpu_call_rcu_data_sig'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_data_free_sig(call_rcu_data*) -->
+    <function-decl name='call_rcu_data_free_sig' mangled-name='call_rcu_data_free_sig' filepath='urcu-call-rcu-impl.h' line='743' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_data_free_sig'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='743' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_sig(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='call_rcu_sig' mangled-name='call_rcu_sig' filepath='urcu-call-rcu-impl.h' line='705' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_sig'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-38' name='head' filepath='urcu-call-rcu-impl.h' line='705' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-24' name='func' filepath='urcu-call-rcu-impl.h' line='706' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int create_all_cpu_call_rcu_data_sig(unsigned long int) -->
+    <function-decl name='create_all_cpu_call_rcu_data_sig' mangled-name='create_all_cpu_call_rcu_data_sig' filepath='urcu-call-rcu-impl.h' line='627' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_sig'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='urcu-call-rcu-impl.h' line='627' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- void set_thread_call_rcu_data_sig(call_rcu_data*) -->
+    <function-decl name='set_thread_call_rcu_data_sig' mangled-name='set_thread_call_rcu_data_sig' filepath='urcu-call-rcu-impl.h' line='614' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_thread_call_rcu_data_sig'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='614' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* get_thread_call_rcu_data_sig() -->
+    <function-decl name='get_thread_call_rcu_data_sig' mangled-name='get_thread_call_rcu_data_sig' filepath='urcu-call-rcu-impl.h' line='598' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_thread_call_rcu_data_sig'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- call_rcu_data* get_call_rcu_data_sig() -->
+    <function-decl name='get_call_rcu_data_sig' mangled-name='get_call_rcu_data_sig' filepath='urcu-call-rcu-impl.h' line='578' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_data_sig'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- call_rcu_data* get_default_call_rcu_data_sig() -->
+    <function-decl name='get_default_call_rcu_data_sig' mangled-name='get_default_call_rcu_data_sig' filepath='urcu-call-rcu-impl.h' line='553' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_default_call_rcu_data_sig'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- int set_cpu_call_rcu_data_sig(int, call_rcu_data*) -->
+    <function-decl name='set_cpu_call_rcu_data_sig' mangled-name='set_cpu_call_rcu_data_sig' filepath='urcu-call-rcu-impl.h' line='514' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_cpu_call_rcu_data_sig'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='cpu' filepath='urcu-call-rcu-impl.h' line='514' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='514' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- call_rcu_data* create_call_rcu_data_sig(unsigned long int, int) -->
+    <function-decl name='create_call_rcu_data_sig' mangled-name='create_call_rcu_data_sig' filepath='urcu-call-rcu-impl.h' line='490' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_call_rcu_data_sig'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='urcu-call-rcu-impl.h' line='490' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='cpu_affinity' filepath='urcu-call-rcu-impl.h' line='491' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- pthread_t get_call_rcu_thread_sig(call_rcu_data*) -->
+    <function-decl name='get_call_rcu_thread_sig' mangled-name='get_call_rcu_thread_sig' filepath='urcu-call-rcu-impl.h' line='472' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_thread_sig'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='472' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- call_rcu_data* get_cpu_call_rcu_data_sig(int) -->
+    <function-decl name='get_cpu_call_rcu_data_sig' mangled-name='get_cpu_call_rcu_data_sig' filepath='urcu-call-rcu-impl.h' line='450' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_sig'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='cpu' filepath='urcu-call-rcu-impl.h' line='450' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- void rcu_exit_sig() -->
+    <function-decl name='rcu_exit_sig' mangled-name='rcu_exit_sig' filepath='urcu.c' line='588' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_exit_sig'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_init_sig() -->
+    <function-decl name='rcu_init_sig' mangled-name='rcu_init_sig' filepath='urcu.c' line='571' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_init_sig'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_unregister_thread_sig() -->
+    <function-decl name='rcu_unregister_thread_sig' mangled-name='rcu_unregister_thread_sig' filepath='urcu.c' line='526' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_unregister_thread_sig'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_register_thread_sig() -->
+    <function-decl name='rcu_register_thread_sig' mangled-name='rcu_register_thread_sig' filepath='urcu.c' line='512' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_register_thread_sig'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int rcu_read_ongoing_sig() -->
+    <function-decl name='rcu_read_ongoing_sig' mangled-name='rcu_read_ongoing_sig' filepath='urcu.c' line='507' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_ongoing_sig'>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- void rcu_read_unlock_sig() -->
+    <function-decl name='rcu_read_unlock_sig' mangled-name='rcu_read_unlock_sig' filepath='urcu.c' line='502' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_unlock_sig'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_read_lock_sig() -->
+    <function-decl name='rcu_read_lock_sig' mangled-name='rcu_read_lock_sig' filepath='urcu.c' line='497' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_lock_sig'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void synchronize_rcu_sig() -->
+    <function-decl name='synchronize_rcu_sig' mangled-name='synchronize_rcu_sig' filepath='urcu.c' line='376' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='synchronize_rcu_sig'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-37'>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-39'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-40'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-38'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-41'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-38'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-24'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-42'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-44'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-43'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-46'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-46' name='p' filepath='urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='old' filepath='urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='_new' filepath='urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-45'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-46' name='p' filepath='urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='v' filepath='urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-45'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-46' name='p' filepath='urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='v' filepath='urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-45'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='p' filepath='urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-45'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='384' id='type-id-47'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-49'/>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-50'/>
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='64' id='type-id-51'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-52'/>
+
+    </array-type-def>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-53' filepath='/usr/include/bits/pthreadtypes.h' line='80' column='1' id='type-id-54'/>
+    <!-- union {__pthread_cond_s __data; char __size[48]; long long int __align;} -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='75' column='1' id='type-id-53'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __data -->
+        <var-decl name='__data' type-id='type-id-55' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __size[48] -->
+        <var-decl name='__size' type-id='type-id-47' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __align -->
+        <var-decl name='__align' type-id='type-id-49' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='92' column='1' id='type-id-55'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- union {long long unsigned int __wseq; struct {unsigned int __low; unsigned int __high;} __wseq32;} -->
+        <var-decl name='' type-id='type-id-56' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-51' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='112' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-51' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='113' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='114' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='115' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-51' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='116' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union {long long unsigned int __wseq; struct {unsigned int __low; unsigned int __high;} __wseq32;} -->
+    <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='94' column='1' id='type-id-56'>
+      <data-member access='private'>
+        <!-- long long unsigned int __wseq -->
+        <var-decl name='__wseq' type-id='type-id-50' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='96' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- struct {unsigned int __low; unsigned int __high;} __wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-57' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='101' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct {unsigned int __low; unsigned int __high;} -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='97' column='1' id='type-id-57'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __low -->
+        <var-decl name='__low' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='99' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __high -->
+        <var-decl name='__high' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='100' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='10' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-59' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-60' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='16' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-6' filepath='/usr/include/bits/types.h' line='160' column='1' id='type-id-59'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-6' filepath='/usr/include/bits/types.h' line='197' column='1' id='type-id-60'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-58' const='yes' id='type-id-61'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-61' size-in-bits='64' id='type-id-62'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-11' size-in-bits='64' id='type-id-63'/>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-29' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-54' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='op' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-11' name='val' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-62' name='timeout' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-11' name='val3' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='op' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-11' name='val' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-62' name='timeout' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-11' name='val3' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/0.9/x86_64-pc-linux-gnu/liburcu.so.4.xml b/extras/abi/0.9/x86_64-pc-linux-gnu/liburcu.so.4.xml
new file mode 100644 (file)
index 0000000..612689b
--- /dev/null
@@ -0,0 +1,796 @@
+<abi-corpus architecture='elf-amd-x86_64' soname='liburcu.so.4'>
+<!--
+SPDX-FileCopyrightText: 2021 EfficiOS Inc.
+
+SPDX-License-Identifier: CC0-1.0
+-->
+  <elf-needed>
+    <dependency name='liburcu-common.so.4'/>
+    <dependency name='libpthread.so.0'/>
+    <dependency name='libc.so.6'/>
+    <dependency name='ld-linux-x86-64.so.2'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <!-- call_rcu_after_fork_child_memb -->
+    <elf-symbol name='call_rcu_after_fork_child_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_after_fork_parent_memb -->
+    <elf-symbol name='call_rcu_after_fork_parent_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_before_fork_memb -->
+    <elf-symbol name='call_rcu_before_fork_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_data_free_memb -->
+    <elf-symbol name='call_rcu_data_free_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- call_rcu_memb -->
+    <elf-symbol name='call_rcu_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_async -->
+    <elf-symbol name='compat_futex_async' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- compat_futex_noasync -->
+    <elf-symbol name='compat_futex_noasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_all_cpu_call_rcu_data_memb -->
+    <elf-symbol name='create_all_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- create_call_rcu_data_memb -->
+    <elf-symbol name='create_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- defer_rcu_memb -->
+    <elf-symbol name='defer_rcu_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- free_all_cpu_call_rcu_data_memb -->
+    <elf-symbol name='free_all_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_data_memb -->
+    <elf-symbol name='get_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_call_rcu_thread_memb -->
+    <elf-symbol name='get_call_rcu_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_cpu_call_rcu_data_memb -->
+    <elf-symbol name='get_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_default_call_rcu_data_memb -->
+    <elf-symbol name='get_default_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- get_thread_call_rcu_data_memb -->
+    <elf-symbol name='get_thread_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_barrier_memb -->
+    <elf-symbol name='rcu_barrier_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_cmpxchg_pointer_sym -->
+    <elf-symbol name='rcu_cmpxchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_memb -->
+    <elf-symbol name='rcu_defer_barrier_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_barrier_thread_memb -->
+    <elf-symbol name='rcu_defer_barrier_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_exit_memb -->
+    <elf-symbol name='rcu_defer_exit_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_register_thread_memb -->
+    <elf-symbol name='rcu_defer_register_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_defer_unregister_thread_memb -->
+    <elf-symbol name='rcu_defer_unregister_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_dereference_sym -->
+    <elf-symbol name='rcu_dereference_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_init_memb -->
+    <elf-symbol name='rcu_init_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_lock_memb -->
+    <elf-symbol name='rcu_read_lock_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_ongoing_memb -->
+    <elf-symbol name='rcu_read_ongoing_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_read_unlock_memb -->
+    <elf-symbol name='rcu_read_unlock_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_register_thread_memb -->
+    <elf-symbol name='rcu_register_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_set_pointer_sym -->
+    <elf-symbol name='rcu_set_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_unregister_thread_memb -->
+    <elf-symbol name='rcu_unregister_thread_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_xchg_pointer_sym -->
+    <elf-symbol name='rcu_xchg_pointer_sym' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_cpu_call_rcu_data_memb -->
+    <elf-symbol name='set_cpu_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- set_thread_call_rcu_data_memb -->
+    <elf-symbol name='set_thread_call_rcu_data_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- synchronize_rcu_memb -->
+    <elf-symbol name='synchronize_rcu_memb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <!-- __urcu_compat_futex_cond -->
+    <elf-symbol name='__urcu_compat_futex_cond' size='48' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- __urcu_compat_futex_lock -->
+    <elf-symbol name='__urcu_compat_futex_lock' size='40' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_flavor_memb -->
+    <elf-symbol name='rcu_flavor_memb' size='96' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_gp_memb -->
+    <elf-symbol name='rcu_gp_memb' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_has_sys_membarrier_memb -->
+    <elf-symbol name='rcu_has_sys_membarrier_memb' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <!-- rcu_reader_memb -->
+    <elf-symbol name='rcu_reader_memb' size='256' type='tls-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr version='1.0' address-size='64' path='urcu.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+
+    <!-- char -->
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <!-- char[40] -->
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='320' id='type-id-2'>
+      <!-- <anonymous range>[40] -->
+      <subrange length='40' type-id='type-id-3' id='type-id-4'/>
+
+    </array-type-def>
+    <!-- int -->
+    <type-decl name='int' size-in-bits='32' id='type-id-5'/>
+    <!-- long int -->
+    <type-decl name='long int' size-in-bits='64' id='type-id-6'/>
+    <!-- short int -->
+    <type-decl name='short int' size-in-bits='16' id='type-id-7'/>
+    <!-- unsigned int -->
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-8'/>
+    <!-- unsigned long int -->
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <!-- void -->
+    <type-decl name='void' id='type-id-9'/>
+    <!-- struct rcu_gp_memb -->
+    <class-decl name='rcu_gp_memb' size-in-bits='1024' is-struct='yes' visibility='default' filepath='urcu/static/urcu.h' line='127' column='1' id='type-id-10'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_gp_memb::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='urcu/static/urcu.h' line='135' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int32_t rcu_gp_memb::futex -->
+        <var-decl name='futex' type-id='type-id-11' visibility='default' filepath='urcu/static/urcu.h' line='137' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __int32_t int32_t -->
+    <typedef-decl name='int32_t' type-id='type-id-12' filepath='/usr/include/bits/stdint-intn.h' line='26' column='1' id='type-id-11'/>
+    <!-- typedef int __int32_t -->
+    <typedef-decl name='__int32_t' type-id='type-id-5' filepath='/usr/include/bits/types.h' line='41' column='1' id='type-id-12'/>
+    <!-- struct rcu_reader_memb -->
+    <class-decl name='rcu_reader_memb' size-in-bits='2048' is-struct='yes' visibility='default' filepath='urcu/static/urcu.h' line='142' column='1' id='type-id-13'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned long int rcu_reader_memb::ctr -->
+        <var-decl name='ctr' type-id='type-id-3' visibility='default' filepath='urcu/static/urcu.h' line='144' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- char rcu_reader_memb::need_mb -->
+        <var-decl name='need_mb' type-id='type-id-1' visibility='default' filepath='urcu/static/urcu.h' line='145' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1024'>
+        <!-- cds_list_head rcu_reader_memb::node -->
+        <var-decl name='node' type-id='type-id-14' visibility='default' filepath='urcu/static/urcu.h' line='147' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1152'>
+        <!-- pthread_t rcu_reader_memb::tid -->
+        <var-decl name='tid' type-id='type-id-15' visibility='default' filepath='urcu/static/urcu.h' line='148' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='31'>
+        <!-- unsigned int rcu_reader_memb::registered -->
+        <var-decl name='registered' type-id='type-id-8' visibility='default' filepath='urcu/static/urcu.h' line='150' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_list_head -->
+    <class-decl name='cds_list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='./urcu/list.h' line='35' column='1' id='type-id-14'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_list_head* cds_list_head::next -->
+        <var-decl name='next' type-id='type-id-16' visibility='default' filepath='./urcu/list.h' line='36' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_list_head* cds_list_head::prev -->
+        <var-decl name='prev' type-id='type-id-16' visibility='default' filepath='./urcu/list.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef unsigned long int pthread_t -->
+    <typedef-decl name='pthread_t' type-id='type-id-3' filepath='/usr/include/bits/pthreadtypes.h' line='27' column='1' id='type-id-15'/>
+    <!-- struct rcu_flavor_struct -->
+    <class-decl name='rcu_flavor_struct' size-in-bits='768' is-struct='yes' visibility='default' filepath='./urcu-flavor.h' line='30' column='1' id='type-id-17'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- void ()* rcu_flavor_struct::read_lock -->
+        <var-decl name='read_lock' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='31' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void ()* rcu_flavor_struct::read_unlock -->
+        <var-decl name='read_unlock' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int ()* rcu_flavor_struct::read_ongoing -->
+        <var-decl name='read_ongoing' type-id='type-id-19' visibility='default' filepath='./urcu-flavor.h' line='33' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- void ()* rcu_flavor_struct::read_quiescent_state -->
+        <var-decl name='read_quiescent_state' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- void (rcu_head*, void (rcu_head*)*)* rcu_flavor_struct::update_call_rcu -->
+        <var-decl name='update_call_rcu' type-id='type-id-20' visibility='default' filepath='./urcu-flavor.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- void ()* rcu_flavor_struct::update_synchronize_rcu -->
+        <var-decl name='update_synchronize_rcu' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='37' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <!-- void (void (void*)*, void*)* rcu_flavor_struct::update_defer_rcu -->
+        <var-decl name='update_defer_rcu' type-id='type-id-21' visibility='default' filepath='./urcu-flavor.h' line='38' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- void ()* rcu_flavor_struct::thread_offline -->
+        <var-decl name='thread_offline' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='40' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- void ()* rcu_flavor_struct::thread_online -->
+        <var-decl name='thread_online' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='41' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- void ()* rcu_flavor_struct::register_thread -->
+        <var-decl name='register_thread' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='42' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- void ()* rcu_flavor_struct::unregister_thread -->
+        <var-decl name='unregister_thread' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='43' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- void ()* rcu_flavor_struct::barrier -->
+        <var-decl name='barrier' type-id='type-id-18' visibility='default' filepath='./urcu-flavor.h' line='45' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct rcu_head -->
+    <class-decl name='rcu_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='./urcu-call-rcu.h' line='59' column='1' id='type-id-22'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node rcu_head::next -->
+        <var-decl name='next' type-id='type-id-23' visibility='default' filepath='./urcu-call-rcu.h' line='60' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- void (rcu_head*)* rcu_head::func -->
+        <var-decl name='func' type-id='type-id-24' visibility='default' filepath='./urcu-call-rcu.h' line='61' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_node -->
+    <class-decl name='cds_wfcq_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='59' column='1' id='type-id-23'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_node::next -->
+        <var-decl name='next' type-id='type-id-25' visibility='default' filepath='urcu/wfcqueue.h' line='60' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct call_rcu_data -->
+    <class-decl name='call_rcu_data' size-in-bits='1024' is-struct='yes' visibility='default' filepath='urcu-call-rcu-impl.h' line='54' column='1' id='type-id-26'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_tail call_rcu_data::cbs_tail -->
+        <var-decl name='cbs_tail' type-id='type-id-27' visibility='default' filepath='urcu-call-rcu-impl.h' line='62' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- cds_wfcq_head call_rcu_data::cbs_head -->
+        <var-decl name='cbs_head' type-id='type-id-28' visibility='default' filepath='urcu-call-rcu-impl.h' line='63' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <!-- unsigned long int call_rcu_data::flags -->
+        <var-decl name='flags' type-id='type-id-3' visibility='default' filepath='urcu-call-rcu-impl.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <!-- int32_t call_rcu_data::futex -->
+        <var-decl name='futex' type-id='type-id-11' visibility='default' filepath='urcu-call-rcu-impl.h' line='65' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <!-- unsigned long int call_rcu_data::qlen -->
+        <var-decl name='qlen' type-id='type-id-3' visibility='default' filepath='urcu-call-rcu-impl.h' line='66' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <!-- pthread_t call_rcu_data::tid -->
+        <var-decl name='tid' type-id='type-id-15' visibility='default' filepath='urcu-call-rcu-impl.h' line='67' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <!-- int call_rcu_data::cpu_affinity -->
+        <var-decl name='cpu_affinity' type-id='type-id-5' visibility='default' filepath='urcu-call-rcu-impl.h' line='68' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='768'>
+        <!-- unsigned long int call_rcu_data::gp_count -->
+        <var-decl name='gp_count' type-id='type-id-3' visibility='default' filepath='urcu-call-rcu-impl.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='832'>
+        <!-- cds_list_head call_rcu_data::list -->
+        <var-decl name='list' type-id='type-id-14' visibility='default' filepath='urcu-call-rcu-impl.h' line='70' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_tail -->
+    <class-decl name='cds_wfcq_tail' size-in-bits='64' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='127' column='1' id='type-id-27'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node* cds_wfcq_tail::p -->
+        <var-decl name='p' type-id='type-id-25' visibility='default' filepath='urcu/wfcqueue.h' line='128' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct cds_wfcq_head -->
+    <class-decl name='cds_wfcq_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='urcu/wfcqueue.h' line='72' column='1' id='type-id-28'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- cds_wfcq_node cds_wfcq_head::node -->
+        <var-decl name='node' type-id='type-id-23' visibility='default' filepath='urcu/wfcqueue.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- pthread_mutex_t cds_wfcq_head::lock -->
+        <var-decl name='lock' type-id='type-id-29' visibility='default' filepath='urcu/wfcqueue.h' line='74' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __anonymous_union__ pthread_mutex_t -->
+    <typedef-decl name='pthread_mutex_t' type-id='type-id-30' filepath='/usr/include/bits/pthreadtypes.h' line='72' column='1' id='type-id-29'/>
+    <!-- union {__pthread_mutex_s __data; char __size[40]; long int __align;} -->
+    <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='67' column='1' id='type-id-30'>
+      <data-member access='private'>
+        <!-- __pthread_mutex_s __data -->
+        <var-decl name='__data' type-id='type-id-31' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='69' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __size[40] -->
+        <var-decl name='__size' type-id='type-id-2' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long int __align -->
+        <var-decl name='__align' type-id='type-id-6' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='71' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_mutex_s -->
+    <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='22' column='1' id='type-id-31'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- int __pthread_mutex_s::__lock -->
+        <var-decl name='__lock' type-id='type-id-5' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='24' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __pthread_mutex_s::__count -->
+        <var-decl name='__count' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='25' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- int __pthread_mutex_s::__owner -->
+        <var-decl name='__owner' type-id='type-id-5' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='26' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <!-- unsigned int __pthread_mutex_s::__nusers -->
+        <var-decl name='__nusers' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='28' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- int __pthread_mutex_s::__kind -->
+        <var-decl name='__kind' type-id='type-id-5' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='32' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <!-- short int __pthread_mutex_s::__spins -->
+        <var-decl name='__spins' type-id='type-id-7' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='34' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='176'>
+        <!-- short int __pthread_mutex_s::__elision -->
+        <var-decl name='__elision' type-id='type-id-7' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='35' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- __pthread_list_t __pthread_mutex_s::__list -->
+        <var-decl name='__list' type-id='type-id-32' visibility='default' filepath='/usr/include/bits/struct_mutex.h' line='36' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef __pthread_internal_list __pthread_list_t -->
+    <typedef-decl name='__pthread_list_t' type-id='type-id-33' filepath='/usr/include/bits/thread-shared-types.h' line='53' column='1' id='type-id-32'/>
+    <!-- struct __pthread_internal_list -->
+    <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='49' column='1' id='type-id-33'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__prev -->
+        <var-decl name='__prev' type-id='type-id-34' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='51' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __pthread_internal_list* __pthread_internal_list::__next -->
+        <var-decl name='__next' type-id='type-id-34' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='52' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- __pthread_internal_list* -->
+    <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-34'/>
+    <!-- call_rcu_data* -->
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-35'/>
+    <!-- cds_list_head* -->
+    <pointer-type-def type-id='type-id-14' size-in-bits='64' id='type-id-16'/>
+    <!-- cds_wfcq_node* -->
+    <pointer-type-def type-id='type-id-23' size-in-bits='64' id='type-id-25'/>
+    <!-- const rcu_flavor_struct -->
+    <qualified-type-def type-id='type-id-17' const='yes' id='type-id-36'/>
+    <!-- int ()* -->
+    <pointer-type-def type-id='type-id-37' size-in-bits='64' id='type-id-19'/>
+    <!-- rcu_head* -->
+    <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-38'/>
+    <!-- void ()* -->
+    <pointer-type-def type-id='type-id-39' size-in-bits='64' id='type-id-18'/>
+    <!-- void (rcu_head*)* -->
+    <pointer-type-def type-id='type-id-40' size-in-bits='64' id='type-id-24'/>
+    <!-- void (rcu_head*, void (rcu_head*)*)* -->
+    <pointer-type-def type-id='type-id-41' size-in-bits='64' id='type-id-20'/>
+    <!-- void (void (void*)*, void*)* -->
+    <pointer-type-def type-id='type-id-42' size-in-bits='64' id='type-id-21'/>
+    <!-- void (void*)* -->
+    <pointer-type-def type-id='type-id-43' size-in-bits='64' id='type-id-44'/>
+    <!-- void* -->
+    <pointer-type-def type-id='type-id-9' size-in-bits='64' id='type-id-45'/>
+    <!-- int rcu_has_sys_membarrier_memb -->
+    <var-decl name='rcu_has_sys_membarrier_memb' type-id='type-id-5' mangled-name='rcu_has_sys_membarrier_memb' visibility='default' filepath='urcu/static/urcu.h' line='93' column='1' elf-symbol-id='rcu_has_sys_membarrier_memb'/>
+    <!-- rcu_gp_memb rcu_gp_memb -->
+    <var-decl name='rcu_gp_memb' type-id='type-id-10' mangled-name='rcu_gp_memb' visibility='default' filepath='urcu/static/urcu.h' line='140' column='1' elf-symbol-id='rcu_gp_memb'/>
+    <!-- rcu_reader_memb rcu_reader_memb -->
+    <var-decl name='rcu_reader_memb' type-id='type-id-13' mangled-name='rcu_reader_memb' visibility='default' filepath='urcu/static/urcu.h' line='153' column='1' elf-symbol-id='rcu_reader_memb'/>
+    <!-- const rcu_flavor_struct rcu_flavor_memb -->
+    <var-decl name='rcu_flavor_memb' type-id='type-id-36' mangled-name='rcu_flavor_memb' visibility='default' filepath='./urcu-flavor.h' line='64' column='1' elf-symbol-id='rcu_flavor_memb'/>
+    <!-- void rcu_defer_exit_memb() -->
+    <function-decl name='rcu_defer_exit_memb' mangled-name='rcu_defer_exit_memb' filepath='urcu-defer-impl.h' line='466' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_exit_memb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_defer_unregister_thread_memb() -->
+    <function-decl name='rcu_defer_unregister_thread_memb' mangled-name='rcu_defer_unregister_thread_memb' filepath='urcu-defer-impl.h' line='448' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_unregister_thread_memb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int rcu_defer_register_thread_memb() -->
+    <function-decl name='rcu_defer_register_thread_memb' mangled-name='rcu_defer_register_thread_memb' filepath='urcu-defer-impl.h' line='426' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_register_thread_memb'>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- void defer_rcu_memb(void (void*)*, void*) -->
+    <function-decl name='defer_rcu_memb' mangled-name='defer_rcu_memb' filepath='urcu-defer-impl.h' line='395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='defer_rcu_memb'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-44' name='fct' filepath='urcu-defer-impl.h' line='395' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='p' filepath='urcu-defer-impl.h' line='395' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_memb() -->
+    <function-decl name='rcu_defer_barrier_memb' mangled-name='rcu_defer_barrier_memb' filepath='urcu-defer-impl.h' line='281' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_memb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_defer_barrier_thread_memb() -->
+    <function-decl name='rcu_defer_barrier_thread_memb' mangled-name='rcu_defer_barrier_thread_memb' filepath='urcu-defer-impl.h' line='261' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_defer_barrier_thread_memb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_child_memb() -->
+    <function-decl name='call_rcu_after_fork_child_memb' mangled-name='call_rcu_after_fork_child_memb' filepath='urcu-call-rcu-impl.h' line='949' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_child_memb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_after_fork_parent_memb() -->
+    <function-decl name='call_rcu_after_fork_parent_memb' mangled-name='call_rcu_after_fork_parent_memb' filepath='urcu-call-rcu-impl.h' line='931' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_after_fork_parent_memb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_before_fork_memb() -->
+    <function-decl name='call_rcu_before_fork_memb' mangled-name='call_rcu_before_fork_memb' filepath='urcu-call-rcu-impl.h' line='909' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_before_fork_memb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_barrier_memb() -->
+    <function-decl name='rcu_barrier_memb' mangled-name='rcu_barrier_memb' filepath='urcu-call-rcu-impl.h' line='838' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_barrier_memb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void free_all_cpu_call_rcu_data_memb() -->
+    <function-decl name='free_all_cpu_call_rcu_data_memb' mangled-name='free_all_cpu_call_rcu_data_memb' filepath='urcu-call-rcu-impl.h' line='775' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_all_cpu_call_rcu_data_memb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_data_free_memb(call_rcu_data*) -->
+    <function-decl name='call_rcu_data_free_memb' mangled-name='call_rcu_data_free_memb' filepath='urcu-call-rcu-impl.h' line='743' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_data_free_memb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='743' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void call_rcu_memb(rcu_head*, void (rcu_head*)*) -->
+    <function-decl name='call_rcu_memb' mangled-name='call_rcu_memb' filepath='urcu-call-rcu-impl.h' line='705' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu_memb'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-38' name='head' filepath='urcu-call-rcu-impl.h' line='705' column='1'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-24' name='func' filepath='urcu-call-rcu-impl.h' line='706' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int create_all_cpu_call_rcu_data_memb(unsigned long int) -->
+    <function-decl name='create_all_cpu_call_rcu_data_memb' mangled-name='create_all_cpu_call_rcu_data_memb' filepath='urcu-call-rcu-impl.h' line='627' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_all_cpu_call_rcu_data_memb'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='urcu-call-rcu-impl.h' line='627' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- void set_thread_call_rcu_data_memb(call_rcu_data*) -->
+    <function-decl name='set_thread_call_rcu_data_memb' mangled-name='set_thread_call_rcu_data_memb' filepath='urcu-call-rcu-impl.h' line='614' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_thread_call_rcu_data_memb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='614' column='1'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- call_rcu_data* get_thread_call_rcu_data_memb() -->
+    <function-decl name='get_thread_call_rcu_data_memb' mangled-name='get_thread_call_rcu_data_memb' filepath='urcu-call-rcu-impl.h' line='598' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_thread_call_rcu_data_memb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- call_rcu_data* get_call_rcu_data_memb() -->
+    <function-decl name='get_call_rcu_data_memb' mangled-name='get_call_rcu_data_memb' filepath='urcu-call-rcu-impl.h' line='578' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_data_memb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- call_rcu_data* get_default_call_rcu_data_memb() -->
+    <function-decl name='get_default_call_rcu_data_memb' mangled-name='get_default_call_rcu_data_memb' filepath='urcu-call-rcu-impl.h' line='553' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_default_call_rcu_data_memb'>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- int set_cpu_call_rcu_data_memb(int, call_rcu_data*) -->
+    <function-decl name='set_cpu_call_rcu_data_memb' mangled-name='set_cpu_call_rcu_data_memb' filepath='urcu-call-rcu-impl.h' line='514' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_cpu_call_rcu_data_memb'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='cpu' filepath='urcu-call-rcu-impl.h' line='514' column='1'/>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='514' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- call_rcu_data* create_call_rcu_data_memb(unsigned long int, int) -->
+    <function-decl name='create_call_rcu_data_memb' mangled-name='create_call_rcu_data_memb' filepath='urcu-call-rcu-impl.h' line='490' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='create_call_rcu_data_memb'>
+      <!-- parameter of type 'unsigned long int' -->
+      <parameter type-id='type-id-3' name='flags' filepath='urcu-call-rcu-impl.h' line='490' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='cpu_affinity' filepath='urcu-call-rcu-impl.h' line='491' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- pthread_t get_call_rcu_thread_memb(call_rcu_data*) -->
+    <function-decl name='get_call_rcu_thread_memb' mangled-name='get_call_rcu_thread_memb' filepath='urcu-call-rcu-impl.h' line='472' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_call_rcu_thread_memb'>
+      <!-- parameter of type 'call_rcu_data*' -->
+      <parameter type-id='type-id-35' name='crdp' filepath='urcu-call-rcu-impl.h' line='472' column='1'/>
+      <!-- typedef pthread_t -->
+      <return type-id='type-id-15'/>
+    </function-decl>
+    <!-- call_rcu_data* get_cpu_call_rcu_data_memb(int) -->
+    <function-decl name='get_cpu_call_rcu_data_memb' mangled-name='get_cpu_call_rcu_data_memb' filepath='urcu-call-rcu-impl.h' line='450' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_cpu_call_rcu_data_memb'>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='cpu' filepath='urcu-call-rcu-impl.h' line='450' column='1'/>
+      <!-- call_rcu_data* -->
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <!-- void rcu_init_memb() -->
+    <function-decl name='rcu_init_memb' mangled-name='rcu_init_memb' filepath='urcu.c' line='536' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_init_memb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_unregister_thread_memb() -->
+    <function-decl name='rcu_unregister_thread_memb' mangled-name='rcu_unregister_thread_memb' filepath='urcu.c' line='526' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_unregister_thread_memb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_register_thread_memb() -->
+    <function-decl name='rcu_register_thread_memb' mangled-name='rcu_register_thread_memb' filepath='urcu.c' line='512' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_register_thread_memb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int rcu_read_ongoing_memb() -->
+    <function-decl name='rcu_read_ongoing_memb' mangled-name='rcu_read_ongoing_memb' filepath='urcu.c' line='507' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_ongoing_memb'>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- void rcu_read_unlock_memb() -->
+    <function-decl name='rcu_read_unlock_memb' mangled-name='rcu_read_unlock_memb' filepath='urcu.c' line='502' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_unlock_memb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void rcu_read_lock_memb() -->
+    <function-decl name='rcu_read_lock_memb' mangled-name='rcu_read_lock_memb' filepath='urcu.c' line='497' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_read_lock_memb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- void synchronize_rcu_memb() -->
+    <function-decl name='synchronize_rcu_memb' mangled-name='synchronize_rcu_memb' filepath='urcu.c' line='376' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='synchronize_rcu_memb'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-decl>
+    <!-- int () -->
+    <function-type size-in-bits='64' id='type-id-37'>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-type>
+    <!-- void () -->
+    <function-type size-in-bits='64' id='type-id-39'>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (rcu_head*) -->
+    <function-type size-in-bits='64' id='type-id-40'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-38'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (rcu_head*, void (rcu_head*)*) -->
+    <function-type size-in-bits='64' id='type-id-41'>
+      <!-- parameter of type 'rcu_head*' -->
+      <parameter type-id='type-id-38'/>
+      <!-- parameter of type 'void (rcu_head*)*' -->
+      <parameter type-id='type-id-24'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (void (void*)*, void*) -->
+    <function-type size-in-bits='64' id='type-id-42'>
+      <!-- parameter of type 'void (void*)*' -->
+      <parameter type-id='type-id-44'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+    <!-- void (void*) -->
+    <function-type size-in-bits='64' id='type-id-43'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45'/>
+      <!-- void -->
+      <return type-id='type-id-9'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='urcu-pointer.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+    <!-- void** -->
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-46'/>
+    <!-- void* rcu_cmpxchg_pointer_sym(void**, void*, void*) -->
+    <function-decl name='rcu_cmpxchg_pointer_sym' mangled-name='rcu_cmpxchg_pointer_sym' filepath='urcu-pointer.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_cmpxchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-46' name='p' filepath='urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='old' filepath='urcu-pointer.c' line='53' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='_new' filepath='urcu-pointer.c' line='53' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-45'/>
+    </function-decl>
+    <!-- void* rcu_xchg_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_xchg_pointer_sym' mangled-name='rcu_xchg_pointer_sym' filepath='urcu-pointer.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_xchg_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-46' name='p' filepath='urcu-pointer.c' line='47' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='v' filepath='urcu-pointer.c' line='47' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-45'/>
+    </function-decl>
+    <!-- void* rcu_set_pointer_sym(void**, void*) -->
+    <function-decl name='rcu_set_pointer_sym' mangled-name='rcu_set_pointer_sym' filepath='urcu-pointer.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_set_pointer_sym'>
+      <!-- parameter of type 'void**' -->
+      <parameter type-id='type-id-46' name='p' filepath='urcu-pointer.c' line='40' column='1'/>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='v' filepath='urcu-pointer.c' line='40' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-45'/>
+    </function-decl>
+    <!-- void* rcu_dereference_sym(void*) -->
+    <function-decl name='rcu_dereference_sym' mangled-name='rcu_dereference_sym' filepath='urcu-pointer.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_dereference_sym'>
+      <!-- parameter of type 'void*' -->
+      <parameter type-id='type-id-45' name='p' filepath='urcu-pointer.c' line='35' column='1'/>
+      <!-- void* -->
+      <return type-id='type-id-45'/>
+    </function-decl>
+  </abi-instr>
+  <abi-instr version='1.0' address-size='64' path='compat_futex.c' comp-dir-path='/home/mjeanson/Git/lttng/userspace-rcu/stable-0.9' language='LANG_C99'>
+
+
+    <!-- char[48] -->
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='384' id='type-id-47'>
+      <!-- <anonymous range>[48] -->
+      <subrange length='48' type-id='type-id-3' id='type-id-48'/>
+
+    </array-type-def>
+    <!-- long long int -->
+    <type-decl name='long long int' size-in-bits='64' id='type-id-49'/>
+    <!-- long long unsigned int -->
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-50'/>
+    <!-- unsigned int[2] -->
+    <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='64' id='type-id-51'>
+      <!-- <anonymous range>[2] -->
+      <subrange length='2' type-id='type-id-3' id='type-id-52'/>
+
+    </array-type-def>
+    <!-- typedef __anonymous_union__ pthread_cond_t -->
+    <typedef-decl name='pthread_cond_t' type-id='type-id-53' filepath='/usr/include/bits/pthreadtypes.h' line='80' column='1' id='type-id-54'/>
+    <!-- union {__pthread_cond_s __data; char __size[48]; long long int __align;} -->
+    <union-decl name='__anonymous_union__' size-in-bits='384' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='75' column='1' id='type-id-53'>
+      <data-member access='private'>
+        <!-- __pthread_cond_s __data -->
+        <var-decl name='__data' type-id='type-id-55' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- char __size[48] -->
+        <var-decl name='__size' type-id='type-id-47' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- long long int __align -->
+        <var-decl name='__align' type-id='type-id-49' visibility='default' filepath='/usr/include/bits/pthreadtypes.h' line='79' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct __pthread_cond_s -->
+    <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='92' column='1' id='type-id-55'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- union {long long unsigned int __wseq; struct {unsigned int __low; unsigned int __high;} __wseq32;} -->
+        <var-decl name='' type-id='type-id-56' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <!-- unsigned int __pthread_cond_s::__g_refs[2] -->
+        <var-decl name='__g_refs' type-id='type-id-51' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='112' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <!-- unsigned int __pthread_cond_s::__g_size[2] -->
+        <var-decl name='__g_size' type-id='type-id-51' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='113' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <!-- unsigned int __pthread_cond_s::__g1_orig_size -->
+        <var-decl name='__g1_orig_size' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='114' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='288'>
+        <!-- unsigned int __pthread_cond_s::__wrefs -->
+        <var-decl name='__wrefs' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='115' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <!-- unsigned int __pthread_cond_s::__g_signals[2] -->
+        <var-decl name='__g_signals' type-id='type-id-51' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='116' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- union {long long unsigned int __wseq; struct {unsigned int __low; unsigned int __high;} __wseq32;} -->
+    <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='94' column='1' id='type-id-56'>
+      <data-member access='private'>
+        <!-- long long unsigned int __wseq -->
+        <var-decl name='__wseq' type-id='type-id-50' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='96' column='1'/>
+      </data-member>
+      <data-member access='private'>
+        <!-- struct {unsigned int __low; unsigned int __high;} __wseq32 -->
+        <var-decl name='__wseq32' type-id='type-id-57' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='101' column='1'/>
+      </data-member>
+    </union-decl>
+    <!-- struct {unsigned int __low; unsigned int __high;} -->
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='97' column='1' id='type-id-57'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- unsigned int __low -->
+        <var-decl name='__low' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='99' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <!-- unsigned int __high -->
+        <var-decl name='__high' type-id='type-id-8' visibility='default' filepath='/usr/include/bits/thread-shared-types.h' line='100' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- struct timespec -->
+    <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='10' column='1' id='type-id-58'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <!-- __time_t timespec::tv_sec -->
+        <var-decl name='tv_sec' type-id='type-id-59' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='12' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <!-- __syscall_slong_t timespec::tv_nsec -->
+        <var-decl name='tv_nsec' type-id='type-id-60' visibility='default' filepath='/usr/include/bits/types/struct_timespec.h' line='16' column='1'/>
+      </data-member>
+    </class-decl>
+    <!-- typedef long int __time_t -->
+    <typedef-decl name='__time_t' type-id='type-id-6' filepath='/usr/include/bits/types.h' line='160' column='1' id='type-id-59'/>
+    <!-- typedef long int __syscall_slong_t -->
+    <typedef-decl name='__syscall_slong_t' type-id='type-id-6' filepath='/usr/include/bits/types.h' line='197' column='1' id='type-id-60'/>
+    <!-- const timespec -->
+    <qualified-type-def type-id='type-id-58' const='yes' id='type-id-61'/>
+    <!-- const timespec* -->
+    <pointer-type-def type-id='type-id-61' size-in-bits='64' id='type-id-62'/>
+    <!-- int32_t* -->
+    <pointer-type-def type-id='type-id-11' size-in-bits='64' id='type-id-63'/>
+    <!-- pthread_mutex_t __urcu_compat_futex_lock -->
+    <var-decl name='__urcu_compat_futex_lock' type-id='type-id-29' mangled-name='__urcu_compat_futex_lock' visibility='default' filepath='compat_futex.c' line='44' column='1' elf-symbol-id='__urcu_compat_futex_lock'/>
+    <!-- pthread_cond_t __urcu_compat_futex_cond -->
+    <var-decl name='__urcu_compat_futex_cond' type-id='type-id-54' mangled-name='__urcu_compat_futex_cond' visibility='default' filepath='compat_futex.c' line='46' column='1' elf-symbol-id='__urcu_compat_futex_cond'/>
+    <!-- int compat_futex_async(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_async' mangled-name='compat_futex_async' filepath='compat_futex.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_async'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='op' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-11' name='val' filepath='compat_futex.c' line='118' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-62' name='timeout' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-11' name='val3' filepath='compat_futex.c' line='119' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <!-- int compat_futex_noasync(int32_t*, int, int32_t, const timespec*, int32_t*, int32_t) -->
+    <function-decl name='compat_futex_noasync' mangled-name='compat_futex_noasync' filepath='compat_futex.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_futex_noasync'>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'int' -->
+      <parameter type-id='type-id-5' name='op' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-11' name='val' filepath='compat_futex.c' line='54' column='1'/>
+      <!-- parameter of type 'const timespec*' -->
+      <parameter type-id='type-id-62' name='timeout' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'int32_t*' -->
+      <parameter type-id='type-id-63' name='uaddr2' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- parameter of type 'typedef int32_t' -->
+      <parameter type-id='type-id-11' name='val3' filepath='compat_futex.c' line='55' column='1'/>
+      <!-- int -->
+      <return type-id='type-id-5'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/extras/abi/README.md b/extras/abi/README.md
new file mode 100644 (file)
index 0000000..a7242a2
--- /dev/null
@@ -0,0 +1,24 @@
+<!--
+SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+
+SPDX-License-Identifier: CC-BY-4.0
+-->
+
+# Userspace-RCU ABI definitions
+
+This directory contains the serialized ABI definitions for a typical build of
+the liburcu libraries. This information is extracted using
+[libabigail](https://sourceware.org/libabigail/).
+
+The artefacts used to generate these were built with **CFLAGS="-O0 -ggdb"** on
+an Ubuntu 18.04 x86_64 system.
+
+You can compare the serialized ABI with a shared object to check for breaking
+changes. For example, here we compare an in-tree built version of
+**liburcu-memb.so** with the serialized ABI of stable-0.13 :
+
+````
+abidiff \
+  extras/abi/0.13/x86_64-pc-linux-gnu/liburcu-memb.so.8.xml \
+  src/.libs/liburcu-memb.so
+````
diff --git a/extras/abi/dump_abi.sh b/extras/abi/dump_abi.sh
new file mode 100755 (executable)
index 0000000..a7bd5fd
--- /dev/null
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+# SPDX-FileCopyrightText: 2021 Michael Jeanson <mjeanson@efficios.com>
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
+set -eu
+
+INDIR=$1
+OUTDIR=$2
+
+ARGS=(
+       "--annotate" # Add comments to the xml output
+       "--no-corpus-path" # Do not put the path in the abi-corpus
+)
+
+# Older version of the reuse tool are a bit dumb, split the tags string to make
+# it happy.
+spdx="SPDX"
+copyright="FileCopyrightText"
+license="License-Identifier"
+
+for lib in "${INDIR}"/liburcu*.so.?
+do
+       abidw "${ARGS[@]}" --out-file "${OUTDIR}/$(basename "$lib").xml" "$lib"
+
+       # Clean the full paths
+       sed -i "s#$(pwd)/##g" "${OUTDIR}/$(basename "$lib").xml"
+
+       # Add SPDX headers
+       sed -i "2 i <!--\n${spdx}-${copyright}: $(date +%Y) EfficiOS Inc.\n\n${spdx}-${license}: CC0-1.0\n-->" "${OUTDIR}/$(basename "$lib").xml"
+done
+
diff --git a/gpl-2.0.txt b/gpl-2.0.txt
deleted file mode 100644 (file)
index d511905..0000000
+++ /dev/null
@@ -1,339 +0,0 @@
-                   GNU GENERAL PUBLIC LICENSE
-                      Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                           Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                   GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-                           NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-                    END OF TERMS AND CONDITIONS
-
-           How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    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.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
index 8f836415836cf8c38a6f960e025eec10f46b3803..4c32a4cd7d0cf499273dcf86303cb1346de36af1 100644 (file)
@@ -1,38 +1,18 @@
-nobase_dist_include_HEADERS = urcu/compiler.h urcu/hlist.h urcu/list.h \
-               urcu/rculist.h urcu/rcuhlist.h urcu/system.h urcu/futex.h \
-               urcu/uatomic/generic.h urcu/arch/generic.h urcu/wfstack.h \
-               urcu/wfqueue.h urcu/rculfstack.h urcu/rculfqueue.h \
-               urcu/ref.h urcu/cds.h urcu/urcu_ref.h urcu/urcu-futex.h \
-               urcu/uatomic_arch.h urcu/rculfhash.h urcu/wfcqueue.h \
-               urcu/lfstack.h urcu/syscall-compat.h \
-               urcu/map/urcu-bp.h urcu/map/urcu.h urcu/map/urcu-qsbr.h \
-               urcu/map/clear.h urcu/map/urcu-mb.h urcu/map/urcu-memb.h \
-               urcu/map/urcu-signal.h \
-               urcu/static/lfstack.h urcu/static/rculfqueue.h \
-               urcu/static/rculfstack.h urcu/static/urcu-bp.h \
-               urcu/static/urcu.h urcu/static/pointer.h \
-               urcu/static/urcu-qsbr.h urcu/static/wfcqueue.h \
-               urcu/static/wfqueue.h urcu/static/wfstack.h \
-               urcu/static/urcu-mb.h urcu/static/urcu-memb.h \
-               urcu/static/urcu-signal.h urcu/static/urcu-signal-nr.h \
-               urcu/static/urcu-common.h \
-               urcu/tls-compat.h urcu/debug.h urcu/urcu.h urcu/urcu-bp.h \
-               urcu/call-rcu.h urcu/defer.h \
-               urcu/pointer.h urcu/urcu-qsbr.h urcu/flavor.h \
-               urcu/urcu-mb.h urcu/urcu-memb.h urcu/urcu-signal.h \
-               urcu.h urcu-bp.h urcu-call-rcu.h urcu-defer.h \
-               urcu-pointer.h urcu-qsbr.h urcu-flavor.h
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
 
 
-# Don't distribute generated headers
-nobase_nodist_include_HEADERS = urcu/arch.h urcu/uatomic.h urcu/config.h
-
-EXTRA_DIST = urcu/arch/aarch64.h \
+nobase_include_HEADERS = \
+       urcu/annotate.h \
+       urcu/arch/aarch64.h \
        urcu/arch/alpha.h \
        urcu/arch/arm.h \
        urcu/arch/gcc.h \
        urcu/arch/generic.h \
        urcu/arch/alpha.h \
        urcu/arch/arm.h \
        urcu/arch/gcc.h \
        urcu/arch/generic.h \
+       urcu/arch.h \
        urcu/arch/hppa.h \
        urcu/arch/ia64.h \
        urcu/arch/hppa.h \
        urcu/arch/ia64.h \
+       urcu/arch/loongarch.h \
        urcu/arch/m68k.h \
        urcu/arch/mips.h \
        urcu/arch/nios2.h \
        urcu/arch/m68k.h \
        urcu/arch/mips.h \
        urcu/arch/nios2.h \
@@ -41,15 +21,59 @@ EXTRA_DIST = urcu/arch/aarch64.h \
        urcu/arch/s390.h \
        urcu/arch/sparc64.h \
        urcu/arch/tile.h \
        urcu/arch/s390.h \
        urcu/arch/sparc64.h \
        urcu/arch/tile.h \
-       urcu/arch/unknown.h \
        urcu/arch/x86.h \
        urcu/arch/x86.h \
+       urcu/assert.h \
+       urcu/call-rcu.h \
+       urcu/cds.h \
+       urcu/compiler.h \
+       urcu/debug.h \
+       urcu/defer.h \
+       urcu/flavor.h \
+       urcu/futex.h \
+       urcu/hlist.h \
+       urcu/lfstack.h \
+       urcu/list.h \
+       urcu/map/clear.h \
+       urcu/map/urcu-bp.h \
+       urcu/map/urcu.h \
+       urcu/map/urcu-mb.h \
+       urcu/map/urcu-memb.h \
+       urcu/map/urcu-qsbr.h \
+       urcu/pointer.h \
+       urcu/rcuhlist.h \
+       urcu/rculfhash.h \
+       urcu/rculfqueue.h \
+       urcu/rculfstack.h \
+       urcu/rculist.h \
+       urcu/ref.h \
+       urcu/static/lfstack.h \
+       urcu/static/pointer.h \
+       urcu/static/rculfqueue.h \
+       urcu/static/rculfstack.h \
+       urcu/static/urcu-bp.h \
+       urcu/static/urcu-common.h \
+       urcu/static/urcu.h \
+       urcu/static/urcu-mb.h \
+       urcu/static/urcu-memb.h \
+       urcu/static/urcu-qsbr.h \
+       urcu/static/wfcqueue.h \
+       urcu/static/wfqueue.h \
+       urcu/static/wfstack.h \
+       urcu/syscall-compat.h \
+       urcu/system.h \
+       urcu/tls-compat.h \
        urcu/uatomic/aarch64.h \
        urcu/uatomic/alpha.h \
        urcu/uatomic/aarch64.h \
        urcu/uatomic/alpha.h \
+       urcu/uatomic_arch.h \
        urcu/uatomic/arm.h \
        urcu/uatomic/arm.h \
+       urcu/uatomic/builtins.h \
+       urcu/uatomic/builtins-generic.h \
        urcu/uatomic/gcc.h \
        urcu/uatomic/generic.h \
        urcu/uatomic/gcc.h \
        urcu/uatomic/generic.h \
+       urcu/uatomic.h \
        urcu/uatomic/hppa.h \
        urcu/uatomic/ia64.h \
        urcu/uatomic/hppa.h \
        urcu/uatomic/ia64.h \
+       urcu/uatomic/loongarch.h \
        urcu/uatomic/m68k.h \
        urcu/uatomic/mips.h \
        urcu/uatomic/nios2.h \
        urcu/uatomic/m68k.h \
        urcu/uatomic/mips.h \
        urcu/uatomic/nios2.h \
@@ -58,5 +82,28 @@ EXTRA_DIST = urcu/arch/aarch64.h \
        urcu/uatomic/s390.h \
        urcu/uatomic/sparc64.h \
        urcu/uatomic/tile.h \
        urcu/uatomic/s390.h \
        urcu/uatomic/sparc64.h \
        urcu/uatomic/tile.h \
-       urcu/uatomic/unknown.h \
-       urcu/uatomic/x86.h
+       urcu/uatomic/x86.h \
+       urcu/urcu-bp.h \
+       urcu/urcu-futex.h \
+       urcu/urcu.h \
+       urcu/urcu-mb.h \
+       urcu/urcu-memb.h \
+       urcu/urcu-qsbr.h \
+       urcu/urcu_ref.h \
+       urcu/wfcqueue.h \
+       urcu/wfqueue.h \
+       urcu/wfstack.h \
+       urcu/urcu-poll.h
+
+# Don't distribute generated headers
+nobase_nodist_include_HEADERS = urcu/config.h
+
+# Non 'urcu/' prefixed compat headers
+include_HEADERS = \
+       urcu-qsbr.h \
+       urcu-bp.h \
+       urcu-call-rcu.h \
+       urcu-defer.h \
+       urcu-flavor.h \
+       urcu.h \
+       urcu-pointer.h
index acafee2290b70cc56e9a1aae9b13c163b0b305a2..5f17e12652f2b9a22bbaf37233698a884422b064 100644 (file)
@@ -1,2 +1,6 @@
+// SPDX-FileCopyrightText: 2018 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #define URCU_API_MAP
 #include <urcu/urcu-bp.h>
 #define URCU_API_MAP
 #include <urcu/urcu-bp.h>
index 162bc561329440fc9390e7cfa40b233191adcd2e..2d994e5d3ba5b722875383a6f82a414973017304 100644 (file)
@@ -1 +1,5 @@
+// SPDX-FileCopyrightText: 2018 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #include <urcu/call-rcu.h>
 #include <urcu/call-rcu.h>
index e097d45f664c7f8c321d77f106af3208c47da1c9..cd6bd9b54c32c03807cfc9c06cc8a8eb1a33eda4 100644 (file)
@@ -1 +1,5 @@
+// SPDX-FileCopyrightText: 2018 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #include <urcu/defer.h>
 #include <urcu/defer.h>
index aca264d77d65e4b83e4057505b50e039ecf27f79..dbd70eb18cd3e261384f7e8cbb64487df58628d1 100644 (file)
@@ -1 +1,5 @@
+// SPDX-FileCopyrightText: 2018 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #include <urcu/flavor.h>
 #include <urcu/flavor.h>
index 97aed984e189e95840f3290d39d7658183281841..2e61c4d1cc05aa6b6e04dba6184c2b633f5a3329 100644 (file)
@@ -1 +1,5 @@
+// SPDX-FileCopyrightText: 2018 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #include <urcu/pointer.h>
 #include <urcu/pointer.h>
index 43d95a9b2d31cc34135ee4ec3cac52f5971f7041..1a0d0a1f47fb1db7aa78c3942d94c8e52aafc07b 100644 (file)
@@ -1,2 +1,6 @@
+// SPDX-FileCopyrightText: 2018 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #define URCU_API_MAP
 #include <urcu/urcu-qsbr.h>
 #define URCU_API_MAP
 #include <urcu/urcu-qsbr.h>
index 5599961736f06bf80c98cc41db3c2752268d0c3e..0bd5f23f7879523df39ead40a714ea4c7d49823f 100644 (file)
@@ -1,2 +1,6 @@
+// SPDX-FileCopyrightText: 2018 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #define URCU_API_MAP
 #include <urcu/urcu.h>
 #define URCU_API_MAP
 #include <urcu/urcu.h>
diff --git a/include/urcu/annotate.h b/include/urcu/annotate.h
new file mode 100644 (file)
index 0000000..f0955a0
--- /dev/null
@@ -0,0 +1,163 @@
+// SPDX-FileCopyrightText: 2023 Olivier Dion <odion@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+#ifndef _URCU_ANNOTATE_H
+#define _URCU_ANNOTATE_H
+
+/*
+ * urcu/annotate.h
+ *
+ * Userspace RCU - annotation header.
+ */
+
+/*
+ * WARNING!
+ *
+ * This API is highly experimental. There is zero guarantees of stability
+ * between releases.
+ *
+ * You have been warned.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <urcu/compiler.h>
+
+enum cmm_annotate {
+       CMM_ANNOTATE_VOID,
+       CMM_ANNOTATE_LOAD,
+       CMM_ANNOTATE_STORE,
+       CMM_ANNOTATE_MB,
+};
+
+typedef enum cmm_annotate cmm_annotate_t __attribute__((unused));
+
+#define cmm_annotate_define(name)              \
+       cmm_annotate_t name = CMM_ANNOTATE_VOID
+
+#ifdef CMM_SANITIZE_THREAD
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+extern void __tsan_acquire(void *);
+extern void __tsan_release(void *);
+# ifdef __cplusplus
+}
+# endif
+
+# define cmm_annotate_die(msg)                                         \
+       do {                                                            \
+               fprintf(stderr,                                         \
+                       "(" __FILE__ ":%s@%u) Annotation ERROR: %s\n",  \
+                       __func__, __LINE__, msg);                       \
+               abort();                                                \
+       } while (0)
+
+/* Only used for typechecking in macros. */
+static inline cmm_annotate_t cmm_annotate_dereference(cmm_annotate_t *group)
+{
+       return *group;
+}
+
+# define cmm_annotate_group_mb_acquire(group)                          \
+       do {                                                            \
+               switch (cmm_annotate_dereference(group)) {              \
+               case CMM_ANNOTATE_VOID:                                 \
+                       break;                                          \
+               case CMM_ANNOTATE_LOAD:                                 \
+                       break;                                          \
+               case CMM_ANNOTATE_STORE:                                \
+                       cmm_annotate_die("store for acquire group");    \
+                       break;                                          \
+               case CMM_ANNOTATE_MB:                                   \
+                       cmm_annotate_die(                               \
+                               "redundant mb for acquire group"        \
+                                       );                              \
+                       break;                                          \
+               }                                                       \
+               *(group) = CMM_ANNOTATE_MB;                             \
+       } while (0)
+
+# define cmm_annotate_group_mb_release(group)                          \
+       do {                                                            \
+               switch (cmm_annotate_dereference(group)) {              \
+               case CMM_ANNOTATE_VOID:                                 \
+                       break;                                          \
+               case CMM_ANNOTATE_LOAD:                                 \
+                       cmm_annotate_die("load before release group");  \
+                       break;                                          \
+               case CMM_ANNOTATE_STORE:                                \
+                       cmm_annotate_die(                               \
+                               "store before release group"            \
+                                       );                              \
+                       break;                                          \
+               case CMM_ANNOTATE_MB:                                   \
+                       cmm_annotate_die(                               \
+                               "redundant mb of release group"         \
+                                       );                              \
+                       break;                                          \
+               }                                                       \
+               *(group) = CMM_ANNOTATE_MB;                             \
+       } while (0)
+
+# define cmm_annotate_group_mem_acquire(group, mem)                    \
+       do {                                                            \
+               __tsan_acquire((void*)(mem));                           \
+               switch (cmm_annotate_dereference(group)) {              \
+               case CMM_ANNOTATE_VOID:                                 \
+                       *(group) = CMM_ANNOTATE_LOAD;                   \
+                       break;                                          \
+               case CMM_ANNOTATE_MB:                                   \
+                       cmm_annotate_die(                               \
+                               "load after mb for acquire group"       \
+                                       );                              \
+                       break;                                          \
+               default:                                                \
+                       break;                                          \
+               }                                                       \
+       } while (0)
+
+# define cmm_annotate_group_mem_release(group, mem)            \
+       do {                                                    \
+               __tsan_release((void*)(mem));                   \
+               switch (cmm_annotate_dereference(group)) {      \
+               case CMM_ANNOTATE_MB:                           \
+                       break;                                  \
+               default:                                        \
+                       cmm_annotate_die(                       \
+                               "missing mb for release group"  \
+                                       );                      \
+               }                                               \
+       } while (0)
+
+# define cmm_annotate_mem_acquire(mem)         \
+       __tsan_acquire((void*)(mem))
+
+# define cmm_annotate_mem_release(mem)         \
+       __tsan_release((void*)(mem))
+#else
+
+# define cmm_annotate_group_mb_acquire(group)  \
+       (void) (group)
+
+# define cmm_annotate_group_mb_release(group)  \
+       (void) (group)
+
+# define cmm_annotate_group_mem_acquire(group, mem)    \
+       (void) (group)
+
+# define cmm_annotate_group_mem_release(group, mem)    \
+       (void) (group)
+
+# define cmm_annotate_mem_acquire(mem)         \
+       do { } while (0)
+
+# define cmm_annotate_mem_release(mem)         \
+       do { } while (0)
+
+#endif  /* CMM_SANITIZE_THREAD */
+
+#endif /* _URCU_ANNOTATE_H */
diff --git a/include/urcu/arch.h b/include/urcu/arch.h
new file mode 100644 (file)
index 0000000..5147d30
--- /dev/null
@@ -0,0 +1,171 @@
+// SPDX-FileCopyrightText: 2020 Michael Jeanson <mjeanson@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+#ifndef _URCU_ARCH_H
+#define _URCU_ARCH_H
+
+/*
+ * Architecture detection using compiler defines.
+ *
+ * The following defines are used internally for architecture specific code.
+ *
+ * URCU_ARCH_X86 : All x86 variants 32 and 64 bits
+ *   URCU_ARCH_I386 : Specific to the i386
+ *   URCU_ARCH_AMD64 : All 64 bits x86 variants
+ *   URCU_ARCH_K1OM : Specific to the Xeon Phi / MIC
+ *
+ * URCU_ARCH_PPC : All PowerPC variants 32 and 64 bits
+ *   URCU_ARCH_PPC64 : Specific to 64 bits variants
+ *
+ * URCU_ARCH_S390 : All IBM s390 / s390x variants
+ *
+ * URCU_ARCH_SPARC64 : All Sun SPARC variants
+ *
+ * URCU_ARCH_ALPHA : All DEC Alpha variants
+ * URCU_ARCH_IA64 : All Intel Itanium variants
+ * URCU_ARCH_ARM : All ARM 32 bits variants
+ *   URCU_ARCH_ARMV7 : All ARMv7 ISA variants
+ * URCU_ARCH_AARCH64 : All ARM 64 bits variants
+ * URCU_ARCH_MIPS : All MIPS variants
+ * URCU_ARCH_NIOS2 : All Intel / Altera NIOS II variants
+ * URCU_ARCH_TILE : All Tilera TILE variants
+ * URCU_ARCH_HPPA : All HP PA-RISC variants
+ * URCU_ARCH_M68K : All Motorola 68000 variants
+ * URCU_ARCH_RISCV : All RISC-V variants
+ * URCU_ARCH_LOONGARCH : All LoongArch variants
+ */
+
+#if (defined(__INTEL_OFFLOAD) || defined(__TARGET_ARCH_MIC) || defined(__MIC__))
+
+#define URCU_ARCH_X86 1
+#define URCU_ARCH_AMD64 1
+#define URCU_ARCH_K1OM 1
+#include <urcu/arch/x86.h>
+
+#elif (defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64))
+
+#define URCU_ARCH_X86 1
+#define URCU_ARCH_AMD64 1
+#include <urcu/arch/x86.h>
+
+#elif (defined(__i386__) || defined(__i386))
+
+#define URCU_ARCH_X86 1
+
+/*
+ * URCU_ARCH_X86_NO_CAS enables a compat layer that will detect the presence of
+ * the cmpxchg instructions at runtime and provide a compat mode based on a
+ * pthread mutex when it isn't.
+ *
+ * __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 was introduced in GCC 4.3 and Clang 3.3,
+ * building with older compilers will result in the compat layer always being
+ * used on x86-32.
+ */
+#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
+#define URCU_ARCH_X86_NO_CAS 1
+/* For backwards compat */
+#define URCU_ARCH_I386 1
+#endif
+
+#include <urcu/arch/x86.h>
+
+#elif (defined(__powerpc64__) || defined(__ppc64__))
+
+#define URCU_ARCH_PPC 1
+#define URCU_ARCH_PPC64 1
+#include <urcu/arch/ppc.h>
+
+#elif (defined(__powerpc__) || defined(__powerpc) || defined(__ppc__))
+
+#define URCU_ARCH_PPC 1
+#include <urcu/arch/ppc.h>
+
+#elif (defined(__s390__) || defined(__s390x__) || defined(__zarch__))
+
+#define URCU_ARCH_S390 1
+#include <urcu/arch/s390.h>
+
+#elif (defined(__sparc__) || defined(__sparc) || defined(__sparc64__))
+
+#define URCU_ARCH_SPARC64 1
+#include <urcu/arch/sparc64.h>
+
+#elif (defined(__alpha__) || defined(__alpha))
+
+#define URCU_ARCH_ALPHA 1
+#include <urcu/arch/alpha.h>
+
+#elif (defined(__ia64__) || defined(__ia64))
+
+#define URCU_ARCH_IA64 1
+#include <urcu/arch/ia64.h>
+
+#elif (defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7__))
+
+#define URCU_ARCH_ARMV7 1
+#define URCU_ARCH_ARM 1
+#include <urcu/arch/arm.h>
+
+#elif (defined(__arm__) || defined(__arm))
+
+#define URCU_ARCH_ARM 1
+#include <urcu/arch/arm.h>
+
+#elif defined(__aarch64__)
+
+#define URCU_ARCH_AARCH64 1
+#include <urcu/arch/aarch64.h>
+
+#elif (defined(__mips__) || defined(__mips))
+
+#define URCU_ARCH_MIPS 1
+#include <urcu/arch/mips.h>
+
+#elif (defined(__nios2__) || defined(__nios2))
+
+#define URCU_ARCH_NIOS2 1
+#include <urcu/arch/nios2.h>
+
+#elif defined(__tilegx__)
+/*
+ * URCU has only been tested on the TileGx architecture. For other Tile*
+ * architectures, please run the tests first and report the results to the
+ * maintainer so that proper support can be added.
+ */
+
+#define URCU_ARCH_TILE 1
+#include <urcu/arch/tile.h>
+
+#elif (defined(__hppa__) || defined(__HPPA__) || defined(__hppa))
+
+#define URCU_ARCH_HPPA 1
+#include <urcu/arch/hppa.h>
+
+#elif defined(__m68k__)
+
+#define URCU_ARCH_M68K 1
+#include <urcu/arch/m68k.h>
+
+#elif defined(__riscv)
+
+#define URCU_ARCH_RISCV 1
+#include <urcu/arch/riscv.h>
+
+#elif defined(__loongarch__)
+
+#define URCU_ARCH_LOONGARCH 1
+#include <urcu/arch/loongarch.h>
+
+#else
+#error "Cannot build: unrecognized architecture, see <urcu/arch.h>."
+#endif
+
+#ifdef CONFIG_RCU_EMIT_LEGACY_MB
+# define cmm_emit_legacy_smp_mb() cmm_smp_mb()
+#else
+# define cmm_emit_legacy_smp_mb() do { } while (0)
+#endif
+
+
+#endif /* _URCU_ARCH_H */
index d6a133758dffca0c22ca5f6e94314c4c6d0d5390..f573306a05450d80c7b4548852f7bfa50f03daf3 100644 (file)
@@ -1,25 +1,13 @@
+// SPDX-FileCopyrightText: 2010 Paul E. McKenney, IBM Corporation.
+// SPDX-FileCopyrightText: 2009-2015 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_ARCH_AARCH64_H
 #define _URCU_ARCH_AARCH64_H
 
 /*
  * arch/aarch64.h: definitions for aarch64 architecture
 #ifndef _URCU_ARCH_AARCH64_H
 #define _URCU_ARCH_AARCH64_H
 
 /*
  * arch/aarch64.h: definitions for aarch64 architecture
- *
- * Copyright (c) 2010 Paul E. McKenney, IBM Corporation.
- * Copyright (c) 2009-2015 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
@@ -42,6 +30,25 @@ extern "C" {
 #define __NR_membarrier                283
 #endif
 
 #define __NR_membarrier                283
 #endif
 
+/*
+ * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63293
+ *
+ * Backported in RHEL7 gcc 4.8.5-11
+ */
+#if defined(URCU_GCC_VERSION) && defined(__GNUC_RH_RELEASE__)
+# if (URCU_GCC_VERSION == 40805) && (__GNUC_RH_RELEASE__ >= 11)
+#  define URCU_GCC_PATCHED_63293
+# endif
+#endif
+
+#ifdef URCU_GCC_VERSION
+# if URCU_GCC_VERSION < 50100 && !defined(URCU_GCC_PATCHED_63293)
+#  error Your gcc version performs unsafe access to deallocated stack
+# endif
+#endif
+
+#define caa_cpu_relax()        __asm__ __volatile__ ("yield" : : : "memory")
+
 #ifdef __cplusplus
 }
 #endif
 #ifdef __cplusplus
 }
 #endif
index e61f82c0728047528acf484d74cf7011a892914c..db7ab3eb55e3228b29d0a32287c85922cfe3c886 100644 (file)
@@ -1,24 +1,12 @@
+// SPDX-FileCopyrightText: 2010 Paolo Bonzini <pbonzini@redhat.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_ARCH_ALPHA_H
 #define _URCU_ARCH_ALPHA_H
 
 /*
  * arch_alpha.h: trivial definitions for the Alpha architecture.
 #ifndef _URCU_ARCH_ALPHA_H
 #define _URCU_ARCH_ALPHA_H
 
 /*
  * arch_alpha.h: trivial definitions for the Alpha architecture.
- *
- * Copyright (c) 2010 Paolo Bonzini <pbonzini@redhat.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
@@ -33,6 +21,14 @@ extern "C" {
 #define cmm_wmb()                      __asm__ __volatile__ ("wmb":::"memory")
 #define cmm_read_barrier_depends()     __asm__ __volatile__ ("mb":::"memory")
 
 #define cmm_wmb()                      __asm__ __volatile__ ("wmb":::"memory")
 #define cmm_read_barrier_depends()     __asm__ __volatile__ ("mb":::"memory")
 
+/*
+ * On Linux, define the membarrier system call number if not yet available in
+ * the system headers.
+ */
+#if (defined(__linux__) && !defined(__NR_membarrier))
+#define __NR_membarrier                517
+#endif
+
 #ifdef __cplusplus
 }
 #endif
 #ifdef __cplusplus
 }
 #endif
index cb8f28dc711769f2c91544b598be95c64bc83294..407f422a92ee7e0315785ff8b05fb6560864f7b9 100644 (file)
@@ -1,25 +1,13 @@
+// SPDX-FileCopyrightText: 2010 Paul E. McKenney, IBM Corporation.
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_ARCH_ARM_H
 #define _URCU_ARCH_ARM_H
 
 /*
  * arch_arm.h: trivial definitions for the ARM architecture.
 #ifndef _URCU_ARCH_ARM_H
 #define _URCU_ARCH_ARM_H
 
 /*
  * arch_arm.h: trivial definitions for the ARM architecture.
- *
- * Copyright (c) 2010 Paul E. McKenney, IBM Corporation.
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
 extern "C" {
 #endif
 
 extern "C" {
 #endif
 
-#ifdef CONFIG_RCU_ARM_HAVE_DMB
+/*
+ * Using DMB is faster than the builtin __sync_synchronize and this instruction is
+ * part of the baseline ARMv7 ISA.
+ */
+#ifdef URCU_ARCH_ARMV7
+
+/* For backwards compat. */
+#define CONFIG_RCU_ARM_HAVE_DMB 1
+
 /*
  * Issues full system DMB operation.
  */
 /*
  * Issues full system DMB operation.
  */
@@ -44,7 +40,8 @@ extern "C" {
 #define cmm_smp_mb()   __asm__ __volatile__ ("dmb ish":::"memory")
 #define cmm_smp_rmb()  __asm__ __volatile__ ("dmb ish":::"memory")
 #define cmm_smp_wmb()  __asm__ __volatile__ ("dmb ish":::"memory")
 #define cmm_smp_mb()   __asm__ __volatile__ ("dmb ish":::"memory")
 #define cmm_smp_rmb()  __asm__ __volatile__ ("dmb ish":::"memory")
 #define cmm_smp_wmb()  __asm__ __volatile__ ("dmb ish":::"memory")
-#endif /* CONFIG_RCU_ARM_HAVE_DMB */
+
+#endif /* URCU_ARCH_ARMV7 */
 
 #include <stdlib.h>
 #include <sys/time.h>
 
 #include <stdlib.h>
 #include <sys/time.h>
@@ -57,6 +54,28 @@ extern "C" {
 #define __NR_membarrier                389
 #endif
 
 #define __NR_membarrier                389
 #endif
 
+/*
+ * Error out for compilers with known bugs.
+ */
+
+/*
+ * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58854
+ */
+#ifdef URCU_GCC_VERSION
+# if URCU_GCC_VERSION >= 40800 && URCU_GCC_VERSION <= 40802
+#  error Your gcc version produces clobbered frame accesses
+# endif
+#endif
+
+/*
+ * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42263
+ */
+#ifdef URCU_GCC_VERSION
+# if URCU_GCC_VERSION >= 40400 && URCU_GCC_VERSION <= 40402
+#  error Your gcc version has a non-functional __sync_synchronize()
+# endif
+#endif
+
 #ifdef __cplusplus
 }
 #endif
 #ifdef __cplusplus
 }
 #endif
index e5700e451df7757eb1232a3fc8d4f4e9e283eadf..1987450df7c9228d5dc4b562bb1776005e252cc7 100644 (file)
@@ -1,25 +1,13 @@
+// SPDX-FileCopyrightText: 2010 Paul E. McKenney, IBM Corporation.
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_ARCH_GCC_H
 #define _URCU_ARCH_GCC_H
 
 /*
  * arch_gcc.h: trivial definitions for architectures using gcc __sync_
 #ifndef _URCU_ARCH_GCC_H
 #define _URCU_ARCH_GCC_H
 
 /*
  * arch_gcc.h: trivial definitions for architectures using gcc __sync_
- *
- * Copyright (c) 2010 Paul E. McKenney, IBM Corporation.
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
index 4b56ed7aaff00788a5fb4fbce712a146c5198a5d..ac15a3bf7a378dab57cec797bb19a223fd10a634 100644 (file)
@@ -1,24 +1,12 @@
+// SPDX-FileCopyrightText: 2010 Paolo Bonzini <pbonzini@redhat.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_ARCH_GENERIC_H
 #define _URCU_ARCH_GENERIC_H
 
 /*
  * arch_generic.h: common definitions for multiple architectures.
 #ifndef _URCU_ARCH_GENERIC_H
 #define _URCU_ARCH_GENERIC_H
 
 /*
  * arch_generic.h: common definitions for multiple architectures.
- *
- * Copyright (c) 2010 Paolo Bonzini <pbonzini@redhat.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
@@ -43,6 +31,57 @@ extern "C" {
  * GCC builtins) as well as cmm_rmb and cmm_wmb (defaulting to cmm_mb).
  */
 
  * GCC builtins) as well as cmm_rmb and cmm_wmb (defaulting to cmm_mb).
  */
 
+#ifdef CONFIG_RCU_USE_ATOMIC_BUILTINS
+
+# ifdef CMM_SANITIZE_THREAD
+/*
+ * This makes TSAN quiet about unsupported thread fence.
+ */
+static inline void _cmm_thread_fence_wrapper(void)
+{
+#   if defined(__clang__)
+#    pragma clang diagnostic push
+#    pragma clang diagnostic ignored "-Wpragmas"
+#    pragma clang diagnostic ignored "-Wunknown-warning-option"
+#    pragma clang diagnostic ignored "-Wtsan"
+#   elif defined(__GNUC__)
+#    pragma GCC diagnostic push
+#    pragma GCC diagnostic ignored "-Wpragmas"
+#    pragma GCC diagnostic ignored "-Wtsan"
+#   endif
+       __atomic_thread_fence(__ATOMIC_SEQ_CST);
+#   if defined(__clang__)
+#    pragma clang diagnostic pop
+#   elif defined(__GNUC__)
+#    pragma GCC diagnostic pop
+#   endif
+}
+# endif         /* CMM_SANITIZE_THREAD */
+
+# ifndef cmm_smp_mb
+#  ifdef CMM_SANITIZE_THREAD
+#   define cmm_smp_mb() _cmm_thread_fence_wrapper()
+#  else
+#   define cmm_smp_mb() __atomic_thread_fence(__ATOMIC_SEQ_CST)
+#  endif /* CMM_SANITIZE_THREAD */
+# endif /* !cmm_smp_mb */
+
+#endif /* CONFIG_RCU_USE_ATOMIC_BUILTINS */
+
+
+/*
+ * cmm_mb() expands to __sync_synchronize() instead of __atomic_thread_fence
+ * with SEQ_CST because the former "issues a full memory barrier" while the
+ * latter "acts as a synchronization fence between threads" which is too weak
+ * for what we want, for example with I/O devices.
+ *
+ * Even though sync_synchronize seems to be an alias for a sequential consistent
+ * atomic thread fence on every architecture on GCC and Clang, this assumption
+ * might be untrue in future.  Therefore, the definitions above are used to
+ * ensure correct behavior in the future.
+ *
+ * The above defintions are quoted from the GCC manual.
+ */
 #ifndef cmm_mb
 #define cmm_mb()    __sync_synchronize()
 #endif
 #ifndef cmm_mb
 #define cmm_mb()    __sync_synchronize()
 #endif
@@ -153,8 +192,11 @@ extern "C" {
 #ifndef HAS_CAA_GET_CYCLES
 #define HAS_CAA_GET_CYCLES
 
 #ifndef HAS_CAA_GET_CYCLES
 #define HAS_CAA_GET_CYCLES
 
-#ifdef CONFIG_RCU_HAVE_CLOCK_GETTIME
+#if defined(__APPLE__)
 
 
+#include <mach/mach.h>
+#include <mach/clock.h>
+#include <mach/mach_time.h>
 #include <time.h>
 #include <stdint.h>
 
 #include <time.h>
 #include <stdint.h>
 
@@ -162,18 +204,21 @@ typedef uint64_t caa_cycles_t;
 
 static inline caa_cycles_t caa_get_cycles (void)
 {
 
 static inline caa_cycles_t caa_get_cycles (void)
 {
-       struct timespec ts;
+       mach_timespec_t ts = { 0, 0 };
+       static clock_serv_t clock_service;
 
 
-       if (caa_unlikely(clock_gettime(CLOCK_MONOTONIC, &ts)))
+       if (caa_unlikely(!clock_service)) {
+               if (host_get_clock_service(mach_host_self(),
+                               SYSTEM_CLOCK, &clock_service))
+                       return -1ULL;
+       }
+       if (caa_unlikely(clock_get_time(clock_service, &ts)))
                return -1ULL;
        return ((uint64_t) ts.tv_sec * 1000000000ULL) + ts.tv_nsec;
 }
 
                return -1ULL;
        return ((uint64_t) ts.tv_sec * 1000000000ULL) + ts.tv_nsec;
 }
 
-#elif defined(__APPLE__)
+#elif defined(CONFIG_RCU_HAVE_CLOCK_GETTIME)
 
 
-#include <mach/mach.h>
-#include <mach/clock.h>
-#include <mach/mach_time.h>
 #include <time.h>
 #include <stdint.h>
 
 #include <time.h>
 #include <stdint.h>
 
@@ -181,15 +226,9 @@ typedef uint64_t caa_cycles_t;
 
 static inline caa_cycles_t caa_get_cycles (void)
 {
 
 static inline caa_cycles_t caa_get_cycles (void)
 {
-       mach_timespec_t ts = { 0, 0 };
-       static clock_serv_t clock_service;
+       struct timespec ts;
 
 
-       if (caa_unlikely(!clock_service)) {
-               if (host_get_clock_service(mach_host_self(),
-                               SYSTEM_CLOCK, &clock_service))
-                       return -1ULL;
-       }
-       if (caa_unlikely(clock_get_time(clock_service, &ts)))
+       if (caa_unlikely(clock_gettime(CLOCK_MONOTONIC, &ts)))
                return -1ULL;
        return ((uint64_t) ts.tv_sec * 1000000000ULL) + ts.tv_nsec;
 }
                return -1ULL;
        return ((uint64_t) ts.tv_sec * 1000000000ULL) + ts.tv_nsec;
 }
index c8d4d057708e1d5fe603697b12200ca54d0d5682..2a2236e56c9e5f28b076f5c6a12decac889e04c0 100644 (file)
@@ -1,24 +1,12 @@
+// SPDX-FileCopyrightText: 2014 Helge Deller <deller@gmx.de>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_ARCH_HPPA_H
 #define _URCU_ARCH_HPPA_H
 
 /*
  * arch/hppa.h: definitions for hppa architecture
 #ifndef _URCU_ARCH_HPPA_H
 #define _URCU_ARCH_HPPA_H
 
 /*
  * arch/hppa.h: definitions for hppa architecture
- *
- * Copyright (c) 2014 Helge Deller <deller@gmx.de>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
index bca007cf0301f0fc0d01ef5adb7635be433fa7aa..9ed009639df2fceb3aec95df9a3729f7eb8ae871 100644 (file)
@@ -1,25 +1,13 @@
+// SPDX-FileCopyrightText: 2010 Paul E. McKenney, IBM Corporation.
+// SPDX-FileCopyrightText: 2009-2015 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_ARCH_IA64_H
 #define _URCU_ARCH_IA64_H
 
 /*
  * arch/ia64.h: definitions for ia64 architecture
 #ifndef _URCU_ARCH_IA64_H
 #define _URCU_ARCH_IA64_H
 
 /*
  * arch/ia64.h: definitions for ia64 architecture
- *
- * Copyright (c) 2010 Paul E. McKenney, IBM Corporation.
- * Copyright (c) 2009-2015 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
diff --git a/include/urcu/arch/loongarch.h b/include/urcu/arch/loongarch.h
new file mode 100644 (file)
index 0000000..7e82d9a
--- /dev/null
@@ -0,0 +1,37 @@
+// SPDX-FileCopyrightText: 2021 Wang Jing <wangjing@loongson.cn>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+#ifndef _URCU_ARCH_LOONGARCH_H
+#define _URCU_ARCH_LOONGARCH_H
+
+/*
+ * arch/loongarch.h: trivial definitions for the LoongArch architecture.
+ */
+
+#include <urcu/compiler.h>
+#include <urcu/config.h>
+#include <urcu/syscall-compat.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdlib.h>
+#include <sys/time.h>
+
+/*
+ * On Linux, define the membarrier system call number if not yet available in
+ * the system headers.
+ */
+#if (defined(__linux__) && !defined(__NR_membarrier))
+#define __NR_membarrier                283
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#include <urcu/arch/generic.h>
+
+#endif /* _URCU_ARCH_LOONGARCH_H */
index f7698c37755628cfff9f9522541b28f4f3f45304..29dbfc58274389ab49cba2b368ac41b61373aa49 100644 (file)
@@ -1,24 +1,12 @@
+// SPDX-FileCopyrightText: 2017 Michael Jeanson <mjeanson@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_ARCH_M68K_H
 #define _URCU_ARCH_M68K_H
 
 /*
  * arch/m68k.h: definitions for m68k architecture
 #ifndef _URCU_ARCH_M68K_H
 #define _URCU_ARCH_M68K_H
 
 /*
  * arch/m68k.h: definitions for m68k architecture
- *
- * Copyright (c) 2017 Michael Jeanson <mjeanson@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
index ea5b7e9539d8449b4297135a2fd41cf53ea93c03..c22dee281489eb79a7e166542e425eca247d2f42 100644 (file)
@@ -1,25 +1,13 @@
+// SPDX-FileCopyrightText: 2010 Paolo Bonzini <pbonzini@redhat.com>
+// SPDX-FileCopyrightText: 2012 Ralf Baechle <ralf@linux-mips.org>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_ARCH_MIPS_H
 #define _URCU_ARCH_MIPS_H
 
 /*
  * arch_mips.h: trivial definitions for the MIPS architecture.
 #ifndef _URCU_ARCH_MIPS_H
 #define _URCU_ARCH_MIPS_H
 
 /*
  * arch_mips.h: trivial definitions for the MIPS architecture.
- *
- * Copyright (c) 2010 Paolo Bonzini <pbonzini@redhat.com>
- * Copyright (c) 2012 Ralf Baechle <ralf@linux-mips.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
index b4f3e504fae1baabebd52da7da8ba4be6dda8767..4887443ad75f00f32fe54200d4f65cc5d6045440 100644 (file)
@@ -1,24 +1,12 @@
+// SPDX-FileCopyrightText: 2016 Marek Vasut <marex@denx.de>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_ARCH_NIOS2_H
 #define _URCU_ARCH_NIOS2_H
 
 /*
  * arch_nios2.h: trivial definitions for the NIOS2 architecture.
 #ifndef _URCU_ARCH_NIOS2_H
 #define _URCU_ARCH_NIOS2_H
 
 /*
  * arch_nios2.h: trivial definitions for the NIOS2 architecture.
- *
- * Copyright (c) 2016 Marek Vasut <marex@denx.de>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
index 791529ebb1a08ff3db124103474522b77bf0ad15..1285b6d2211f3239b850a73f8a3fb277a3516990 100644 (file)
@@ -1,25 +1,13 @@
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_ARCH_PPC_H
 #define _URCU_ARCH_PPC_H
 
 /*
  * arch_ppc.h: trivial definitions for the powerpc architecture.
 #ifndef _URCU_ARCH_PPC_H
 #define _URCU_ARCH_PPC_H
 
 /*
  * arch_ppc.h: trivial definitions for the powerpc architecture.
- *
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
 extern "C" {
 #endif
 
 extern "C" {
 #endif
 
-/* Include size of POWER5+ L3 cache lines: 256 bytes */
+/*
+ * Most powerpc machines have 128 bytes cache lines, but to make sure
+ * there is no false sharing on all known Power hardware, use the
+ * largest known cache line size, which is the physical size of POWER5
+ * L3 cache lines (256 bytes).
+ *
+ * "Each slice [of the L3] is 12-way set-associative, with 4,096
+ * congruence classes of 256-byte lines managed as two 128-byte sectors
+ * to match the L2 line size."
+ *
+ * From: "POWER5 system microarchitecture",
+ *       IBM Journal of Research & Development,
+ *       vol. 49, no. 4/5, July/September 2005
+ *       https://www.eecg.utoronto.ca/~moshovos/ACA08/readings/power5.pdf
+ *
+ * This value is a compile-time constant, which prevents us from
+ * querying the processor for the cache line size at runtime. We
+ * therefore need to be pessimistic and assume the largest known cache
+ * line size.
+ *
+ * This value is exposed through public headers, so tuning it for
+ * specific environments is a concern for ABI compatibility between
+ * applications and liburcu.
+ */
 #define CAA_CACHE_LINE_SIZE    256
 
 #ifdef __NO_LWSYNC__
 #define CAA_CACHE_LINE_SIZE    256
 
 #ifdef __NO_LWSYNC__
@@ -63,7 +74,7 @@ extern "C" {
        __extension__                                   \
        ({                                              \
                unsigned long rval;                     \
        __extension__                                   \
        ({                                              \
                unsigned long rval;                     \
-               __asm__ __volatile__ ("mftbl %0" : "=r" (rval));        \
+               __asm__ __volatile__ ("mftb %0" : "=r" (rval)); \
                rval;                                   \
        })
 
                rval;                                   \
        })
 
index 1fd7d62bc201d234798ff46a4210906c78c46bb0..cb8173fb5773d8ef9441ae8a1f14f9ce0297d294 100644 (file)
@@ -1,24 +1,12 @@
+// SPDX-FileCopyrightText: 2018 Michael Jeanson <mjeanson@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_ARCH_RISCV_H
 #define _URCU_ARCH_RISCV_H
 
 /*
  * arch/riscv.h: definitions for the RISC-V architecture
 #ifndef _URCU_ARCH_RISCV_H
 #define _URCU_ARCH_RISCV_H
 
 /*
  * arch/riscv.h: definitions for the RISC-V architecture
- *
- * Copyright (c) 2018 Michael Jeanson <mjeanson@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
index 67461b4d6ed1c3f6ac258b0e636a6939fd942871..906d3e97f6786485bb305b2170d5ad63c2db0c14 100644 (file)
@@ -1,3 +1,7 @@
+// SPDX-FileCopyrightText: 2009 Novell, Inc.
+//
+// SPDX-License-Identifier: MIT
+
 #ifndef _URCU_ARCH_S390_H
 #define _URCU_ARCH_S390_H
 
 #ifndef _URCU_ARCH_S390_H
 #define _URCU_ARCH_S390_H
 
@@ -6,26 +10,7 @@
  * Principles of Operation "CPU Serialization" (5-91), "BRANCH ON CONDITION"
  * (7-25) and "STORE CLOCK" (7-169).
  *
  * Principles of Operation "CPU Serialization" (5-91), "BRANCH ON CONDITION"
  * (7-25) and "STORE CLOCK" (7-169).
  *
- * Copyright (c) 2009 Novell, Inc.
  * Author: Jan Blunck <jblunck@suse.de>
  * Author: Jan Blunck <jblunck@suse.de>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
index 1ff40f5c4698d4d7fd693098a16aabedcf1ba45a..1fdc6a4f88f6a064001ebae0ea735af64ee4bd33 100644 (file)
@@ -1,25 +1,13 @@
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_ARCH_SPARC64_H
 #define _URCU_ARCH_SPARC64_H
 
 /*
  * arch_sparc64.h: trivial definitions for the Sparc64 architecture.
 #ifndef _URCU_ARCH_SPARC64_H
 #define _URCU_ARCH_SPARC64_H
 
 /*
  * arch_sparc64.h: trivial definitions for the Sparc64 architecture.
- *
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
index eae1161f2203340cc96e764d2298de5983af6450..0c5af191d790eb330db77e9865f6f987b6fa4935 100644 (file)
@@ -1,25 +1,13 @@
+// SPDX-FileCopyrightText: 2010 Paul E. McKenney, IBM Corporation.
+// SPDX-FileCopyrightText: 2009-2015 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_ARCH_TILE_H
 #define _URCU_ARCH_TILE_H
 
 /*
  * arch/tile.h: definitions for tile architecture
 #ifndef _URCU_ARCH_TILE_H
 #define _URCU_ARCH_TILE_H
 
 /*
  * arch/tile.h: definitions for tile architecture
- *
- * Copyright (c) 2010 Paul E. McKenney, IBM Corporation.
- * Copyright (c) 2009-2015 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
diff --git a/include/urcu/arch/unknown.h b/include/urcu/arch/unknown.h
deleted file mode 100644 (file)
index 701575d..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef _URCU_ARCH_UNKNOWN_H
-#define _URCU_ARCH_UNKNOWN_H
-
-/*
- * arch_unknown.h: #error to prevent build on unknown architectures.
- *
- * Copyright (c) 2010 Paul E. McKenney, IBM Corporation.
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/* See configure.ac for the list of recognized architectures.  */
-#error "Cannot build: unrecognized architecture detected."
-
-#endif /* _URCU_ARCH_UNKNOWN_H */
index aac8ca1384b63f4ce321680cffbcaca661a0f16c..dcff3a8d16c19b56a1ee62657dfddfd579dd3c7f 100644 (file)
@@ -1,25 +1,13 @@
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_ARCH_X86_H
 #define _URCU_ARCH_X86_H
 
 /*
  * arch_x86.h: trivial definitions for the x86 architecture.
 #ifndef _URCU_ARCH_X86_H
 #define _URCU_ARCH_X86_H
 
 /*
  * arch_x86.h: trivial definitions for the x86 architecture.
- *
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
@@ -33,7 +21,19 @@ extern "C" {
 
 #define CAA_CACHE_LINE_SIZE    128
 
 
 #define CAA_CACHE_LINE_SIZE    128
 
-#ifdef CONFIG_RCU_HAVE_FENCE
+/*
+ * For now, using lock; addl compatibility mode even for i686, because the
+ * Pentium III is seen as a i686, but lacks mfence instruction.  Only using
+ * fence for x86_64.
+ *
+ * k1om (__MIC__) is the name for the Intel MIC family (Xeon Phi). It is an
+ * x86_64 variant but lacks fence instructions.
+ */
+#if (defined(URCU_ARCH_AMD64) && !defined(URCU_ARCH_K1OM))
+
+/* For backwards compat */
+#define CONFIG_RCU_HAVE_FENCE 1
+
 #define cmm_mb()    __asm__ __volatile__ ("mfence":::"memory")
 
 /*
 #define cmm_mb()    __asm__ __volatile__ ("mfence":::"memory")
 
 /*
@@ -45,7 +45,9 @@ extern "C" {
 #define cmm_wmb()     __asm__ __volatile__ ("sfence"::: "memory")
 #define cmm_smp_rmb() cmm_barrier()
 #define cmm_smp_wmb() cmm_barrier()
 #define cmm_wmb()     __asm__ __volatile__ ("sfence"::: "memory")
 #define cmm_smp_rmb() cmm_barrier()
 #define cmm_smp_wmb() cmm_barrier()
+
 #else
 #else
+
 /*
  * We leave smp_rmb/smp_wmb as full barriers for processors that do not have
  * fence instructions.
 /*
  * We leave smp_rmb/smp_wmb as full barriers for processors that do not have
  * fence instructions.
diff --git a/include/urcu/assert.h b/include/urcu/assert.h
new file mode 100644 (file)
index 0000000..3b8cdc6
--- /dev/null
@@ -0,0 +1,42 @@
+// SPDX-FileCopyrightText: 2021 Francis Deslauriers <francis.deslauriers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
+#ifndef _URCU_ASSERT_H
+#define _URCU_ASSERT_H
+
+/*
+ * Userspace RCU assertion facilities.
+ */
+
+#include <urcu/config.h>
+
+/*
+ * Force usage of an expression to prevent unused expression compiler warning.
+ */
+#define _urcu_use_expression(_expr) ((void) sizeof((void) (_expr), 0))
+
+#ifdef NDEBUG
+/*
+ * Vanilla assert() replacement. When NDEBUG is defined, the expression is
+ * consumed to prevent unused variable compile warnings.
+ */
+# define urcu_posix_assert(_cond) _urcu_use_expression(_cond)
+#else
+# include <assert.h>
+# define urcu_posix_assert(_cond) assert(_cond)
+#endif
+
+#if defined(DEBUG_RCU) || defined(CONFIG_RCU_DEBUG)
+
+/*
+ * Enables debugging/expensive assertions to be used in fast paths and only
+ * enabled on demand. When disabled, the expression is consumed to prevent
+ * unused variable compile warnings.
+ */
+# define urcu_assert_debug(_cond) urcu_posix_assert(_cond)
+#else
+# define urcu_assert_debug(_cond) _urcu_use_expression(_cond)
+#endif
+
+#endif /* _URCU_ASSERT_H */
index fc63ecd52b8b4b7f2bccd58c0e7ecbcc2c458f98..6b6de5c526b031f41fde284ebc2436e5803bfc80 100644 (file)
@@ -1,30 +1,16 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_CALL_RCU_H
 #define _URCU_CALL_RCU_H
 
 /*
 #ifndef _URCU_CALL_RCU_H
 #define _URCU_CALL_RCU_H
 
 /*
- * urcu/call-rcu.h
- *
  * Userspace RCU header - batch memory reclamation with kernel API
  *
  * Userspace RCU header - batch memory reclamation with kernel API
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
  * This header is meant to be included indirectly through a liburcu
  * flavor header.
  * This header is meant to be included indirectly through a liburcu
  * flavor header.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <stdlib.h>
  */
 
 #include <stdlib.h>
index 78534bbe1dc200af2c6a0b4530d6e850a338a241..9eae429af81ed4584f11ed6b287cbbf325eae291 100644 (file)
@@ -1,26 +1,12 @@
+// SPDX-FileCopyrightText: 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_CDS_H
 #define _URCU_CDS_H
 
 /*
 #ifndef _URCU_CDS_H
 #define _URCU_CDS_H
 
 /*
- * urcu/cds.h
- *
  * Userspace RCU library - Concurrent Data Structures
  * Userspace RCU library - Concurrent Data Structures
- *
- * Copyright 2011 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/hlist.h>
  */
 
 #include <urcu/hlist.h>
index 511dbdf302456d46329bce98e1147b7c34a51543..197656c617d786f8af88f5648a60483ac224f3c4 100644 (file)
@@ -1,30 +1,30 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_COMPILER_H
 #define _URCU_COMPILER_H
 
 /*
 #ifndef _URCU_COMPILER_H
 #define _URCU_COMPILER_H
 
 /*
- * compiler.h
- *
  * Compiler definitions.
  * Compiler definitions.
- *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
  */
 
 #include <stddef.h>    /* for offsetof */
 
  */
 
 #include <stddef.h>    /* for offsetof */
 
+#if defined __cplusplus
+# include <type_traits>        /* for std::remove_cv */
+#endif
+
+#include <urcu/config.h>
+
 #define caa_likely(x)  __builtin_expect(!!(x), 1)
 #define caa_unlikely(x)        __builtin_expect(!!(x), 0)
 
 #define caa_likely(x)  __builtin_expect(!!(x), 1)
 #define caa_unlikely(x)        __builtin_expect(!!(x), 0)
 
-#define        cmm_barrier()   __asm__ __volatile__ ("" : : : "memory")
+#ifdef CONFIG_RCU_USE_ATOMIC_BUILTINS
+#  define cmm_barrier() __atomic_signal_fence(__ATOMIC_SEQ_CST)
+#else
+#  define cmm_barrier() __asm__ __volatile__ ("" : : : "memory")
+#endif
 
 /*
  * Instruct the compiler to perform only a single access to a variable
 
 /*
  * Instruct the compiler to perform only a single access to a variable
                (type *)((char *)__ptr - offsetof(type, member));       \
        })
 
                (type *)((char *)__ptr - offsetof(type, member));       \
        })
 
+/*
+ * caa_container_of_check_null - Get the address of an object containing a field.
+ *
+ * @ptr: pointer to the field.
+ * @type: type of the object.
+ * @member: name of the field within the object.
+ *
+ * Return the address of the object containing the field. Return NULL if
+ * @ptr is NULL.
+ */
+#define caa_container_of_check_null(ptr, type, member)                 \
+       __extension__                                                   \
+       ({                                                              \
+               const __typeof__(((type *) NULL)->member) * __ptr = (ptr); \
+               (__ptr) ? (type *)((char *)__ptr - offsetof(type, member)) : NULL; \
+       })
+
 #define CAA_BUILD_BUG_ON_ZERO(cond) (sizeof(struct { int:-!!(cond); }))
 #define CAA_BUILD_BUG_ON(cond) ((void)CAA_BUILD_BUG_ON_ZERO(cond))
 
 #define CAA_BUILD_BUG_ON_ZERO(cond) (sizeof(struct { int:-!!(cond); }))
 #define CAA_BUILD_BUG_ON(cond) ((void)CAA_BUILD_BUG_ON_ZERO(cond))
 
@@ -82,7 +99,7 @@
 #define __rcu
 
 #ifdef __cplusplus
 #define __rcu
 
 #ifdef __cplusplus
-#define URCU_FORCE_CAST(type, arg)     (reinterpret_cast<type>(arg))
+#define URCU_FORCE_CAST(_type, arg)    (reinterpret_cast<std::remove_cv<_type>::type>(arg))
 #else
 #define URCU_FORCE_CAST(type, arg)     ((type) (arg))
 #endif
 #else
 #define URCU_FORCE_CAST(type, arg)     ((type) (arg))
 #endif
 #define CAA_ARRAY_SIZE(x)      (sizeof(x) / sizeof((x)[0]))
 
 /*
 #define CAA_ARRAY_SIZE(x)      (sizeof(x) / sizeof((x)[0]))
 
 /*
- * Don't allow compiling with buggy compiler.
+ * URCU_GCC_VERSION is used to blacklist specific GCC versions with known
+ * bugs, clang also defines these macros to an equivalent GCC version it
+ * claims to support, so exclude it.
  */
  */
-
-#ifdef __GNUC__
+#if defined(__GNUC__) && !defined(__clang__)
 # define URCU_GCC_VERSION      (__GNUC__ * 10000 \
                                + __GNUC_MINOR__ * 100 \
                                + __GNUC_PATCHLEVEL__)
 # define URCU_GCC_VERSION      (__GNUC__ * 10000 \
                                + __GNUC_MINOR__ * 100 \
                                + __GNUC_PATCHLEVEL__)
+#endif
+
+#ifdef __cplusplus
+#define caa_unqual_scalar_typeof(x)                                    \
+       std::remove_cv<std::remove_reference<decltype(x)>::type>::type
+#else
+#define caa_scalar_type_to_expr(type)                                  \
+       unsigned type: (unsigned type)0,                                \
+       signed type: (signed type)0
+
+/*
+ * Use C11 _Generic to express unqualified type from expression. This removes
+ * volatile qualifier from expression type.
+ */
+#define caa_unqual_scalar_typeof(x)                                    \
+       __typeof__(                                                     \
+               _Generic((x),                                           \
+                       char: (char)0,                                  \
+                       caa_scalar_type_to_expr(char),                  \
+                       caa_scalar_type_to_expr(short),         \
+                       caa_scalar_type_to_expr(int),                   \
+                       caa_scalar_type_to_expr(long),                  \
+                       caa_scalar_type_to_expr(long long),             \
+                       default: (x)                                    \
+               )                                                       \
+       )
+#endif
 
 /*
 
 /*
- * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58854
+ * Allow user to manually define CMM_SANITIZE_THREAD if their toolchain is not
+ * supported by this check.
  */
  */
-# ifdef __ARMEL__
-#  if URCU_GCC_VERSION >= 40800 && URCU_GCC_VERSION <= 40802
-#   error Your gcc version produces clobbered frame accesses
+#ifndef CMM_SANITIZE_THREAD
+# if defined(__GNUC__) && defined(__SANITIZE_THREAD__)
+#  define CMM_SANITIZE_THREAD
+# elif defined(__clang__) && defined(__has_feature)
+#  if __has_feature(thread_sanitizer)
+#   define CMM_SANITIZE_THREAD
 #  endif
 # endif
 #  endif
 # endif
+#endif /* !CMM_SANITIZE_THREAD */
+
+/*
+ * Helper to add the volatile qualifier to a pointer.
+ */
+#if defined __cplusplus
+template <typename T>
+volatile T cmm_cast_volatile(T t)
+{
+    return static_cast<volatile T>(t);
+}
+#else
+#  define cmm_cast_volatile(ptr)                       \
+       __extension__                                   \
+       ({                                              \
+               (volatile __typeof__(ptr))(ptr);        \
+       })
+#endif
+
+/*
+ * Compile time assertion.
+ * - predicate: boolean expression to evaluate,
+ * - msg: string to print to the user on failure when `static_assert()` is
+ *   supported,
+ * - c_identifier_msg: message to be included in the typedef to emulate a
+ *   static assertion. This parameter must be a valid C identifier as it will
+ *   be used as a typedef name.
+ */
+#ifdef __cplusplus
+#define urcu_static_assert(predicate, msg, c_identifier_msg)  \
+       static_assert(predicate, msg)
+#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
+#define urcu_static_assert(predicate, msg, c_identifier_msg)  \
+       _Static_assert(predicate, msg)
+#else
+/*
+ * Evaluates the predicate and emit a compilation error on failure.
+ *
+ * If the predicate evaluates to true, this macro emits a function
+ * prototype with an argument type which is an array of size 0.
+ *
+ * If the predicate evaluates to false, this macro emits a function
+ * prototype with an argument type which is an array of negative size
+ * which is invalid in C and forces a compiler error. The
+ * c_identifier_msg parameter is used as the argument identifier so it
+ * is printed to the user when the error is reported.
+ */
+#define urcu_static_assert(predicate, msg, c_identifier_msg)  \
+       void urcu_static_assert_proto(char c_identifier_msg[2*!!(predicate)-1])
 #endif
 
 #endif /* _URCU_COMPILER_H */
 #endif
 
 #endif /* _URCU_COMPILER_H */
index 8c3e4da53108d10c7944954aebe50666e7cd56a5..473d7a2ec49a076225f5096e7ae65315cfc04aba 100644 (file)
@@ -1,22 +1,14 @@
-/* urcu/config.h.in. Manually generated for control over the contained defs. */
-
-/* Defined when on a system that has memory fence instructions. */
-#undef CONFIG_RCU_HAVE_FENCE
+// SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
 
 
-/* Defined when on a system with futex support. */
-#undef CONFIG_RCU_HAVE_FUTEX
+/* urcu/config.h.in. Manually generated for control over the contained defs. */
 
 /* Enable SMP support. With SMP support enabled, uniprocessors are also
    supported. With SMP support disabled, UP systems work fine, but the
    behavior of SMP systems is undefined. */
 #undef CONFIG_RCU_SMP
 
 
 /* Enable SMP support. With SMP support enabled, uniprocessors are also
    supported. With SMP support disabled, UP systems work fine, but the
    behavior of SMP systems is undefined. */
 #undef CONFIG_RCU_SMP
 
-/* Compatibility mode for i386 which lacks cmpxchg instruction. */
-#undef CONFIG_RCU_COMPAT_ARCH
-
-/* Use the dmb instruction is available for use on ARM. */
-#undef CONFIG_RCU_ARM_HAVE_DMB
-
 /* TLS provided by the compiler. */
 #undef CONFIG_RCU_TLS
 
 /* TLS provided by the compiler. */
 #undef CONFIG_RCU_TLS
 
 #undef CONFIG_RCU_FORCE_SYS_MEMBARRIER
 
 /* Enable internal debugging self-checks.
 #undef CONFIG_RCU_FORCE_SYS_MEMBARRIER
 
 /* Enable internal debugging self-checks.
-   Introduce performance penalty. */
+   Introduces a performance penalty. */
 #undef CONFIG_RCU_DEBUG
 
 #undef CONFIG_RCU_DEBUG
 
+/* Uatomic API uses atomic builtins. */
+#undef CONFIG_RCU_USE_ATOMIC_BUILTINS
+
+/* Emit legacy memory barriers? */
+#undef CONFIG_RCU_EMIT_LEGACY_MB
+
 /* Expose multi-flavor support */
 #define CONFIG_RCU_HAVE_MULTIFLAVOR 1
 
 /* Expose multi-flavor support */
 #define CONFIG_RCU_HAVE_MULTIFLAVOR 1
 
index 14b50b6a1d539dd67e978ce929c8758a06ca7744..ff89de273150cdec2ab90be0e3c99d2d8c068b2f 100644 (file)
@@ -1,30 +1,20 @@
+// SPDX-FileCopyrightText: 2015 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 #ifndef _URCU_DEBUG_H
 #define _URCU_DEBUG_H
 
 /*
 #ifndef _URCU_DEBUG_H
 #define _URCU_DEBUG_H
 
 /*
- * urcu/debug.h
- *
  * Userspace RCU debugging facilities.
  * Userspace RCU debugging facilities.
- *
- * Copyright (c) 2015 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
  */
 
  */
 
-#include <assert.h>
+#include <urcu/assert.h>
 
 
-#if defined(DEBUG_RCU) || defined(CONFIG_RCU_DEBUG)
-#define urcu_assert(...)       assert(__VA_ARGS__)
-#else
-#define urcu_assert(...)
-#endif
+/*
+ * For backward compatibility reasons, this file must expose the urcu_assert()
+ * macro.
+ */
+#define urcu_assert(_cond) urcu_assert_debug(_cond)
 
 #endif /* _URCU_DEBUG_H */
 
 #endif /* _URCU_DEBUG_H */
index 67b5f805fe9c2ecda49842acf23002ab2295abaf..db3640494a94016e2e6e7cbd540a1e897eb6af46 100644 (file)
@@ -1,30 +1,16 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_DEFER_H
 #define _URCU_DEFER_H
 
 /*
 #ifndef _URCU_DEFER_H
 #define _URCU_DEFER_H
 
 /*
- * urcu/defer.h
- *
  * Userspace RCU header - deferred execution
  *
  * Userspace RCU header - deferred execution
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
  * This header is meant to be included indirectly through a liburcu
  * flavor header.
  * This header is meant to be included indirectly through a liburcu
  * flavor header.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <stdlib.h>
  */
 
 #include <stdlib.h>
index 93da38f7d449c42107ef65a09a6c909f6e75926f..ce2a013a9aa14d1bff0874850f1d8d1699452ef9 100644 (file)
@@ -1,28 +1,16 @@
+// SPDX-FileCopyrightText: 2011 Lai Jiangshan <laijs@cn.fujitsu.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_FLAVOR_H
 #define _URCU_FLAVOR_H
 
 /*
 #ifndef _URCU_FLAVOR_H
 #define _URCU_FLAVOR_H
 
 /*
- * urcu-flavor.h
- *
  * Userspace RCU header - rcu flavor declarations
  * Userspace RCU header - rcu flavor declarations
- *
- * Copyright (c) 2011 Lai Jiangshan <laijs@cn.fujitsu.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
  */
 
+#include <urcu/urcu-poll.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -58,6 +46,9 @@ struct rcu_flavor_struct {
 
        void (*register_rculfhash_atfork)(struct urcu_atfork *atfork);
        void (*unregister_rculfhash_atfork)(struct urcu_atfork *atfork);
 
        void (*register_rculfhash_atfork)(struct urcu_atfork *atfork);
        void (*unregister_rculfhash_atfork)(struct urcu_atfork *atfork);
+
+       struct urcu_gp_poll_state (*update_start_poll_synchronize_rcu)(void);
+       bool (*update_poll_state_synchronize_rcu)(struct urcu_gp_poll_state state);
 };
 
 #define DEFINE_RCU_FLAVOR(x)                           \
 };
 
 #define DEFINE_RCU_FLAVOR(x)                           \
@@ -76,17 +67,10 @@ const struct rcu_flavor_struct x = {                        \
        .barrier                = rcu_barrier,          \
        .register_rculfhash_atfork = urcu_register_rculfhash_atfork,    \
        .unregister_rculfhash_atfork = urcu_unregister_rculfhash_atfork,\
        .barrier                = rcu_barrier,          \
        .register_rculfhash_atfork = urcu_register_rculfhash_atfork,    \
        .unregister_rculfhash_atfork = urcu_unregister_rculfhash_atfork,\
+       .update_start_poll_synchronize_rcu = start_poll_synchronize_rcu,\
+       .update_poll_state_synchronize_rcu = poll_state_synchronize_rcu,\
 }
 
 }
 
-#define DEFINE_RCU_FLAVOR_ALIAS(x, y) _DEFINE_RCU_FLAVOR_ALIAS(x, y)
-#ifdef __APPLE__
-#define _DEFINE_RCU_FLAVOR_ALIAS(x, y)
-#else
-#define _DEFINE_RCU_FLAVOR_ALIAS(x, y)                 \
-__attribute__((alias(#x)))                             \
-extern const struct rcu_flavor_struct y;
-#endif
-
 extern const struct rcu_flavor_struct rcu_flavor;
 
 #ifdef __cplusplus
 extern const struct rcu_flavor_struct rcu_flavor;
 
 #ifdef __cplusplus
index c206c6fce0d373c4a6dcffbdb7df4e5b37144194..9d0a997473c025563bd9c557225e2029ecd6f831 100644 (file)
@@ -1,32 +1,38 @@
+// SPDX-FileCopyrightText: 2011-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_FUTEX_H
 #define _URCU_FUTEX_H
 
 /*
 #ifndef _URCU_FUTEX_H
 #define _URCU_FUTEX_H
 
 /*
- * urcu-futex.h
- *
  * Userspace RCU - sys_futex/compat_futex header.
  * Userspace RCU - sys_futex/compat_futex header.
- *
- * Copyright 2011-2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/config.h>
  */
 
 #include <urcu/config.h>
+#include <urcu/syscall-compat.h>
+
+#include <errno.h>
 #include <stdint.h>
 #include <time.h>
 
 #include <stdint.h>
 #include <time.h>
 
+#if (defined(__linux__) && defined(__NR_futex))
+
+/* For backwards compat */
+#define CONFIG_RCU_HAVE_FUTEX 1
+
+#include <unistd.h>
+#include <errno.h>
+#include <urcu/compiler.h>
+#include <urcu/arch.h>
+
+#elif defined(__FreeBSD__)
+
+#include <sys/types.h>
+#include <sys/umtx.h>
+
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -53,12 +59,7 @@ extern int compat_futex_noasync(int32_t *uaddr, int op, int32_t val,
 extern int compat_futex_async(int32_t *uaddr, int op, int32_t val,
                const struct timespec *timeout, int32_t *uaddr2, int32_t val3);
 
 extern int compat_futex_async(int32_t *uaddr, int op, int32_t val,
                const struct timespec *timeout, int32_t *uaddr2, int32_t val3);
 
-#ifdef CONFIG_RCU_HAVE_FUTEX
-
-#include <unistd.h>
-#include <errno.h>
-#include <urcu/compiler.h>
-#include <urcu/arch.h>
+#if (defined(__linux__) && defined(__NR_futex))
 
 static inline int futex(int32_t *uaddr, int op, int32_t val,
                const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
 
 static inline int futex(int32_t *uaddr, int op, int32_t val,
                const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
@@ -103,6 +104,48 @@ static inline int futex_async(int32_t *uaddr, int op, int32_t val,
        return ret;
 }
 
        return ret;
 }
 
+#elif defined(__FreeBSD__)
+
+static inline int futex_async(int32_t *uaddr, int op, int32_t val,
+               const struct timespec *timeout,
+               int32_t *uaddr2 __attribute__((unused)),
+               int32_t val3 __attribute__((unused)))
+{
+       int umtx_op;
+       void *umtx_uaddr = NULL, *umtx_uaddr2 = NULL;
+       struct _umtx_time umtx_timeout = {
+               ._flags = UMTX_ABSTIME,
+               ._clockid = CLOCK_MONOTONIC,
+       };
+
+       switch (op) {
+       case FUTEX_WAIT:
+               /* On FreeBSD, a "u_int" is a 32-bit integer. */
+               umtx_op = UMTX_OP_WAIT_UINT;
+               if (timeout != NULL) {
+                       umtx_timeout._timeout = *timeout;
+                       umtx_uaddr = (void *) sizeof(umtx_timeout);
+                       umtx_uaddr2 = (void *) &umtx_timeout;
+               }
+               break;
+       case FUTEX_WAKE:
+               umtx_op = UMTX_OP_WAKE;
+               break;
+       default:
+               errno = EINVAL;
+               return -1;
+       }
+
+       return _umtx_op(uaddr, umtx_op, (uint32_t) val, umtx_uaddr,
+                       umtx_uaddr2);
+}
+
+static inline int futex_noasync(int32_t *uaddr, int op, int32_t val,
+               const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
+{
+       return futex_async(uaddr, op, val, timeout, uaddr2, val3);
+}
+
 #elif defined(__CYGWIN__)
 
 /*
 #elif defined(__CYGWIN__)
 
 /*
index 344481133eac2051f4d7ab85e6188f51887e7dd7..9a1eb21e33990ea0bad4bb4e9388c6fbc1278208 100644 (file)
@@ -1,3 +1,8 @@
+// SPDX-FileCopyrightText: 2009 Novell Inc.
+// SPDX-FileCopyrightText: 2010-2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-only
+
 #ifndef _KCOMPAT_HLIST_H
 #define _KCOMPAT_HLIST_H
 
 #ifndef _KCOMPAT_HLIST_H
 #define _KCOMPAT_HLIST_H
 
  * Kernel sourcecode compatible lightweight single pointer list head useful
  * for implementing hash tables
  *
  * Kernel sourcecode compatible lightweight single pointer list head useful
  * for implementing hash tables
  *
- * Copyright (C) 2009 Novell Inc.
- *
  * Author: Jan Blunck <jblunck@suse.de>
  * Author: Jan Blunck <jblunck@suse.de>
- *
- * Copyright (C) 2010-2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License version 2.1 as
- * published by the Free  Software Foundation.
  */
 
 #include <stddef.h>
  */
 
 #include <stddef.h>
+#include <urcu/compiler.h>
 
 struct cds_hlist_head {
        struct cds_hlist_node *next;
 
 struct cds_hlist_head {
        struct cds_hlist_node *next;
@@ -40,8 +38,14 @@ void CDS_INIT_HLIST_HEAD(struct cds_hlist_head *ptr)
        { .next = NULL }
 
 /* Get typed element from list at a given position. */
        { .next = NULL }
 
 /* Get typed element from list at a given position. */
-#define cds_hlist_entry(ptr, type, member) \
-       ((type *) ((char *) (ptr) - (unsigned long) (&((type *) 0)->member)))
+#define cds_hlist_entry(ptr, type, member)     caa_container_of(ptr, type, member)
+
+/* Get typed element from list at a given position, keeping NULL pointers. */
+#define cds_hlist_entry_safe(ptr, type, member)                                        \
+       ({                                                                      \
+               __typeof__(ptr) ____ret = (ptr);                                \
+               ____ret ? cds_hlist_entry(____ret, type, member) : NULL;        \
+       })
 
 /* Add new element at the head of the list. */
 static inline
 
 /* Add new element at the head of the list. */
 static inline
@@ -65,12 +69,12 @@ void cds_hlist_del(struct cds_hlist_node *elem)
 }
 
 #define cds_hlist_for_each(pos, head) \
 }
 
 #define cds_hlist_for_each(pos, head) \
-       for (pos = (head)->next; pos != NULL; pos = pos->next)
+       for (pos = (head)->next; (pos) != NULL; pos = (pos)->next)
 
 #define cds_hlist_for_each_safe(pos, p, head) \
        for (pos = (head)->next; \
 
 #define cds_hlist_for_each_safe(pos, p, head) \
        for (pos = (head)->next; \
-               (pos != NULL) && (p = pos->next, 1); \
-               pos = p)
+               ((pos) != NULL) && (p = (pos)->next, 1); \
+               pos = (p))
 
 /*
  * cds_hlist_for_each_entry and cds_hlist_for_each_entry_safe take
 
 /*
  * cds_hlist_for_each_entry and cds_hlist_for_each_entry_safe take
@@ -80,31 +84,27 @@ void cds_hlist_del(struct cds_hlist_node *elem)
  */
 #define cds_hlist_for_each_entry(entry, pos, head, member) \
        for (pos = (head)->next, \
  */
 #define cds_hlist_for_each_entry(entry, pos, head, member) \
        for (pos = (head)->next, \
-                       entry = cds_hlist_entry(pos, __typeof__(*entry), member); \
-               pos != NULL; \
-               pos = pos->next, \
-                       entry = cds_hlist_entry(pos, __typeof__(*entry), member))
+                       entry = cds_hlist_entry(pos, __typeof__(*(entry)), member); \
+               (pos) != NULL; \
+               pos = (pos)->next, \
+                       entry = cds_hlist_entry(pos, __typeof__(*(entry)), member))
 
 #define cds_hlist_for_each_entry_safe(entry, pos, p, head, member) \
        for (pos = (head)->next, \
 
 #define cds_hlist_for_each_entry_safe(entry, pos, p, head, member) \
        for (pos = (head)->next, \
-                       entry = cds_hlist_entry(pos, __typeof__(*entry), member); \
-               (pos != NULL) && (p = pos->next, 1); \
-               pos = p, \
+                       entry = cds_hlist_entry(pos, __typeof__(*(entry)), member); \
+               ((pos) != NULL) && (p = (pos)->next, 1); \
+               pos = (p), \
                        entry = cds_hlist_entry(pos, __typeof__(*entry), member))
 
 #define cds_hlist_for_each_entry_2(entry, head, member) \
                        entry = cds_hlist_entry(pos, __typeof__(*entry), member))
 
 #define cds_hlist_for_each_entry_2(entry, head, member) \
-       for (entry = ((head)->next == NULL ? NULL \
-                       : cds_hlist_entry((head)->next, __typeof__(*entry), member)); \
-               entry != NULL; \
-               entry = (entry->member.next == NULL ? NULL \
-                       : cds_hlist_entry(entry->member.next, __typeof__(*entry), member)))
+       for (entry = cds_hlist_entry_safe((head)->next, __typeof__(*(entry)), member); \
+               (entry) != NULL; \
+               entry = cds_hlist_entry_safe((entry)->member.next, __typeof__(*(entry)), member))
 
 #define cds_hlist_for_each_entry_safe_2(entry, e, head, member) \
 
 #define cds_hlist_for_each_entry_safe_2(entry, e, head, member) \
-       for (entry = ((head)->next == NULL ? NULL \
-                       : cds_hlist_entry((head)->next, __typeof__(*entry), member)); \
-               (entry != NULL) && (e = (entry->member.next == NULL ? NULL \
-                                       : cds_hlist_entry(entry->member.next, \
-                                               __typeof__(*entry), member)), 1); \
+       for (entry = cds_hlist_entry_safe((head)->next, __typeof__(*(entry)), member); \
+               ((entry) != NULL) && (e = (cds_hlist_entry_safe((entry)->member.next, \
+                                               __typeof__(*(entry)), member)), 1); \
                entry = e)
 
 #endif /* _KCOMPAT_HLIST_H */
                entry = e)
 
 #endif /* _KCOMPAT_HLIST_H */
index 5a9bca368775db300cbd1bac44e5fbcd51c6ce47..77af43bf18069df89619f85be6ac46178980de5c 100644 (file)
@@ -1,26 +1,12 @@
+// SPDX-FileCopyrightText: 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_LFSTACK_H
 #define _URCU_LFSTACK_H
 
 /*
 #ifndef _URCU_LFSTACK_H
 #define _URCU_LFSTACK_H
 
 /*
- * lfstack.h
- *
  * Userspace RCU library - Lock-Free Stack
  * Userspace RCU library - Lock-Free Stack
- *
- * Copyright 2010-2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #ifdef __cplusplus
  */
 
 #ifdef __cplusplus
@@ -80,14 +66,27 @@ struct cds_lfs_stack {
 };
 
 /*
 };
 
 /*
- * The transparent union allows calling functions that work on both
- * struct cds_lfs_stack and struct __cds_lfs_stack on any of those two
- * types.
+ * In C, the transparent union allows calling functions that work on
+ * both struct cds_lfs_stack and struct __cds_lfs_stack on any of those
+ * two types.
+ *
+ * In C++, implement static inline wrappers using function overloading
+ * to obtain an API similar to C.
+ *
+ * Avoid complaints from clang++ not knowing the transparent union
+ * attribute.
  */
  */
+#if defined(__clang__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wignored-attributes"
+#endif
 typedef union {
        struct __cds_lfs_stack *_s;
        struct cds_lfs_stack *s;
 } __attribute__((__transparent_union__)) cds_lfs_stack_ptr_t;
 typedef union {
        struct __cds_lfs_stack *_s;
        struct cds_lfs_stack *s;
 } __attribute__((__transparent_union__)) cds_lfs_stack_ptr_t;
+#if defined(__clang__)
+#pragma clang diagnostic pop
+#endif
 
 #ifdef _LGPL_SOURCE
 
 
 #ifdef _LGPL_SOURCE
 
@@ -255,6 +254,49 @@ extern struct cds_lfs_head *__cds_lfs_pop_all(cds_lfs_stack_ptr_t s);
 
 #ifdef __cplusplus
 }
 
 #ifdef __cplusplus
 }
-#endif
+
+/*
+ * In C++, implement static inline wrappers using function overloading
+ * to obtain an API similar to C.
+ */
+
+static inline cds_lfs_stack_ptr_t cds_lfs_stack_cast(struct __cds_lfs_stack *s)
+{
+       cds_lfs_stack_ptr_t ret = {
+               ._s = s,
+       };
+       return ret;
+}
+
+static inline cds_lfs_stack_ptr_t cds_lfs_stack_cast(struct cds_lfs_stack *s)
+{
+       cds_lfs_stack_ptr_t ret = {
+               .s = s,
+       };
+       return ret;
+}
+
+template<typename T> static inline bool cds_lfs_empty(T s)
+{
+       return cds_lfs_empty(cds_lfs_stack_cast(s));
+}
+
+template<typename T> static inline bool cds_lfs_push(T s,
+                       struct cds_lfs_node *node)
+{
+       return cds_lfs_push(cds_lfs_stack_cast(s), node);
+}
+
+template<typename T> static inline struct cds_lfs_node *__cds_lfs_pop(T s)
+{
+       return __cds_lfs_pop(cds_lfs_stack_cast(s));
+}
+
+template<typename T> static inline struct cds_lfs_head *__cds_lfs_pop_all(T s)
+{
+       return __cds_lfs_pop_all(cds_lfs_stack_cast(s));
+}
+
+#endif /* __cplusplus */
 
 #endif /* _URCU_LFSTACK_H */
 
 #endif /* _URCU_LFSTACK_H */
index 4aaf869351fea0a8644f696ed294482de6a179d8..4bc88b3f22c505e0f83355d3919eff80fb3ac868 100644 (file)
@@ -1,30 +1,19 @@
+// SPDX-FileCopyrightText: 2002 Free Software Foundation, Inc.
+// SPDX-FileCopyrightText: 2009 Pierre-Marc Fournier
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * Copyright (C) 2002 Free Software Foundation, Inc.
  * (originally part of the GNU C Library)
  * Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
  * (originally part of the GNU C Library)
  * Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
- *
- * Copyright (C) 2009 Pierre-Marc Fournier
- * Conversion to RCU list.
- * Copyright (C) 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #ifndef _CDS_LIST_H
 #define _CDS_LIST_H    1
 
  */
 
 #ifndef _CDS_LIST_H
 #define _CDS_LIST_H    1
 
+#include <urcu/compiler.h>
+
 /*
  * The definitions of this file are adopted from those which can be
  * found in the Linux kernel headers to enable people familiar with the
 /*
  * The definitions of this file are adopted from those which can be
  * found in the Linux kernel headers to enable people familiar with the
@@ -44,7 +33,7 @@ struct cds_list_head {
 #define CDS_INIT_LIST_HEAD(ptr) \
        (ptr)->next = (ptr)->prev = (ptr)
 
 #define CDS_INIT_LIST_HEAD(ptr) \
        (ptr)->next = (ptr)->prev = (ptr)
 
-#define CDS_LIST_HEAD_INIT(name) { .prev = &(name), .next = &(name) }
+#define CDS_LIST_HEAD_INIT(name) { .next = &(name), .prev = &(name) }
 
 /* Add new element at the head of the list. */
 static inline
 
 /* Add new element at the head of the list. */
 static inline
@@ -121,8 +110,7 @@ void cds_list_splice(struct cds_list_head *add, struct cds_list_head *head)
 }
 
 /* Get typed element from list at a given position. */
 }
 
 /* Get typed element from list at a given position. */
-#define cds_list_entry(ptr, type, member) \
-       ((type *) ((char *) (ptr) - (unsigned long) (&((type *) 0)->member)))
+#define cds_list_entry(ptr, type, member)      caa_container_of(ptr, type, member)
 
 
 /* Get first entry from a list. */
 
 
 /* Get first entry from a list. */
@@ -131,54 +119,54 @@ void cds_list_splice(struct cds_list_head *add, struct cds_list_head *head)
 
 /* Iterate forward over the elements of the list. */
 #define cds_list_for_each(pos, head) \
 
 /* Iterate forward over the elements of the list. */
 #define cds_list_for_each(pos, head) \
-       for (pos = (head)->next; pos != (head); pos = pos->next)
+       for (pos = (head)->next; (pos) != (head); pos = (pos)->next)
 
 /*
  * Iterate forward over the elements list. The list elements can be
  * removed from the list while doing this.
  */
 #define cds_list_for_each_safe(pos, p, head) \
 
 /*
  * Iterate forward over the elements list. The list elements can be
  * removed from the list while doing this.
  */
 #define cds_list_for_each_safe(pos, p, head) \
-       for (pos = (head)->next, p = pos->next; \
-               pos != (head); \
-               pos = p, p = pos->next)
+       for (pos = (head)->next, p = (pos)->next; \
+               (pos) != (head); \
+               pos = (p), p = (pos)->next)
 
 /* Iterate backward over the elements of the list. */
 #define cds_list_for_each_prev(pos, head) \
 
 /* Iterate backward over the elements of the list. */
 #define cds_list_for_each_prev(pos, head) \
-       for (pos = (head)->prev; pos != (head); pos = pos->prev)
+       for (pos = (head)->prev; (pos) != (head); pos = (pos)->prev)
 
 /*
  * Iterate backwards over the elements list. The list elements can be
  * removed from the list while doing this.
  */
 #define cds_list_for_each_prev_safe(pos, p, head) \
 
 /*
  * Iterate backwards over the elements list. The list elements can be
  * removed from the list while doing this.
  */
 #define cds_list_for_each_prev_safe(pos, p, head) \
-       for (pos = (head)->prev, p = pos->prev; \
-               pos != (head); \
-               pos = p, p = pos->prev)
+       for (pos = (head)->prev, p = (pos)->prev; \
+               (pos) != (head); \
+               pos = (p), p = (pos)->prev)
 
 #define cds_list_for_each_entry(pos, head, member) \
 
 #define cds_list_for_each_entry(pos, head, member) \
-       for (pos = cds_list_entry((head)->next, __typeof__(*pos), member); \
-               &pos->member != (head); \
-               pos = cds_list_entry(pos->member.next, __typeof__(*pos), member))
+       for (pos = cds_list_entry((head)->next, __typeof__(*(pos)), member); \
+               &(pos)->member != (head); \
+               pos = cds_list_entry((pos)->member.next, __typeof__(*(pos)), member))
 
 #define cds_list_for_each_entry_reverse(pos, head, member) \
 
 #define cds_list_for_each_entry_reverse(pos, head, member) \
-       for (pos = cds_list_entry((head)->prev, __typeof__(*pos), member); \
-               &pos->member != (head); \
-               pos = cds_list_entry(pos->member.prev, __typeof__(*pos), member))
+       for (pos = cds_list_entry((head)->prev, __typeof__(*(pos)), member); \
+               &(pos)->member != (head); \
+               pos = cds_list_entry((pos)->member.prev, __typeof__(*(pos)), member))
 
 #define cds_list_for_each_entry_safe(pos, p, head, member) \
 
 #define cds_list_for_each_entry_safe(pos, p, head, member) \
-       for (pos = cds_list_entry((head)->next, __typeof__(*pos), member), \
-                       p = cds_list_entry(pos->member.next, __typeof__(*pos), member); \
-               &pos->member != (head); \
-               pos = p, p = cds_list_entry(pos->member.next, __typeof__(*pos), member))
+       for (pos = cds_list_entry((head)->next, __typeof__(*(pos)), member), \
+                       p = cds_list_entry((pos)->member.next, __typeof__(*(pos)), member); \
+               &(pos)->member != (head); \
+               pos = (p), p = cds_list_entry((pos)->member.next, __typeof__(*(pos)), member))
 
 /*
  * Same as cds_list_for_each_entry_safe, but starts from "pos" which should
  * point to an entry within the list.
  */
 #define cds_list_for_each_entry_safe_from(pos, p, head, member) \
 
 /*
  * Same as cds_list_for_each_entry_safe, but starts from "pos" which should
  * point to an entry within the list.
  */
 #define cds_list_for_each_entry_safe_from(pos, p, head, member) \
-        for (p = cds_list_entry(pos->member.next, __typeof__(*pos), member); \
-                &pos->member != (head); \
-                pos = p, p = cds_list_entry(pos->member.next, __typeof__(*pos), member))
+        for (p = cds_list_entry((pos)->member.next, __typeof__(*(pos)), member); \
+                &(pos)->member != (head); \
+                pos = (p), p = cds_list_entry((pos)->member.next, __typeof__(*(pos)), member))
 
 static inline
 int cds_list_empty(struct cds_list_head *head)
 
 static inline
 int cds_list_empty(struct cds_list_head *head)
index 76d5464f8eda3293f8ca6c3867c523f363ead125..9ab1219d027deb33048c0096f1ca3b405930585b 100644 (file)
@@ -1,31 +1,17 @@
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * map/urcu-clear.h
- *
  * Userspace RCU header -- name mapping to allow multiple flavors to be
  * used in the same executable.
  *
  * Userspace RCU header -- name mapping to allow multiple flavors to be
  * used in the same executable.
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
  * LGPL-compatible code should include this header with :
  *
  * #undef _LGPL_SOURCE
  * #include <urcu.h>
  *
  * LGPL-compatible code should include this header with :
  *
  * #undef _LGPL_SOURCE
  * #include <urcu.h>
  *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 #undef urcu_register_rculfhash_atfork
 #undef urcu_unregister_rculfhash_atfork
 
 #undef urcu_register_rculfhash_atfork
 #undef urcu_unregister_rculfhash_atfork
 
-/* Aliases for ABI(6) compat */
-
-#undef alias_rcu_flavor
-
-/* src/urcu.c */
-#undef alias_rcu_read_lock
-#undef alias_rcu_read_unlock
-#undef alias_rcu_read_ongoing
-#undef alias_rcu_register_thread
-#undef alias_rcu_unregister_thread
-#undef alias_rcu_init
-#undef alias_rcu_exit
-#undef alias_synchronize_rcu
-#undef alias_rcu_reader
-#undef alias_rcu_gp
-
-/* src/urcu-call-rcu-impl.h */
-#undef alias_get_cpu_call_rcu_data
-#undef alias_get_call_rcu_thread
-#undef alias_create_call_rcu_data
-#undef alias_set_cpu_call_rcu_data
-#undef alias_get_default_call_rcu_data
-#undef alias_get_call_rcu_data
-#undef alias_get_thread_call_rcu_data
-#undef alias_set_thread_call_rcu_data
-#undef alias_create_all_cpu_call_rcu_data
-#undef alias_free_all_cpu_call_rcu_data
-#undef alias_call_rcu
-#undef alias_call_rcu_data_free
-#undef alias_call_rcu_before_fork
-#undef alias_call_rcu_after_fork_parent
-#undef alias_call_rcu_after_fork_child
-#undef alias_rcu_barrier
-
-#undef alias_urcu_register_rculfhash_atfork
-#undef alias_urcu_unregister_rculfhash_atfork
-
-/* src/urcu-defer-impl.h */
-#undef alias_defer_rcu
-#undef alias_rcu_defer_register_thread
-#undef alias_rcu_defer_unregister_thread
-#undef alias_rcu_defer_barrier
-#undef alias_rcu_defer_barrier_thread
-#undef alias_rcu_defer_exit
+#undef start_poll_synchronize_rcu
+#undef poll_state_synchronize_rcu
index a80005f85162f53dd0b58e37fff57cda1a5240d0..da7a5ebd9adef018c70d148b7f7503e5faba64b9 100644 (file)
@@ -1,31 +1,17 @@
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * urcu/map/urcu-bp.h
- *
  * Userspace RCU header -- name mapping to allow multiple flavors to be
  * used in the same executable.
  *
  * Userspace RCU header -- name mapping to allow multiple flavors to be
  * used in the same executable.
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
  * LGPL-compatible code should include this header with :
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
  * LGPL-compatible code should include this header with :
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 #define urcu_unregister_rculfhash_atfork       \
                urcu_bp_unregister_rculfhash_atfork
 
 #define urcu_unregister_rculfhash_atfork       \
                urcu_bp_unregister_rculfhash_atfork
 
-
-/* Aliases for ABI(6) compat */
-
-#define alias_rcu_flavor               rcu_flavor_bp
-
-#define alias_get_cpu_call_rcu_data    get_cpu_call_rcu_data_bp
-#define alias_get_call_rcu_thread      get_call_rcu_thread_bp
-#define alias_create_call_rcu_data     create_call_rcu_data_bp
-#define alias_set_cpu_call_rcu_data    set_cpu_call_rcu_data_bp
-#define alias_get_default_call_rcu_data        get_default_call_rcu_data_bp
-#define alias_get_call_rcu_data                get_call_rcu_data_bp
-#define alias_get_thread_call_rcu_data get_thread_call_rcu_data_bp
-#define alias_set_thread_call_rcu_data set_thread_call_rcu_data_bp
-#define alias_create_all_cpu_call_rcu_data     \
-               create_all_cpu_call_rcu_data_bp
-#define alias_free_all_cpu_call_rcu_data       \
-               free_all_cpu_call_rcu_data_bp
-#define alias_call_rcu                 call_rcu_bp
-#define alias_call_rcu_data_free       call_rcu_data_free_bp
-#define alias_call_rcu_before_fork     call_rcu_before_fork_bp
-#define alias_call_rcu_after_fork_parent       \
-               call_rcu_after_fork_parent_bp
-#define alias_call_rcu_after_fork_child        call_rcu_after_fork_child_bp
-#define alias_rcu_barrier              rcu_barrier_bp
-
-#define alias_defer_rcu                        defer_rcu_bp
-#define alias_rcu_defer_register_thread        rcu_defer_register_thread_bp
-#define alias_rcu_defer_unregister_thread      \
-               rcu_defer_unregister_thread_bp
-#define alias_rcu_defer_barrier                rcu_defer_barrier_bp
-#define alias_rcu_defer_barrier_thread rcu_defer_barrier_thread_bp
-#define alias_rcu_defer_exit           rcu_defer_exit_bp
-
-#define alias_urcu_register_rculfhash_atfork   \
-               urcu_register_rculfhash_atfork_bp
-#define alias_urcu_unregister_rculfhash_atfork \
-               urcu_unregister_rculfhash_atfork_bp
+#define start_poll_synchronize_rcu     urcu_bp_start_poll_synchronize_rcu
+#define poll_state_synchronize_rcu     urcu_bp_poll_state_synchronize_rcu
 
 
 /* Compat identifiers for prior undocumented multiflavor usage */
 
 
 /* Compat identifiers for prior undocumented multiflavor usage */
index 970513abaa885fc17a970a80e042eb41b71054c2..1f1147fe5f8c6032ab58914e6d70fd9db7018430 100644 (file)
@@ -1,31 +1,17 @@
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * urcu/map/urcu-mb.h
- *
  * Userspace RCU header -- name mapping to allow multiple flavors to be
  * used in the same executable.
  *
  * Userspace RCU header -- name mapping to allow multiple flavors to be
  * used in the same executable.
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
  * LGPL-compatible code should include this header with :
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
  * LGPL-compatible code should include this header with :
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 #define urcu_unregister_rculfhash_atfork       \
                urcu_mb_unregister_rculfhash_atfork
 
 #define urcu_unregister_rculfhash_atfork       \
                urcu_mb_unregister_rculfhash_atfork
 
-
-/* Aliases for ABI(6) compat */
-
-#define alias_rcu_flavor               rcu_flavor_mb
-
-/* src/urcu.c */
-#define alias_rcu_read_lock            rcu_read_lock_mb
-#define alias_rcu_read_unlock          rcu_read_unlock_mb
-#define alias_rcu_read_ongoing         rcu_read_ongoing_mb
-#define alias_rcu_register_thread      rcu_register_thread_mb
-#define alias_rcu_unregister_thread    rcu_unregister_thread_mb
-#define alias_rcu_init                 rcu_init_mb
-#define alias_synchronize_rcu          synchronize_rcu_mb
-#define alias_rcu_reader               rcu_reader_mb
-#define alias_rcu_gp                   rcu_gp_mb
-
-/* src/urcu-call-rcu-impl.h */
-#define alias_get_cpu_call_rcu_data    get_cpu_call_rcu_data_mb
-#define alias_get_call_rcu_thread      get_call_rcu_thread_mb
-#define alias_create_call_rcu_data     create_call_rcu_data_mb
-#define alias_set_cpu_call_rcu_data    set_cpu_call_rcu_data_mb
-#define alias_get_default_call_rcu_data        get_default_call_rcu_data_mb
-#define alias_get_call_rcu_data                get_call_rcu_data_mb
-#define alias_get_thread_call_rcu_data get_thread_call_rcu_data_mb
-#define alias_set_thread_call_rcu_data set_thread_call_rcu_data_mb
-#define alias_create_all_cpu_call_rcu_data     \
-               create_all_cpu_call_rcu_data_mb
-#define alias_free_all_cpu_call_rcu_data       \
-               free_all_cpu_call_rcu_data_mb
-#define alias_call_rcu                 call_rcu_mb
-#define alias_call_rcu_data_free       call_rcu_data_free_mb
-#define alias_call_rcu_before_fork     call_rcu_before_fork_mb
-#define alias_call_rcu_after_fork_parent       \
-               call_rcu_after_fork_parent_mb
-#define alias_call_rcu_after_fork_child        call_rcu_after_fork_child_mb
-#define alias_rcu_barrier              rcu_barrier_mb
-
-#define alias_urcu_register_rculfhash_atfork   \
-               urcu_register_rculfhash_atfork_mb
-#define alias_urcu_unregister_rculfhash_atfork \
-               urcu_unregister_rculfhash_atfork_mb
-
-/* src/urcu-defer-impl.h */
-#define alias_defer_rcu                        defer_rcu_mb
-#define alias_rcu_defer_register_thread        rcu_defer_register_thread_mb
-#define alias_rcu_defer_unregister_thread      \
-               rcu_defer_unregister_thread_mb
-#define alias_rcu_defer_barrier                rcu_defer_barrier_mb
-#define alias_rcu_defer_barrier_thread rcu_defer_barrier_thread_mb
-#define alias_rcu_defer_exit           rcu_defer_exit_mb
+#define start_poll_synchronize_rcu     urcu_mb_start_poll_synchronize_rcu
+#define poll_state_synchronize_rcu     urcu_mb_poll_state_synchronize_rcu
 
 
 /* Compat identifiers for prior undocumented multiflavor usage */
 
 
 /* Compat identifiers for prior undocumented multiflavor usage */
index 902bb6fffc28cc4b6f6fae9e4bce21f86f153abb..9ae4279692842a34aeb31bfeb83d7c0ae7a3af35 100644 (file)
@@ -1,31 +1,17 @@
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * urcu/map/urcu-memb.h
- *
  * Userspace RCU header -- name mapping to allow multiple flavors to be
  * used in the same executable.
  *
  * Userspace RCU header -- name mapping to allow multiple flavors to be
  * used in the same executable.
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
  * LGPL-compatible code should include this header with :
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
  * LGPL-compatible code should include this header with :
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 #define urcu_unregister_rculfhash_atfork       \
                urcu_memb_unregister_rculfhash_atfork
 
 #define urcu_unregister_rculfhash_atfork       \
                urcu_memb_unregister_rculfhash_atfork
 
-
-/* Aliases for ABI(6) compat */
-
-#define alias_rcu_flavor               rcu_flavor_memb
-
-/* src/urcu.c */
-#define alias_rcu_read_lock            rcu_read_lock_memb
-#define alias_rcu_read_unlock          rcu_read_unlock_memb
-#define alias_rcu_read_ongoing         rcu_read_ongoing_memb
-#define alias_rcu_register_thread      rcu_register_thread_memb
-#define alias_rcu_unregister_thread    rcu_unregister_thread_memb
-#define alias_rcu_init                 rcu_init_memb
-#define alias_synchronize_rcu          synchronize_rcu_memb
-#define alias_rcu_reader               rcu_reader_memb
-#define alias_rcu_gp                   rcu_gp_memb
-
-/* src/urcu-call-rcu-impl.h */
-#define alias_get_cpu_call_rcu_data    get_cpu_call_rcu_data_memb
-#define alias_get_call_rcu_thread      get_call_rcu_thread_memb
-#define alias_create_call_rcu_data     create_call_rcu_data_memb
-#define alias_set_cpu_call_rcu_data    set_cpu_call_rcu_data_memb
-#define alias_get_default_call_rcu_data        get_default_call_rcu_data_memb
-#define alias_get_call_rcu_data                get_call_rcu_data_memb
-#define alias_get_thread_call_rcu_data get_thread_call_rcu_data_memb
-#define alias_set_thread_call_rcu_data set_thread_call_rcu_data_memb
-#define alias_create_all_cpu_call_rcu_data     \
-               create_all_cpu_call_rcu_data_memb
-#define alias_free_all_cpu_call_rcu_data       \
-               free_all_cpu_call_rcu_data_memb
-#define alias_call_rcu                 call_rcu_memb
-#define alias_call_rcu_data_free       call_rcu_data_free_memb
-#define alias_call_rcu_before_fork     call_rcu_before_fork_memb
-#define alias_call_rcu_after_fork_parent       \
-               call_rcu_after_fork_parent_memb
-#define alias_call_rcu_after_fork_child        call_rcu_after_fork_child_memb
-#define alias_rcu_barrier              rcu_barrier_memb
-
-#define alias_urcu_register_rculfhash_atfork   \
-               urcu_register_rculfhash_atfork_memb
-#define alias_urcu_unregister_rculfhash_atfork \
-               urcu_unregister_rculfhash_atfork_memb
-
-/* src/urcu-defer-impl.h */
-#define alias_defer_rcu                        defer_rcu_memb
-#define alias_rcu_defer_register_thread        rcu_defer_register_thread_memb
-#define alias_rcu_defer_unregister_thread      \
-               rcu_defer_unregister_thread_memb
-#define alias_rcu_defer_barrier                rcu_defer_barrier_memb
-#define alias_rcu_defer_barrier_thread rcu_defer_barrier_thread_memb
-#define alias_rcu_defer_exit           rcu_defer_exit_memb
+#define start_poll_synchronize_rcu     urcu_memb_start_poll_synchronize_rcu
+#define poll_state_synchronize_rcu     urcu_memb_poll_state_synchronize_rcu
 
 
 /* Compat identifiers for prior undocumented multiflavor usage */
 
 
 /* Compat identifiers for prior undocumented multiflavor usage */
index 6486da0566c3e6081591abb869bc6814549a738f..d177fc53eebd78488020f22378015981a2560f93 100644 (file)
@@ -1,31 +1,17 @@
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * urcu/map/urcu-qsbr.h
- *
  * Userspace RCU header -- name mapping to allow multiple flavors to be
  * used in the same executable.
  *
  * Userspace RCU header -- name mapping to allow multiple flavors to be
  * used in the same executable.
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
  * LGPL-compatible code should include this header with :
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
  * LGPL-compatible code should include this header with :
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 #define urcu_unregister_rculfhash_atfork       \
                urcu_qsbr_unregister_rculfhash_atfork
 
 #define urcu_unregister_rculfhash_atfork       \
                urcu_qsbr_unregister_rculfhash_atfork
 
-/* Aliases for ABI(6) compat */
-
-#define alias_rcu_flavor               rcu_flavor_qsbr
-
-/* src/urcu.c */
-#define alias_rcu_read_lock            rcu_read_lock_qsbr
-#define alias_rcu_read_unlock          rcu_read_unlock_qsbr
-#define alias_rcu_read_ongoing         rcu_read_ongoing_qsbr
-#define alias_rcu_register_thread      rcu_register_thread_qsbr
-#define alias_rcu_unregister_thread    rcu_unregister_thread_qsbr
-#define alias_rcu_init                 rcu_init_qsbr
-#define alias_synchronize_rcu          synchronize_rcu_qsbr
-#define alias_rcu_reader               rcu_reader_qsbr
-#define alias_rcu_gp                   rcu_gp_qsbr
-
-/* src/urcu-call-rcu-impl.h */
-#define alias_get_cpu_call_rcu_data    get_cpu_call_rcu_data_qsbr
-#define alias_get_call_rcu_thread      get_call_rcu_thread_qsbr
-#define alias_create_call_rcu_data     create_call_rcu_data_qsbr
-#define alias_set_cpu_call_rcu_data    set_cpu_call_rcu_data_qsbr
-#define alias_get_default_call_rcu_data        get_default_call_rcu_data_qsbr
-#define alias_get_call_rcu_data                get_call_rcu_data_qsbr
-#define alias_get_thread_call_rcu_data get_thread_call_rcu_data_qsbr
-#define alias_set_thread_call_rcu_data set_thread_call_rcu_data_qsbr
-#define alias_create_all_cpu_call_rcu_data     \
-               create_all_cpu_call_rcu_data_qsbr
-#define alias_free_all_cpu_call_rcu_data       \
-               free_all_cpu_call_rcu_data_qsbr
-#define alias_call_rcu                 call_rcu_qsbr
-#define alias_call_rcu_data_free       call_rcu_data_free_qsbr
-#define alias_call_rcu_before_fork     call_rcu_before_fork_qsbr
-#define alias_call_rcu_after_fork_parent       \
-               call_rcu_after_fork_parent_qsbr
-#define alias_call_rcu_after_fork_child        call_rcu_after_fork_child_qsbr
-#define alias_rcu_barrier              rcu_barrier_qsbr
-
-#define alias_urcu_register_rculfhash_atfork   \
-               urcu_register_rculfhash_atfork_qsbr
-#define alias_urcu_unregister_rculfhash_atfork \
-               urcu_unregister_rculfhash_atfork_qsbr
-
-/* src/urcu-defer-impl.h */
-#define alias_defer_rcu                        defer_rcu_qsbr
-#define alias_rcu_defer_register_thread        rcu_defer_register_thread_qsbr
-#define alias_rcu_defer_unregister_thread      \
-               rcu_defer_unregister_thread_qsbr
-#define alias_rcu_defer_barrier                rcu_defer_barrier_qsbr
-#define alias_rcu_defer_barrier_thread rcu_defer_barrier_thread_qsbr
-#define alias_rcu_defer_exit           rcu_defer_exit_qsbr
+#define start_poll_synchronize_rcu     urcu_qsbr_start_poll_synchronize_rcu
+#define poll_state_synchronize_rcu     urcu_qsbr_poll_state_synchronize_rcu
 
 
 /* Compat identifiers for prior undocumented multiflavor usage */
 
 
 /* Compat identifiers for prior undocumented multiflavor usage */
diff --git a/include/urcu/map/urcu-signal.h b/include/urcu/map/urcu-signal.h
deleted file mode 100644 (file)
index 3665541..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * urcu/map/urcu-signal.h
- *
- * Userspace RCU header -- name mapping to allow multiple flavors to be
- * used in the same executable.
- *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * LGPL-compatible code should include this header with :
- *
- * #define _LGPL_SOURCE
- * #include <urcu.h>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * IBM's contributions to this file may be relicensed under LGPLv2 or later.
- */
-
-#define rcu_read_lock                  urcu_signal_read_lock
-#define _rcu_read_lock                 _urcu_signal_read_lock
-#define rcu_read_unlock                        urcu_signal_read_unlock
-#define _rcu_read_unlock               _urcu_signal_read_unlock
-#define rcu_read_ongoing               urcu_signal_read_ongoing
-#define _rcu_read_ongoing              _urcu_signal_read_ongoing
-#define rcu_quiescent_state            urcu_signal_quiescent_state
-#define _rcu_quiescent_state           _urcu_signal_quiescent_state
-#define rcu_thread_offline             urcu_signal_thread_offline
-#define rcu_thread_online              urcu_signal_thread_online
-#define rcu_register_thread            urcu_signal_register_thread
-#define rcu_unregister_thread          urcu_signal_unregister_thread
-#define rcu_init                       urcu_signal_init
-#define rcu_exit                       urcu_signal_exit
-#define synchronize_rcu                        urcu_signal_synchronize_rcu
-#define rcu_reader                     urcu_signal_reader
-#define rcu_gp                         urcu_signal_gp
-
-#define get_cpu_call_rcu_data          urcu_signal_get_cpu_call_rcu_data
-#define get_call_rcu_thread            urcu_signal_get_call_rcu_thread
-#define create_call_rcu_data           urcu_signal_create_call_rcu_data
-#define set_cpu_call_rcu_data          urcu_signal_set_cpu_call_rcu_data
-#define get_default_call_rcu_data      urcu_signal_get_default_call_rcu_data
-#define get_call_rcu_data              urcu_signal_get_call_rcu_data
-#define get_thread_call_rcu_data       urcu_signal_get_thread_call_rcu_data
-#define set_thread_call_rcu_data       urcu_signal_set_thread_call_rcu_data
-#define create_all_cpu_call_rcu_data   urcu_signal_create_all_cpu_call_rcu_data
-#define free_all_cpu_call_rcu_data     urcu_signal_free_all_cpu_call_rcu_data
-#define call_rcu                       urcu_signal_call_rcu
-#define call_rcu_data_free             urcu_signal_call_rcu_data_free
-#define call_rcu_before_fork           urcu_signal_call_rcu_before_fork
-#define call_rcu_after_fork_parent     urcu_signal_call_rcu_after_fork_parent
-#define call_rcu_after_fork_child      urcu_signal_call_rcu_after_fork_child
-#define rcu_barrier                    urcu_signal_barrier
-
-#define defer_rcu                      urcu_signal_defer_rcu
-#define rcu_defer_register_thread      urcu_signal_defer_register_thread
-#define rcu_defer_unregister_thread    urcu_signal_defer_unregister_thread
-#define rcu_defer_barrier              urcu_signal_defer_barrier
-#define rcu_defer_barrier_thread       urcu_signal_defer_barrier_thread
-#define rcu_defer_exit                 urcu_signal_defer_exit
-
-#define rcu_flavor                     urcu_signal_flavor
-
-#define urcu_register_rculfhash_atfork         \
-               urcu_signal_register_rculfhash_atfork
-#define urcu_unregister_rculfhash_atfork       \
-               urcu_signal_unregister_rculfhash_atfork
-
-
-/* Aliases for ABI(6) compat */
-
-#define alias_rcu_flavor               rcu_flavor_sig
-
-/* src/urcu.c */
-#define alias_rcu_read_lock            rcu_read_lock_sig
-#define alias_rcu_read_unlock          rcu_read_unlock_sig
-#define alias_rcu_read_ongoing         rcu_read_ongoing_sig
-#define alias_rcu_register_thread      rcu_register_thread_sig
-#define alias_rcu_unregister_thread    rcu_unregister_thread_sig
-#define alias_rcu_init                 rcu_init_sig
-#define alias_rcu_exit                 rcu_exit_sig
-#define alias_synchronize_rcu          synchronize_rcu_sig
-#define alias_rcu_reader               rcu_reader_sig
-#define alias_rcu_gp                   rcu_gp_sig
-
-/* src/urcu-call-rcu-impl.h */
-#define alias_get_cpu_call_rcu_data    get_cpu_call_rcu_data_sig
-#define alias_get_call_rcu_thread      get_call_rcu_thread_sig
-#define alias_create_call_rcu_data     create_call_rcu_data_sig
-#define alias_set_cpu_call_rcu_data    set_cpu_call_rcu_data_sig
-#define alias_get_default_call_rcu_data        get_default_call_rcu_data_sig
-#define alias_get_call_rcu_data                get_call_rcu_data_sig
-#define alias_get_thread_call_rcu_data get_thread_call_rcu_data_sig
-#define alias_set_thread_call_rcu_data set_thread_call_rcu_data_sig
-#define alias_create_all_cpu_call_rcu_data     \
-               create_all_cpu_call_rcu_data_sig
-#define alias_free_all_cpu_call_rcu_data       \
-               free_all_cpu_call_rcu_data_sig
-#define alias_call_rcu                 call_rcu_sig
-#define alias_call_rcu_data_free       call_rcu_data_free_sig
-#define alias_call_rcu_before_fork     call_rcu_before_fork_sig
-#define alias_call_rcu_after_fork_parent       \
-               call_rcu_after_fork_parent_sig
-#define alias_call_rcu_after_fork_child        call_rcu_after_fork_child_sig
-#define alias_rcu_barrier              rcu_barrier_sig
-
-#define alias_urcu_register_rculfhash_atfork   \
-               urcu_register_rculfhash_atfork_sig
-#define alias_urcu_unregister_rculfhash_atfork \
-               urcu_unregister_rculfhash_atfork_sig
-
-/* src/urcu-defer-impl.h */
-#define alias_defer_rcu                        defer_rcu_sig
-#define alias_rcu_defer_register_thread        rcu_defer_register_thread_sig
-#define alias_rcu_defer_unregister_thread      \
-               rcu_defer_unregister_thread_sig
-#define alias_rcu_defer_barrier                rcu_defer_barrier_sig
-#define alias_rcu_defer_barrier_thread rcu_defer_barrier_thread_sig
-#define alias_rcu_defer_exit           rcu_defer_exit_sig
-
-
-/* Compat identifiers for prior undocumented multiflavor usage */
-#ifndef URCU_NO_COMPAT_IDENTIFIERS
-
-#define rcu_dereference_sig            urcu_signal_dereference
-#define rcu_cmpxchg_pointer_sig                urcu_signal_cmpxchg_pointer
-#define rcu_xchg_pointer_sig           urcu_signal_xchg_pointer
-#define rcu_set_pointer_sig            urcu_signal_set_pointer
-
-#define rcu_sig_before_fork            urcu_signal_before_fork
-#define rcu_sig_after_fork_parent      urcu_signal_after_fork_parent
-#define rcu_sig_after_fork_child       urcu_signal_after_fork_child
-
-#define rcu_read_lock_sig              urcu_signal_read_lock
-#define _rcu_read_lock_sig             _urcu_signal_read_lock
-#define rcu_read_unlock_sig            urcu_signal_read_unlock
-#define _rcu_read_unlock_sig           _urcu_signal_read_unlock
-#define rcu_read_ongoing_sig           urcu_signal_read_ongoing
-#define _rcu_read_ongoing_sig          _urcu_signal_read_ongoing
-#define rcu_register_thread_sig                urcu_signal_register_thread
-#define rcu_unregister_thread_sig      urcu_signal_unregister_thread
-#define rcu_init_sig                   urcu_signal_init
-#define rcu_exit_sig                   urcu_signal_exit
-#define synchronize_rcu_sig            urcu_signal_synchronize_rcu
-#define rcu_reader_sig                 urcu_signal_reader
-#define rcu_gp_sig                     urcu_signal_gp
-
-#define get_cpu_call_rcu_data_sig      urcu_signal_get_cpu_call_rcu_data
-#define get_call_rcu_thread_sig                urcu_signal_get_call_rcu_thread
-#define create_call_rcu_data_sig       urcu_signal_create_call_rcu_data
-#define set_cpu_call_rcu_data_sig      urcu_signal_set_cpu_call_rcu_data
-#define get_default_call_rcu_data_sig  urcu_signal_get_default_call_rcu_data
-#define get_call_rcu_data_sig          urcu_signal_get_call_rcu_data
-#define get_thread_call_rcu_data_sig   urcu_signal_get_thread_call_rcu_data
-#define set_thread_call_rcu_data_sig   urcu_signal_set_thread_call_rcu_data
-#define create_all_cpu_call_rcu_data_sig       \
-               urcu_signal_create_all_cpu_call_rcu_data
-#define free_all_cpu_call_rcu_data_sig urcu_signal_free_all_cpu_call_rcu_data
-#define call_rcu_sig                   urcu_signal_call_rcu
-#define call_rcu_data_free_sig         urcu_signal_call_rcu_data_free
-#define call_rcu_before_fork_sig               \
-               urcu_signal_call_rcu_before_fork
-#define call_rcu_after_fork_parent_sig urcu_signal_call_rcu_after_fork_parent
-#define call_rcu_after_fork_child_sig  urcu_signal_call_rcu_after_fork_child
-#define rcu_barrier_sig                        urcu_signal_barrier
-
-#define defer_rcu_sig                  urcu_signal_defer_rcu
-#define rcu_defer_register_thread_sig  urcu_signal_defer_register_thread
-#define rcu_defer_unregister_thread_sig        urcu_signal_defer_unregister_thread
-#define rcu_defer_barrier_sig          urcu_signal_defer_barrier
-#define rcu_defer_barrier_thread_sig   urcu_signal_defer_barrier_thread
-#define rcu_defer_exit_sig             urcu_signal_defer_exit
-
-#define rcu_flavor_sig                 urcu_signal_flavor
-
-#define urcu_register_rculfhash_atfork_sig     \
-               urcu_signal_register_rculfhash_atfork
-#define urcu_unregister_rculfhash_atfork_sig   \
-               urcu_signal_unregister_rculfhash_atfork
-
-#endif /* URCU_NO_COMPAT_IDENTIFIERS */
index a2fb7c8a21c41e9c37ad6f9b78be3c4e783ccae3..96c53472f5e60d3c9051b943493dd2590e90c2ad 100644 (file)
@@ -1,38 +1,22 @@
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * urcu-map.h
- *
  * Userspace RCU header -- name mapping to allow multiple flavors to be
  * used in the same executable.
  *
  * Userspace RCU header -- name mapping to allow multiple flavors to be
  * used in the same executable.
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
  * LGPL-compatible code should include this header with :
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
  * LGPL-compatible code should include this header with :
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 #ifdef RCU_MEMBARRIER
 #include <urcu/map/urcu-memb.h>
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 #ifdef RCU_MEMBARRIER
 #include <urcu/map/urcu-memb.h>
-#elif defined(RCU_SIGNAL)
-#include <urcu/map/urcu-signal.h>
 #elif defined(RCU_MB)
 #include <urcu/map/urcu-mb.h>
 #else
 #elif defined(RCU_MB)
 #include <urcu/map/urcu-mb.h>
 #else
index a6702723d611f4c2a96a57f9c8155b07fbc51752..cc9aeae38bfedd2f5d7de27e0f08d42453f12155 100644 (file)
@@ -1,28 +1,14 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_POINTER_H
 #define _URCU_POINTER_H
 
 /*
 #ifndef _URCU_POINTER_H
 #define _URCU_POINTER_H
 
 /*
- * urcu/pointer.h
- *
  * Userspace RCU header. Operations on pointers.
  *
  * Userspace RCU header. Operations on pointers.
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
index 69c4d3184fd50d7f38a730e17447678f5fec3991..6dab12a8d062c11caef89d60cd901cdd247c604f 100644 (file)
@@ -1,25 +1,12 @@
+// SPDX-FileCopyrightText: 2002 Free Software Foundation, Inc.
+// SPDX-FileCopyrightText: 2009 Pierre-Marc Fournier
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * Copyright (C) 2002 Free Software Foundation, Inc.
  * (originally part of the GNU C Library)
  * Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
  * (originally part of the GNU C Library)
  * Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
- *
- * Copyright (C) 2009 Pierre-Marc Fournier
- * Conversion to RCU list.
- * Copyright (C) 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #ifndef _URCU_RCUHLIST_H
  */
 
 #ifndef _URCU_RCUHLIST_H
@@ -55,8 +42,8 @@ void cds_hlist_del_rcu(struct cds_hlist_node *elem)
  * This must be done while rcu_read_lock() is held.
  */
 #define cds_hlist_for_each_rcu(pos, head) \
  * This must be done while rcu_read_lock() is held.
  */
 #define cds_hlist_for_each_rcu(pos, head) \
-       for (pos = rcu_dereference((head)->next); pos != NULL; \
-               pos = rcu_dereference(pos->next))
+       for (pos = rcu_dereference((head)->next); (pos) != NULL; \
+               pos = rcu_dereference((pos)->next))
 
 /*
  * cds_hlist_for_each_entry_rcu takes 4 arguments, while the Linux
 
 /*
  * cds_hlist_for_each_entry_rcu takes 4 arguments, while the Linux
@@ -66,16 +53,16 @@ void cds_hlist_del_rcu(struct cds_hlist_node *elem)
  */
 #define cds_hlist_for_each_entry_rcu(entry, pos, head, member) \
        for (pos = rcu_dereference((head)->next), \
  */
 #define cds_hlist_for_each_entry_rcu(entry, pos, head, member) \
        for (pos = rcu_dereference((head)->next), \
-                       entry = cds_hlist_entry(pos, __typeof__(*entry), member); \
-               pos != NULL; \
-               pos = rcu_dereference(pos->next), \
-                       entry = cds_hlist_entry(pos, __typeof__(*entry), member))
+                       entry = cds_hlist_entry(pos, __typeof__(*(entry)), member); \
+               (pos) != NULL; \
+               pos = rcu_dereference((pos)->next), \
+                       entry = cds_hlist_entry(pos, __typeof__(*(entry)), member))
 
 #define cds_hlist_for_each_entry_rcu_2(entry, head, member) \
 
 #define cds_hlist_for_each_entry_rcu_2(entry, head, member) \
-       for (entry = cds_hlist_entry(rcu_dereference((head)->next), \
-                       __typeof__(*entry), member); \
-               &entry->member != NULL; \
-               entry = cds_hlist_entry(rcu_dereference(entry->member.next), \
-                       __typeof__(*entry), member))
+       for (entry = cds_hlist_entry_safe(rcu_dereference((head)->next), \
+                       __typeof__(*(entry)), member); \
+               (entry) != NULL; \
+               entry = cds_hlist_entry_safe(rcu_dereference((entry)->member.next), \
+                       __typeof__(*(entry)), member))
 
 #endif /* _URCU_RCUHLIST_H */
 
 #endif /* _URCU_RCUHLIST_H */
index 20b822fa8dddc572c5e114c31a1963f4ed499be3..e0f4b351fc9b027a32ecee2c1e8a958b3ce21b2f 100644 (file)
@@ -1,28 +1,14 @@
+// SPDX-FileCopyrightText: 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2011 Lai Jiangshan <laijs@cn.fujitsu.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_RCULFHASH_H
 #define _URCU_RCULFHASH_H
 
 /*
 #ifndef _URCU_RCULFHASH_H
 #define _URCU_RCULFHASH_H
 
 /*
- * urcu/rculfhash.h
- *
  * Userspace RCU library - Lock-Free RCU Hash Table
  *
  * Userspace RCU library - Lock-Free RCU Hash Table
  *
- * Copyright 2011 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright 2011 - Lai Jiangshan <laijs@cn.fujitsu.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * For use with URCU_API_MAP (API mapping of liburcu), include this file
  * _after_ including your URCU flavor.
  */
  * For use with URCU_API_MAP (API mapping of liburcu), include this file
  * _after_ including your URCU flavor.
  */
@@ -82,6 +68,18 @@ struct cds_lfht_iter {
 #endif
 };
 
 #endif
 };
 
+/*
+ * cds_lfht_alloc: Callbacks if we want to use custom memory allocator.
+ */
+struct cds_lfht_alloc {
+       void *(*malloc)(void *state, size_t size);
+       void *(*calloc)(void *state, size_t nmemb, size_t size);
+       void *(*realloc)(void *state, void *ptr, size_t size);
+       void *(*aligned_alloc)(void *state, size_t alignment, size_t size);
+       void  (*free)(void *state, void *ptr);
+       void  *state;
+};
+
 static inline
 struct cds_lfht_node *cds_lfht_iter_get_node(struct cds_lfht_iter *iter)
 {
 static inline
 struct cds_lfht_node *cds_lfht_iter_get_node(struct cds_lfht_iter *iter)
 {
@@ -105,10 +103,20 @@ typedef int (*cds_lfht_match_fct)(struct cds_lfht_node *node, const void *key);
  * (detection of memory corruption).
  */
 static inline
  * (detection of memory corruption).
  */
 static inline
-void cds_lfht_node_init(struct cds_lfht_node *node)
+void cds_lfht_node_init(struct cds_lfht_node *node __attribute__((unused)))
 {
 }
 
 {
 }
 
+/*
+ * cds_lfht_node_init_deleted - initialize a hash table node to "removed" state
+ * @node: the node to initialize.
+ *
+ * Initialize the node such that cds_lfht_is_node_deleted() can be used
+ * on the node before it is added to a hash table.
+ */
+extern
+void cds_lfht_node_init_deleted(struct cds_lfht_node *node);
+
 /*
  * Hash table creation flags.
  */
 /*
  * Hash table creation flags.
  */
@@ -119,7 +127,7 @@ enum {
 
 struct cds_lfht_mm_type {
        struct cds_lfht *(*alloc_cds_lfht)(unsigned long min_nr_alloc_buckets,
 
 struct cds_lfht_mm_type {
        struct cds_lfht *(*alloc_cds_lfht)(unsigned long min_nr_alloc_buckets,
-                       unsigned long max_nr_buckets);
+                       unsigned long max_nr_buckets, const struct cds_lfht_alloc *alloc);
        void (*alloc_bucket_table)(struct cds_lfht *ht, unsigned long order);
        void (*free_bucket_table)(struct cds_lfht *ht, unsigned long order);
        struct cds_lfht_node *(*bucket_at)(struct cds_lfht *ht,
        void (*alloc_bucket_table)(struct cds_lfht *ht, unsigned long order);
        void (*free_bucket_table)(struct cds_lfht *ht, unsigned long order);
        struct cds_lfht_node *(*bucket_at)(struct cds_lfht *ht,
@@ -142,6 +150,19 @@ struct cds_lfht *_cds_lfht_new(unsigned long init_size,
                        const struct rcu_flavor_struct *flavor,
                        pthread_attr_t *attr);
 
                        const struct rcu_flavor_struct *flavor,
                        pthread_attr_t *attr);
 
+/*
+ * _cds_lfht_new_with_alloc - API used by cds_lfht_new_with_flavor_alloc.
+ */
+extern
+struct cds_lfht *_cds_lfht_new_with_alloc(unsigned long init_size,
+                       unsigned long min_nr_alloc_buckets,
+                       unsigned long max_nr_buckets,
+                       int flags,
+                       const struct cds_lfht_mm_type *mm,
+                       const struct rcu_flavor_struct *flavor,
+                       const struct cds_lfht_alloc *alloc,
+                       pthread_attr_t *attr);
+
 /*
  * cds_lfht_new_flavor - allocate a hash table tied to a RCU flavor.
  * @init_size: number of buckets to allocate initially. Must be power of two.
 /*
  * cds_lfht_new_flavor - allocate a hash table tied to a RCU flavor.
  * @init_size: number of buckets to allocate initially. Must be power of two.
@@ -184,6 +205,52 @@ struct cds_lfht *cds_lfht_new_flavor(unsigned long init_size,
                        flags, NULL, flavor, attr);
 }
 
                        flags, NULL, flavor, attr);
 }
 
+/*
+ * cds_lfht_new_with_flavor_alloc - allocate a hash table tied to a RCU flavor.
+ * @init_size: number of buckets to allocate initially. Must be power of two.
+ * @min_nr_alloc_buckets: the minimum number of allocated buckets.
+ *                        (must be power of two)
+ * @max_nr_buckets: the maximum number of hash table buckets allowed.
+ *                  (must be power of two, 0 is accepted, means
+ *                  "infinite")
+ * @flavor: flavor of liburcu to use to synchronize the hash table
+ * @alloc: Custom memory allocator for hash table memory management.
+ *         NULL for default. If a custom allocator is used, then
+ *         the whole interface of struct cds_lfht_alloc must be implemented.
+ * @flags: hash table creation flags (can be combined with bitwise or: '|').
+ *           0: no flags.
+ *           CDS_LFHT_AUTO_RESIZE: automatically resize hash table.
+ *           CDS_LFHT_ACCOUNTING: count the number of node addition
+ *                                and removal in the table
+ * @attr: optional resize worker thread attributes. NULL for default.
+ *
+ * Return NULL on error.
+ * Note: the RCU flavor must be already included before the hash table header.
+ *
+ * The programmer is responsible for ensuring that resize operation has a
+ * priority equal to hash table updater threads. It should be performed by
+ * specifying the appropriate priority in the pthread "attr" argument, and,
+ * for CDS_LFHT_AUTO_RESIZE, by ensuring that call_rcu worker threads also have
+ * this priority level. Having lower priority for call_rcu and resize threads
+ * does not pose any correctness issue, but the resize operations could be
+ * starved by updates, thus leading to long hash table bucket chains.
+ * Threads calling cds_lfht_new are NOT required to be registered RCU
+ * read-side threads. It can be called very early. (e.g. before RCU is
+ * initialized)
+ */
+static inline
+struct cds_lfht *cds_lfht_new_with_flavor_alloc(unsigned long init_size,
+                       unsigned long min_nr_alloc_buckets,
+                       unsigned long max_nr_buckets,
+                       int flags,
+                       const struct rcu_flavor_struct *flavor,
+                       const struct cds_lfht_alloc *alloc,
+                       pthread_attr_t *attr)
+{
+       return _cds_lfht_new_with_alloc(init_size, min_nr_alloc_buckets, max_nr_buckets,
+                       flags, NULL, flavor, alloc, attr);
+}
+
 
 #ifdef URCU_API_MAP
 /*
 
 #ifdef URCU_API_MAP
 /*
@@ -237,16 +304,16 @@ struct cds_lfht *cds_lfht_new(unsigned long init_size,
  *
  * Return 0 on success, negative error value on error.
 
  *
  * Return 0 on success, negative error value on error.
 
+ * Threads calling this API need to be registered RCU read-side threads.
+ *
  * Prior to liburcu 0.10:
  * Prior to liburcu 0.10:
- * - Threads calling this API need to be registered RCU read-side
- *   threads.
  * - cds_lfht_destroy should *not* be called from a RCU read-side
  *   critical section. It should *not* be called from a call_rcu thread
  *   context neither.
  *
  * Starting from liburcu 0.10, rculfhash implements its own worker
  * - cds_lfht_destroy should *not* be called from a RCU read-side
  *   critical section. It should *not* be called from a call_rcu thread
  *   context neither.
  *
  * Starting from liburcu 0.10, rculfhash implements its own worker
- * thread to handle resize operations, which removes RCU requirements on
- * cds_lfht_destroy.
+ * thread to handle resize operations, which removes the above RCU
+ * read-side critical section requirement on cds_lfht_destroy.
  */
 extern
 int cds_lfht_destroy(struct cds_lfht *ht, pthread_attr_t **attr);
  */
 extern
 int cds_lfht_destroy(struct cds_lfht *ht, pthread_attr_t **attr);
@@ -534,24 +601,27 @@ void cds_lfht_resize(struct cds_lfht *ht, unsigned long new_size);
                cds_lfht_next_duplicate(ht, match, key, iter),          \
                        node = cds_lfht_iter_get_node(iter))
 
                cds_lfht_next_duplicate(ht, match, key, iter),          \
                        node = cds_lfht_iter_get_node(iter))
 
+#define cds_lfht_entry(ptr, type, member)                              \
+       caa_container_of_check_null(ptr, type, member)
+
 #define cds_lfht_for_each_entry(ht, iter, pos, member)                 \
        for (cds_lfht_first(ht, iter),                                  \
 #define cds_lfht_for_each_entry(ht, iter, pos, member)                 \
        for (cds_lfht_first(ht, iter),                                  \
-                       pos = caa_container_of(cds_lfht_iter_get_node(iter), \
-                                       __typeof__(*(pos)), member);    \
-               cds_lfht_iter_get_node(iter) != NULL;                   \
+                       pos = cds_lfht_entry(cds_lfht_iter_get_node(iter), \
+                               __typeof__(*(pos)), member);            \
+               pos != NULL;                                            \
                cds_lfht_next(ht, iter),                                \
                cds_lfht_next(ht, iter),                                \
-                       pos = caa_container_of(cds_lfht_iter_get_node(iter), \
-                                       __typeof__(*(pos)), member))
+                       pos = cds_lfht_entry(cds_lfht_iter_get_node(iter), \
+                               __typeof__(*(pos)), member))
 
 #define cds_lfht_for_each_entry_duplicate(ht, hash, match, key,                \
                                iter, pos, member)                      \
        for (cds_lfht_lookup(ht, hash, match, key, iter),               \
 
 #define cds_lfht_for_each_entry_duplicate(ht, hash, match, key,                \
                                iter, pos, member)                      \
        for (cds_lfht_lookup(ht, hash, match, key, iter),               \
-                       pos = caa_container_of(cds_lfht_iter_get_node(iter), \
-                                       __typeof__(*(pos)), member);    \
-               cds_lfht_iter_get_node(iter) != NULL;                   \
+                       pos = cds_lfht_entry(cds_lfht_iter_get_node(iter), \
+                               __typeof__(*(pos)), member);            \
+               pos != NULL;                                            \
                cds_lfht_next_duplicate(ht, match, key, iter),          \
                cds_lfht_next_duplicate(ht, match, key, iter),          \
-                       pos = caa_container_of(cds_lfht_iter_get_node(iter), \
-                                       __typeof__(*(pos)), member))
+                       pos = cds_lfht_entry(cds_lfht_iter_get_node(iter), \
+                               __typeof__(*(pos)), member))
 
 #ifdef __cplusplus
 }
 
 #ifdef __cplusplus
 }
index 7e8078952c75302b8af10c10f421e1294bd3e34d..0e3c9109a9288c42bd0f85290b9d18f3b34db377 100644 (file)
@@ -1,29 +1,14 @@
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_RCULFQUEUE_H
 #define _URCU_RCULFQUEUE_H
 
 /*
 #ifndef _URCU_RCULFQUEUE_H
 #define _URCU_RCULFQUEUE_H
 
 /*
- * rculfqueue.h
- *
  * Userspace RCU library - Lock-Free RCU Queue
  * Userspace RCU library - Lock-Free RCU Queue
- *
- * Copyright 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
  */
 
-#include <assert.h>
 
 #ifdef __cplusplus
 extern "C" {
 
 #ifdef __cplusplus
 extern "C" {
index c7e5599d07fa12f13573c6dd877432be08a120e9..b0f4221bf2d2970da3e6a4d4297cfc624d9e50d6 100644 (file)
@@ -1,26 +1,12 @@
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_RCULFSTACK_H
 #define _URCU_RCULFSTACK_H
 
 /*
 #ifndef _URCU_RCULFSTACK_H
 #define _URCU_RCULFSTACK_H
 
 /*
- * rculfstack.h
- *
  * Userspace RCU library - Lock-Free RCU Stack
  * Userspace RCU library - Lock-Free RCU Stack
- *
- * Copyright 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
index 1fd2df388f57cefc0ea19fa02a0c8c0b627847e8..9cd0a37de59275a487f509064713eb1ba7676d85 100644 (file)
@@ -1,25 +1,12 @@
+// SPDX-FileCopyrightText: Free Software Foundation, Inc.
+// SPDX-FileCopyrightText: 2009 Pierre-Marc Fournier
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * Copyright (C) 2002 Free Software Foundation, Inc.
  * (originally part of the GNU C Library)
  * Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
  * (originally part of the GNU C Library)
  * Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
- *
- * Copyright (C) 2009 Pierre-Marc Fournier
- * Conversion to RCU list.
- * Copyright (C) 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #ifndef _URCU_RCULIST_H
  */
 
 #ifndef _URCU_RCULIST_H
@@ -79,14 +66,13 @@ void cds_list_del_rcu(struct cds_list_head *elem)
 
 /* Iterate forward over the elements of the list.  */
 #define cds_list_for_each_rcu(pos, head) \
 
 /* Iterate forward over the elements of the list.  */
 #define cds_list_for_each_rcu(pos, head) \
-       for (pos = rcu_dereference((head)->next); pos != (head); \
-               pos = rcu_dereference(pos->next))
-
+       for (pos = rcu_dereference((head)->next); (pos) != (head); \
+               pos = rcu_dereference((pos)->next))
 
 /* Iterate through elements of the list. */
 #define cds_list_for_each_entry_rcu(pos, head, member) \
 
 /* Iterate through elements of the list. */
 #define cds_list_for_each_entry_rcu(pos, head, member) \
-       for (pos = cds_list_entry(rcu_dereference((head)->next), __typeof__(*pos), member); \
-               &pos->member != (head); \
-               pos = cds_list_entry(rcu_dereference(pos->member.next), __typeof__(*pos), member))
+       for (pos = cds_list_entry(rcu_dereference((head)->next), __typeof__(*(pos)), member); \
+               &(pos)->member != (head); \
+               pos = cds_list_entry(rcu_dereference((pos)->member.next), __typeof__(*(pos)), member))
 
 #endif /* _URCU_RCULIST_H */
 
 #endif /* _URCU_RCULIST_H */
index e546da567120e086e5773950ac135d510900b4fc..408cfe2cfd409bada17a79364631fd72535b315f 100644 (file)
@@ -1,23 +1,21 @@
+// SPDX-FileCopyrightText: 2009 Novell Inc.
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-only
+
 #ifndef _URCU_REF_H
 #define _URCU_REF_H
 
 /*
  * Userspace RCU - Reference counting
  *
 #ifndef _URCU_REF_H
 #define _URCU_REF_H
 
 /*
  * Userspace RCU - Reference counting
  *
- * Copyright (C) 2009 Novell Inc.
- * Copyright (C) 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
  * Author: Jan Blunck <jblunck@suse.de>
  * Author: Jan Blunck <jblunck@suse.de>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License version 2.1 as
- * published by the Free  Software Foundation.
  */
 
  */
 
-#include <assert.h>
 #include <stdbool.h>
 #include <limits.h>
 #include <stdlib.h>
 #include <stdbool.h>
 #include <limits.h>
 #include <stdlib.h>
+#include <urcu/assert.h>
 #include <urcu/uatomic.h>
 
 struct urcu_ref {
 #include <urcu/uatomic.h>
 
 struct urcu_ref {
@@ -63,7 +61,7 @@ static inline void urcu_ref_put(struct urcu_ref *ref,
                                void (*release)(struct urcu_ref *))
 {
        long res = uatomic_sub_return(&ref->refcount, 1);
                                void (*release)(struct urcu_ref *))
 {
        long res = uatomic_sub_return(&ref->refcount, 1);
-       assert (res >= 0);
+       urcu_posix_assert(res >= 0);
        if (res == 0)
                release(ref);
 }
        if (res == 0)
                release(ref);
 }
index 05d0bb478b8b169a03864272810d1b5c76bfa4f8..d7e70d4966d6bab1f5f040c634a025c84f7baa99 100644 (file)
@@ -1,34 +1,20 @@
+// SPDX-FileCopyrightText: 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_STATIC_LFSTACK_H
 #define _URCU_STATIC_LFSTACK_H
 
 /*
 #ifndef _URCU_STATIC_LFSTACK_H
 #define _URCU_STATIC_LFSTACK_H
 
 /*
- * urcu/static/lfstack.h
- *
  * Userspace RCU library - Lock-Free Stack
  *
  * Userspace RCU library - Lock-Free Stack
  *
- * Copyright 2010-2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
  * TO BE INCLUDED ONLY IN LGPL-COMPATIBLE CODE. See urcu/lfstack.h for
  * linking dynamically with the userspace rcu library.
  * TO BE INCLUDED ONLY IN LGPL-COMPATIBLE CODE. See urcu/lfstack.h for
  * linking dynamically with the userspace rcu library.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <stdbool.h>
 #include <pthread.h>
  */
 
 #include <stdbool.h>
 #include <pthread.h>
-#include <assert.h>
+#include <urcu/assert.h>
 #include <urcu/uatomic.h>
 #include <urcu-pointer.h>
 
 #include <urcu/uatomic.h>
 #include <urcu-pointer.h>
 
@@ -61,7 +47,7 @@ extern "C" {
  * cds_lfs_node_init: initialize lock-free stack node.
  */
 static inline
  * cds_lfs_node_init: initialize lock-free stack node.
  */
 static inline
-void _cds_lfs_node_init(struct cds_lfs_node *node)
+void _cds_lfs_node_init(struct cds_lfs_node *node __attribute__((unused)))
 {
 }
 
 {
 }
 
@@ -76,7 +62,7 @@ void _cds_lfs_init(struct cds_lfs_stack *s)
 
        s->head = NULL;
        ret = pthread_mutex_init(&s->lock, NULL);
 
        s->head = NULL;
        ret = pthread_mutex_init(&s->lock, NULL);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 }
 
 /*
 }
 
 /*
@@ -87,7 +73,7 @@ static inline
 void _cds_lfs_destroy(struct cds_lfs_stack *s)
 {
         int ret = pthread_mutex_destroy(&s->lock);
 void _cds_lfs_destroy(struct cds_lfs_stack *s)
 {
         int ret = pthread_mutex_destroy(&s->lock);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 }
 
 /*
 }
 
 /*
@@ -114,7 +100,7 @@ bool ___cds_lfs_empty_head(struct cds_lfs_head *head)
 static inline
 bool _cds_lfs_empty(cds_lfs_stack_ptr_t s)
 {
 static inline
 bool _cds_lfs_empty(cds_lfs_stack_ptr_t s)
 {
-       return ___cds_lfs_empty_head(CMM_LOAD_SHARED(s._s->head));
+       return ___cds_lfs_empty_head(uatomic_load(&s._s->head, CMM_RELAXED));
 }
 
 /*
 }
 
 /*
@@ -122,6 +108,8 @@ bool _cds_lfs_empty(cds_lfs_stack_ptr_t s)
  *
  * Does not require any synchronization with other push nor pop.
  *
  *
  * Does not require any synchronization with other push nor pop.
  *
+ * Operations before push are consistent when observed after associated pop.
+ *
  * Lock-free stack push is not subject to ABA problem, so no need to
  * take the RCU read-side lock. Even if "head" changes between two
  * uatomic_cmpxchg() invocations here (being popped, and then pushed
  * Lock-free stack push is not subject to ABA problem, so no need to
  * take the RCU read-side lock. Even if "head" changes between two
  * uatomic_cmpxchg() invocations here (being popped, and then pushed
@@ -167,7 +155,9 @@ bool _cds_lfs_push(cds_lfs_stack_ptr_t u_s,
                 * uatomic_cmpxchg() implicit memory barrier orders earlier
                 * stores to node before publication.
                 */
                 * uatomic_cmpxchg() implicit memory barrier orders earlier
                 * stores to node before publication.
                 */
-               head = uatomic_cmpxchg(&s->head, old_head, new_head);
+               cmm_emit_legacy_smp_mb();
+               head = uatomic_cmpxchg_mo(&s->head, old_head, new_head,
+                                       CMM_SEQ_CST, CMM_SEQ_CST);
                if (old_head == head)
                        break;
        }
                if (old_head == head)
                        break;
        }
@@ -179,6 +169,8 @@ bool _cds_lfs_push(cds_lfs_stack_ptr_t u_s,
  *
  * Returns NULL if stack is empty.
  *
  *
  * Returns NULL if stack is empty.
  *
+ * Operations after pop are consistent when observed before associated push.
+ *
  * __cds_lfs_pop needs to be synchronized using one of the following
  * techniques:
  *
  * __cds_lfs_pop needs to be synchronized using one of the following
  * techniques:
  *
@@ -203,7 +195,7 @@ struct cds_lfs_node *___cds_lfs_pop(cds_lfs_stack_ptr_t u_s)
                struct cds_lfs_head *head, *next_head;
                struct cds_lfs_node *next;
 
                struct cds_lfs_head *head, *next_head;
                struct cds_lfs_node *next;
 
-               head = _CMM_LOAD_SHARED(s->head);
+               head = uatomic_load(&s->head, CMM_CONSUME);
                if (___cds_lfs_empty_head(head))
                        return NULL;    /* Empty stack */
 
                if (___cds_lfs_empty_head(head))
                        return NULL;    /* Empty stack */
 
@@ -212,12 +204,14 @@ struct cds_lfs_node *___cds_lfs_pop(cds_lfs_stack_ptr_t u_s)
                 * memory barrier before uatomic_cmpxchg() in
                 * cds_lfs_push.
                 */
                 * memory barrier before uatomic_cmpxchg() in
                 * cds_lfs_push.
                 */
-               cmm_smp_read_barrier_depends();
-               next = _CMM_LOAD_SHARED(head->node.next);
+               next = uatomic_load(&head->node.next, CMM_RELAXED);
                next_head = caa_container_of(next,
                                struct cds_lfs_head, node);
                next_head = caa_container_of(next,
                                struct cds_lfs_head, node);
-               if (uatomic_cmpxchg(&s->head, head, next_head) == head)
+               if (uatomic_cmpxchg_mo(&s->head, head, next_head,
+                                       CMM_SEQ_CST, CMM_SEQ_CST) == head){
+                       cmm_emit_legacy_smp_mb();
                        return &head->node;
                        return &head->node;
+               }
                /* busy-loop if head changed under us */
        }
 }
                /* busy-loop if head changed under us */
        }
 }
@@ -245,6 +239,7 @@ static inline
 struct cds_lfs_head *___cds_lfs_pop_all(cds_lfs_stack_ptr_t u_s)
 {
        struct __cds_lfs_stack *s = u_s._s;
 struct cds_lfs_head *___cds_lfs_pop_all(cds_lfs_stack_ptr_t u_s)
 {
        struct __cds_lfs_stack *s = u_s._s;
+       struct cds_lfs_head *head;
 
        /*
         * Implicit memory barrier after uatomic_xchg() matches implicit
 
        /*
         * Implicit memory barrier after uatomic_xchg() matches implicit
@@ -256,7 +251,9 @@ struct cds_lfs_head *___cds_lfs_pop_all(cds_lfs_stack_ptr_t u_s)
         * taking care to order writes to each node prior to the full
         * memory barrier after this uatomic_xchg().
         */
         * taking care to order writes to each node prior to the full
         * memory barrier after this uatomic_xchg().
         */
-       return uatomic_xchg(&s->head, NULL);
+       head = uatomic_xchg_mo(&s->head, NULL, CMM_SEQ_CST);
+       cmm_emit_legacy_smp_mb();
+       return head;
 }
 
 /*
 }
 
 /*
@@ -267,7 +264,7 @@ static inline void _cds_lfs_pop_lock(struct cds_lfs_stack *s)
        int ret;
 
        ret = pthread_mutex_lock(&s->lock);
        int ret;
 
        ret = pthread_mutex_lock(&s->lock);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 }
 
 /*
 }
 
 /*
@@ -278,7 +275,7 @@ static inline void _cds_lfs_pop_unlock(struct cds_lfs_stack *s)
        int ret;
 
        ret = pthread_mutex_unlock(&s->lock);
        int ret;
 
        ret = pthread_mutex_unlock(&s->lock);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 }
 
 /*
 }
 
 /*
@@ -289,9 +286,11 @@ struct cds_lfs_node *
 _cds_lfs_pop_blocking(struct cds_lfs_stack *s)
 {
        struct cds_lfs_node *retnode;
 _cds_lfs_pop_blocking(struct cds_lfs_stack *s)
 {
        struct cds_lfs_node *retnode;
+       cds_lfs_stack_ptr_t stack;
 
        _cds_lfs_pop_lock(s);
 
        _cds_lfs_pop_lock(s);
-       retnode = ___cds_lfs_pop(s);
+       stack.s = s;
+       retnode = ___cds_lfs_pop(stack);
        _cds_lfs_pop_unlock(s);
        return retnode;
 }
        _cds_lfs_pop_unlock(s);
        return retnode;
 }
@@ -304,9 +303,11 @@ struct cds_lfs_head *
 _cds_lfs_pop_all_blocking(struct cds_lfs_stack *s)
 {
        struct cds_lfs_head *rethead;
 _cds_lfs_pop_all_blocking(struct cds_lfs_stack *s)
 {
        struct cds_lfs_head *rethead;
+       cds_lfs_stack_ptr_t stack;
 
        _cds_lfs_pop_lock(s);
 
        _cds_lfs_pop_lock(s);
-       rethead = ___cds_lfs_pop_all(s);
+       stack.s = s;
+       rethead = ___cds_lfs_pop_all(stack);
        _cds_lfs_pop_unlock(s);
        return rethead;
 }
        _cds_lfs_pop_unlock(s);
        return rethead;
 }
index 732f8c078d7dcf585bde531cdacd51154818a211..9dc0d3eaa5f4c6177fc503449153cd08f78267ec 100644 (file)
@@ -1,31 +1,17 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_POINTER_STATIC_H
 #define _URCU_POINTER_STATIC_H
 
 /*
 #ifndef _URCU_POINTER_STATIC_H
 #define _URCU_POINTER_STATIC_H
 
 /*
- * urcu/static/pointer.h
- *
  * Userspace RCU header. Operations on pointers.
  *
  * TO BE INCLUDED ONLY IN CODE THAT IS TO BE RECOMPILED ON EACH LIBURCU
  * RELEASE. See urcu.h for linking dynamically with the userspace rcu library.
  *
  * Userspace RCU header. Operations on pointers.
  *
  * TO BE INCLUDED ONLY IN CODE THAT IS TO BE RECOMPILED ON EACH LIBURCU
  * RELEASE. See urcu.h for linking dynamically with the userspace rcu library.
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
@@ -49,14 +35,33 @@ extern "C" {
  * Inserts memory barriers on architectures that require them (currently only
  * Alpha) and documents which pointers are protected by RCU.
  *
  * Inserts memory barriers on architectures that require them (currently only
  * Alpha) and documents which pointers are protected by RCU.
  *
- * The compiler memory barrier in CMM_LOAD_SHARED() ensures that value-speculative
- * optimizations (e.g. VSS: Value Speculation Scheduling) does not perform the
- * data read before the pointer read by speculating the value of the pointer.
- * Correct ordering is ensured because the pointer is read as a volatile access.
- * This acts as a global side-effect operation, which forbids reordering of
- * dependent memory operations. Note that such concern about dependency-breaking
- * optimizations will eventually be taken care of by the "memory_order_consume"
- * addition to forthcoming C++ standard.
+ * With C standards prior to C11/C++11, the compiler memory barrier in
+ * CMM_LOAD_SHARED() ensures that value-speculative optimizations (e.g.
+ * VSS: Value Speculation Scheduling) does not perform the data read
+ * before the pointer read by speculating the value of the pointer.
+ * Correct ordering is ensured because the pointer is read as a volatile
+ * access. This acts as a global side-effect operation, which forbids
+ * reordering of dependent memory operations.
+ *
+ * With C standards C11/C++11, concerns about dependency-breaking
+ * optimizations are taken care of by the "memory_order_consume" atomic
+ * load.
+ *
+ * Use the gcc __atomic_load() rather than C11/C++11 atomic load
+ * explicit because the pointer used as input argument is a pointer,
+ * not an _Atomic type as required by C11/C++11.
+ *
+ * By defining URCU_DEREFERENCE_USE_VOLATILE, the user requires use of
+ * volatile access to implement rcu_dereference rather than
+ * memory_order_consume load from the C11/C++11 standards.
+ *
+ * This may improve performance on weakly-ordered architectures where
+ * the compiler implements memory_order_consume as a
+ * memory_order_acquire, which is stricter than required by the
+ * standard.
+ *
+ * Note that using volatile accesses for rcu_dereference may cause
+ * LTO to generate incorrectly ordered code starting from C11/C++11.
  *
  * Should match rcu_assign_pointer() or rcu_xchg_pointer().
  *
  *
  * Should match rcu_assign_pointer() or rcu_xchg_pointer().
  *
@@ -64,14 +69,21 @@ extern "C" {
  * meets the 10-line criterion in LGPL, allowing this function to be
  * expanded directly in non-LGPL code.
  */
  * meets the 10-line criterion in LGPL, allowing this function to be
  * expanded directly in non-LGPL code.
  */
-#define _rcu_dereference(p)                                            \
-                               __extension__                           \
-                               ({                                      \
-                               __typeof__(p) _________p1 = CMM_LOAD_SHARED(p); \
-                               cmm_smp_read_barrier_depends();         \
-                               (_________p1);                          \
-                               })
 
 
+#if !defined (URCU_DEREFERENCE_USE_VOLATILE) &&                \
+       ((defined (__cplusplus) && __cplusplus >= 201103L) ||   \
+       (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L))
+# define __URCU_DEREFERENCE_USE_ATOMIC_CONSUME
+#endif
+
+/*
+ * If p is const (the pointer itself, not what it points to), using
+ * __typeof__(p) would declare a const variable, leading to
+ * -Wincompatible-pointer-types errors.  Using the statement expression
+ * makes it an rvalue and gets rid of the const-ness.
+ */
+# define _rcu_dereference(p)                   \
+       uatomic_load(&(p), CMM_CONSUME)
 /**
  * _rcu_cmpxchg_pointer - same as rcu_assign_pointer, but tests if the pointer
  * is as expected by "old". If succeeds, returns the previous pointer to the
 /**
  * _rcu_cmpxchg_pointer - same as rcu_assign_pointer, but tests if the pointer
  * is as expected by "old". If succeeds, returns the previous pointer to the
@@ -79,7 +91,7 @@ extern "C" {
  * using synchronize_rcu(). If fails (unexpected value), returns old (which
  * should not be freed !).
  *
  * using synchronize_rcu(). If fails (unexpected value), returns old (which
  * should not be freed !).
  *
- * uatomic_cmpxchg() acts as both release and acquire barriers.
+ * uatomic_cmpxchg() acts as both release and acquire barriers on success.
  *
  * This macro is less than 10 lines long.  The intent is that this macro
  * meets the 10-line criterion in LGPL, allowing this function to be
  *
  * This macro is less than 10 lines long.  The intent is that this macro
  * meets the 10-line criterion in LGPL, allowing this function to be
@@ -90,8 +102,9 @@ extern "C" {
        ({                                                              \
                __typeof__(*p) _________pold = (old);                   \
                __typeof__(*p) _________pnew = (_new);                  \
        ({                                                              \
                __typeof__(*p) _________pold = (old);                   \
                __typeof__(*p) _________pnew = (_new);                  \
-               uatomic_cmpxchg(p, _________pold, _________pnew);       \
-       })
+               uatomic_cmpxchg_mo(p, _________pold, _________pnew,     \
+                                  CMM_SEQ_CST, CMM_RELAXED);           \
+       });
 
 /**
  * _rcu_xchg_pointer - same as rcu_assign_pointer, but returns the previous
 
 /**
  * _rcu_xchg_pointer - same as rcu_assign_pointer, but returns the previous
@@ -108,17 +121,17 @@ extern "C" {
        __extension__                                   \
        ({                                              \
                __typeof__(*p) _________pv = (v);       \
        __extension__                                   \
        ({                                              \
                __typeof__(*p) _________pv = (v);       \
-               uatomic_xchg(p, _________pv);           \
+               uatomic_xchg_mo(p, _________pv,         \
+                               CMM_SEQ_CST);           \
        })
 
 
        })
 
 
-#define _rcu_set_pointer(p, v)                         \
-       do {                                            \
-               __typeof__(*p) _________pv = (v);       \
-               if (!__builtin_constant_p(v) ||         \
-                   ((v) != NULL))                      \
-                       cmm_wmb();                              \
-               uatomic_set(p, _________pv);            \
+#define _rcu_set_pointer(p, v)                                         \
+       do {                                                            \
+               __typeof__(*p) _________pv = (v);                       \
+               uatomic_store(p, _________pv,                           \
+                       __builtin_constant_p(v) && (v) == NULL ?        \
+                       CMM_RELAXED : CMM_RELEASE);                     \
        } while (0)
 
 /**
        } while (0)
 
 /**
index af73c6f2ef7565dc69e16f62d539ded7ed66d583..03c4ecdef76c6ee55102e5b36caaea5dee954841 100644 (file)
@@ -1,35 +1,21 @@
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_RCULFQUEUE_STATIC_H
 #define _URCU_RCULFQUEUE_STATIC_H
 
 /*
 #ifndef _URCU_RCULFQUEUE_STATIC_H
 #define _URCU_RCULFQUEUE_STATIC_H
 
 /*
- * rculfqueue-static.h
- *
  * Userspace RCU library - Lock-Free RCU Queue
  *
  * Userspace RCU library - Lock-Free RCU Queue
  *
- * Copyright 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
  * TO BE INCLUDED ONLY IN LGPL-COMPATIBLE CODE. See rculfqueue.h for linking
  * dynamically with the userspace rcu library.
  * TO BE INCLUDED ONLY IN LGPL-COMPATIBLE CODE. See rculfqueue.h for linking
  * dynamically with the userspace rcu library.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu-call-rcu.h>
  */
 
 #include <urcu-call-rcu.h>
+#include <urcu/assert.h>
 #include <urcu/uatomic.h>
 #include <urcu-pointer.h>
 #include <urcu/uatomic.h>
 #include <urcu-pointer.h>
-#include <assert.h>
 #include <errno.h>
 
 #ifdef __cplusplus
 #include <errno.h>
 
 #ifdef __cplusplus
@@ -66,8 +52,9 @@ struct cds_lfq_node_rcu *make_dummy(struct cds_lfq_queue_rcu *q,
 {
        struct cds_lfq_node_rcu_dummy *dummy;
 
 {
        struct cds_lfq_node_rcu_dummy *dummy;
 
-       dummy = malloc(sizeof(struct cds_lfq_node_rcu_dummy));
-       assert(dummy);
+       dummy = (struct cds_lfq_node_rcu_dummy *)
+               malloc(sizeof(struct cds_lfq_node_rcu_dummy));
+       urcu_posix_assert(dummy);
        dummy->parent.next = next;
        dummy->parent.dummy = 1;
        dummy->q = q;
        dummy->parent.next = next;
        dummy->parent.dummy = 1;
        dummy->q = q;
@@ -87,7 +74,7 @@ void rcu_free_dummy(struct cds_lfq_node_rcu *node)
 {
        struct cds_lfq_node_rcu_dummy *dummy;
 
 {
        struct cds_lfq_node_rcu_dummy *dummy;
 
-       assert(node->dummy);
+       urcu_posix_assert(node->dummy);
        dummy = caa_container_of(node, struct cds_lfq_node_rcu_dummy, parent);
        dummy->q->queue_call_rcu(&dummy->head, free_dummy_cb);
 }
        dummy = caa_container_of(node, struct cds_lfq_node_rcu_dummy, parent);
        dummy->q->queue_call_rcu(&dummy->head, free_dummy_cb);
 }
@@ -97,7 +84,7 @@ void free_dummy(struct cds_lfq_node_rcu *node)
 {
        struct cds_lfq_node_rcu_dummy *dummy;
 
 {
        struct cds_lfq_node_rcu_dummy *dummy;
 
-       assert(node->dummy);
+       urcu_posix_assert(node->dummy);
        dummy = caa_container_of(node, struct cds_lfq_node_rcu_dummy, parent);
        free(dummy);
 }
        dummy = caa_container_of(node, struct cds_lfq_node_rcu_dummy, parent);
        free(dummy);
 }
@@ -147,26 +134,29 @@ void _cds_lfq_enqueue_rcu(struct cds_lfq_queue_rcu *q,
         * uatomic_cmpxchg() implicit memory barrier orders earlier stores to
         * node before publication.
         */
         * uatomic_cmpxchg() implicit memory barrier orders earlier stores to
         * node before publication.
         */
-
        for (;;) {
                struct cds_lfq_node_rcu *tail, *next;
 
                tail = rcu_dereference(q->tail);
        for (;;) {
                struct cds_lfq_node_rcu *tail, *next;
 
                tail = rcu_dereference(q->tail);
-               next = uatomic_cmpxchg(&tail->next, NULL, node);
+               cmm_emit_legacy_smp_mb();
+               next = uatomic_cmpxchg_mo(&tail->next, NULL, node,
+                                       CMM_SEQ_CST, CMM_SEQ_CST);
                if (next == NULL) {
                        /*
                         * Tail was at the end of queue, we successfully
                         * appended to it. Now move tail (another
                         * enqueue might beat us to it, that's fine).
                         */
                if (next == NULL) {
                        /*
                         * Tail was at the end of queue, we successfully
                         * appended to it. Now move tail (another
                         * enqueue might beat us to it, that's fine).
                         */
-                       (void) uatomic_cmpxchg(&q->tail, tail, node);
+                       (void) uatomic_cmpxchg_mo(&q->tail, tail, node,
+                                               CMM_SEQ_CST, CMM_SEQ_CST);
                        return;
                } else {
                        /*
                         * Failure to append to current tail.
                         * Help moving tail further and retry.
                         */
                        return;
                } else {
                        /*
                         * Failure to append to current tail.
                         * Help moving tail further and retry.
                         */
-                       (void) uatomic_cmpxchg(&q->tail, tail, next);
+                       (void) uatomic_cmpxchg_mo(&q->tail, tail, next,
+                                               CMM_SEQ_CST, CMM_SEQ_CST);
                        continue;
                }
        }
                        continue;
                }
        }
@@ -210,7 +200,8 @@ struct cds_lfq_node_rcu *_cds_lfq_dequeue_rcu(struct cds_lfq_queue_rcu *q)
                        enqueue_dummy(q);
                        next = rcu_dereference(head->next);
                }
                        enqueue_dummy(q);
                        next = rcu_dereference(head->next);
                }
-               if (uatomic_cmpxchg(&q->head, head, next) != head)
+               if (uatomic_cmpxchg_mo(&q->head, head, next,
+                                       CMM_SEQ_CST, CMM_SEQ_CST) != head)
                        continue;       /* Concurrently pushed. */
                if (head->dummy) {
                        /* Free dummy after grace period. */
                        continue;       /* Concurrently pushed. */
                if (head->dummy) {
                        /* Free dummy after grace period. */
index 3473ccef82299b0b41559734e75377b2ac0f1941..b44b9e29fdbad9b73024d653fb992218f221644b 100644 (file)
@@ -1,29 +1,15 @@
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_RCULFSTACK_STATIC_H
 #define _URCU_RCULFSTACK_STATIC_H
 
 /*
 #ifndef _URCU_RCULFSTACK_STATIC_H
 #define _URCU_RCULFSTACK_STATIC_H
 
 /*
- * rculfstack-static.h
- *
  * Userspace RCU library - Lock-Free RCU Stack
  *
  * Userspace RCU library - Lock-Free RCU Stack
  *
- * Copyright 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
  * TO BE INCLUDED ONLY IN LGPL-COMPATIBLE CODE. See rculfstack.h for linking
  * dynamically with the userspace rcu library.
  * TO BE INCLUDED ONLY IN LGPL-COMPATIBLE CODE. See rculfstack.h for linking
  * dynamically with the userspace rcu library.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <urcu/uatomic.h>
  */
 
 #include <urcu/uatomic.h>
@@ -34,7 +20,7 @@ extern "C" {
 #endif
 
 static inline
 #endif
 
 static inline
-void _cds_lfs_node_init_rcu(struct cds_lfs_node_rcu *node)
+void _cds_lfs_node_init_rcu(struct cds_lfs_node_rcu *node __attribute__((unused)))
 {
 }
 
 {
 }
 
@@ -63,7 +49,7 @@ void _cds_lfs_init_rcu(struct cds_lfs_stack_rcu *s)
  * always performing an exclusive cacheline access, rather than doing
  * non-exclusive followed by exclusive cacheline access (which would be
  * required if we first read the old head value). This design decision
  * always performing an exclusive cacheline access, rather than doing
  * non-exclusive followed by exclusive cacheline access (which would be
  * required if we first read the old head value). This design decision
- * might be revisited after more throrough benchmarking on various
+ * might be revisited after more thorough benchmarking on various
  * platforms.
  *
  * Returns 0 if the stack was empty prior to adding the node.
  * platforms.
  *
  * Returns 0 if the stack was empty prior to adding the node.
@@ -83,7 +69,9 @@ int _cds_lfs_push_rcu(struct cds_lfs_stack_rcu *s,
                 * uatomic_cmpxchg() implicit memory barrier orders earlier
                 * stores to node before publication.
                 */
                 * uatomic_cmpxchg() implicit memory barrier orders earlier
                 * stores to node before publication.
                 */
-               head = uatomic_cmpxchg(&s->head, old_head, node);
+               cmm_emit_legacy_smp_mb();
+               head = uatomic_cmpxchg_mo(&s->head, old_head, node,
+                                       CMM_SEQ_CST, CMM_SEQ_CST);
                if (old_head == head)
                        break;
        }
                if (old_head == head)
                        break;
        }
@@ -108,7 +96,9 @@ _cds_lfs_pop_rcu(struct cds_lfs_stack_rcu *s)
                if (head) {
                        struct cds_lfs_node_rcu *next = rcu_dereference(head->next);
 
                if (head) {
                        struct cds_lfs_node_rcu *next = rcu_dereference(head->next);
 
-                       if (uatomic_cmpxchg(&s->head, head, next) == head) {
+                       if (uatomic_cmpxchg_mo(&s->head, head, next,
+                                               CMM_SEQ_CST, CMM_SEQ_CST) == head) {
+                               cmm_emit_legacy_smp_mb();
                                return head;
                        } else {
                                /* Concurrent modification. Retry. */
                                return head;
                        } else {
                                /* Concurrent modification. Retry. */
index 8614d68ad33434b9b3fd81e041733ea5753698c2..e660154094e7a3f568798f329ba121302788e8ce 100644 (file)
@@ -1,31 +1,17 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_BP_STATIC_H
 #define _URCU_BP_STATIC_H
 
 /*
 #ifndef _URCU_BP_STATIC_H
 #define _URCU_BP_STATIC_H
 
 /*
- * urcu-bp-static.h
- *
  * Userspace RCU header.
  *
  * TO BE INCLUDED ONLY IN CODE THAT IS TO BE RECOMPILED ON EACH LIBURCU
  * RELEASE. See urcu.h for linking dynamically with the userspace rcu library.
  *
  * Userspace RCU header.
  *
  * TO BE INCLUDED ONLY IN CODE THAT IS TO BE RECOMPILED ON EACH LIBURCU
  * RELEASE. See urcu.h for linking dynamically with the userspace rcu library.
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
@@ -33,6 +19,8 @@
 #include <pthread.h>
 #include <unistd.h>
 
 #include <pthread.h>
 #include <unistd.h>
 
+#include <urcu/annotate.h>
+#include <urcu/debug.h>
 #include <urcu/config.h>
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
 #include <urcu/config.h>
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
@@ -40,7 +28,6 @@
 #include <urcu/uatomic.h>
 #include <urcu/list.h>
 #include <urcu/tls-compat.h>
 #include <urcu/uatomic.h>
 #include <urcu/list.h>
 #include <urcu/tls-compat.h>
-#include <urcu/debug.h>
 
 /*
  * This code section can only be included in LGPL 2.1 compatible source code.
 
 /*
  * This code section can only be included in LGPL 2.1 compatible source code.
@@ -117,7 +104,8 @@ static inline void urcu_bp_smp_mb_slave(void)
                cmm_smp_mb();
 }
 
                cmm_smp_mb();
 }
 
-static inline enum urcu_bp_state urcu_bp_reader_state(unsigned long *ctr)
+static inline enum urcu_bp_state urcu_bp_reader_state(unsigned long *ctr,
+                                               cmm_annotate_t *group)
 {
        unsigned long v;
 
 {
        unsigned long v;
 
@@ -127,7 +115,9 @@ static inline enum urcu_bp_state urcu_bp_reader_state(unsigned long *ctr)
         * Make sure both tests below are done on the same version of *value
         * to insure consistency.
         */
         * Make sure both tests below are done on the same version of *value
         * to insure consistency.
         */
-       v = CMM_LOAD_SHARED(*ctr);
+       v = uatomic_load(ctr, CMM_RELAXED);
+       cmm_annotate_group_mem_acquire(group, ctr);
+
        if (!(v & URCU_BP_GP_CTR_NEST_MASK))
                return URCU_BP_READER_INACTIVE;
        if (!((v ^ urcu_bp_gp.ctr) & URCU_BP_GP_CTR_PHASE))
        if (!(v & URCU_BP_GP_CTR_NEST_MASK))
                return URCU_BP_READER_INACTIVE;
        if (!((v ^ urcu_bp_gp.ctr) & URCU_BP_GP_CTR_PHASE))
@@ -137,9 +127,9 @@ static inline enum urcu_bp_state urcu_bp_reader_state(unsigned long *ctr)
 
 /*
  * Helper for _urcu_bp_read_lock().  The format of urcu_bp_gp.ctr (as well as
 
 /*
  * Helper for _urcu_bp_read_lock().  The format of urcu_bp_gp.ctr (as well as
- * the per-thread rcu_reader.ctr) has the upper bits containing a count of
- * _urcu_bp_read_lock() nesting, and a lower-order bit that contains either zero
- * or URCU_BP_GP_CTR_PHASE.  The smp_mb_slave() ensures that the accesses in
+ * the per-thread rcu_reader.ctr) has the lower-order bits containing a count of
+ * _urcu_bp_read_lock() nesting, and a single high-order URCU_BP_GP_CTR_PHASE bit
+ * that contains either zero or one.  The smp_mb_slave() ensures that the accesses in
  * _urcu_bp_read_lock() happen before the subsequent read-side critical section.
  */
 static inline void _urcu_bp_read_lock_update(unsigned long tmp)
  * _urcu_bp_read_lock() happen before the subsequent read-side critical section.
  */
 static inline void _urcu_bp_read_lock_update(unsigned long tmp)
@@ -169,7 +159,7 @@ static inline void _urcu_bp_read_lock(void)
                urcu_bp_register(); /* If not yet registered. */
        cmm_barrier();  /* Ensure the compiler does not reorder us with mutex */
        tmp = URCU_TLS(urcu_bp_reader)->ctr;
                urcu_bp_register(); /* If not yet registered. */
        cmm_barrier();  /* Ensure the compiler does not reorder us with mutex */
        tmp = URCU_TLS(urcu_bp_reader)->ctr;
-       urcu_assert((tmp & URCU_BP_GP_CTR_NEST_MASK) != URCU_BP_GP_CTR_NEST_MASK);
+       urcu_assert_debug((tmp & URCU_BP_GP_CTR_NEST_MASK) != URCU_BP_GP_CTR_NEST_MASK);
        _urcu_bp_read_lock_update(tmp);
 }
 
        _urcu_bp_read_lock_update(tmp);
 }
 
@@ -181,12 +171,14 @@ static inline void _urcu_bp_read_lock(void)
 static inline void _urcu_bp_read_unlock(void)
 {
        unsigned long tmp;
 static inline void _urcu_bp_read_unlock(void)
 {
        unsigned long tmp;
+       unsigned long *ctr = &URCU_TLS(urcu_bp_reader)->ctr;
 
        tmp = URCU_TLS(urcu_bp_reader)->ctr;
 
        tmp = URCU_TLS(urcu_bp_reader)->ctr;
-       urcu_assert(tmp & URCU_BP_GP_CTR_NEST_MASK);
+       urcu_assert_debug(tmp & URCU_BP_GP_CTR_NEST_MASK);
        /* Finish using rcu before decrementing the pointer. */
        urcu_bp_smp_mb_slave();
        /* Finish using rcu before decrementing the pointer. */
        urcu_bp_smp_mb_slave();
-       _CMM_STORE_SHARED(URCU_TLS(urcu_bp_reader)->ctr, tmp - URCU_BP_GP_COUNT);
+       cmm_annotate_mem_release(ctr);
+       uatomic_store(ctr, tmp - URCU_BP_GP_COUNT, CMM_RELAXED);
        cmm_barrier();  /* Ensure the compiler does not reorder us with mutex */
 }
 
        cmm_barrier();  /* Ensure the compiler does not reorder us with mutex */
 }
 
index 28d3160cb2cce1ff18e5e9c662e6644be41e12c9..d0fd06a3e221705ca14bbf820805658c65e1dda5 100644 (file)
@@ -1,31 +1,17 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_COMMON_STATIC_H
 #define _URCU_COMMON_STATIC_H
 
 /*
 #ifndef _URCU_COMMON_STATIC_H
 #define _URCU_COMMON_STATIC_H
 
 /*
- * urcu-common-static.h
- *
  * Userspace RCU header.
  *
  * TO BE INCLUDED ONLY IN CODE THAT IS TO BE RECOMPILED ON EACH LIBURCU
  * RELEASE. See urcu.h for linking dynamically with the userspace rcu library.
  *
  * Userspace RCU header.
  *
  * TO BE INCLUDED ONLY IN CODE THAT IS TO BE RECOMPILED ON EACH LIBURCU
  * RELEASE. See urcu.h for linking dynamically with the userspace rcu library.
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
@@ -34,6 +20,7 @@
 #include <unistd.h>
 #include <stdint.h>
 
 #include <unistd.h>
 #include <stdint.h>
 
+#include <urcu/annotate.h>
 #include <urcu/config.h>
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
 #include <urcu/config.h>
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
@@ -42,7 +29,6 @@
 #include <urcu/list.h>
 #include <urcu/futex.h>
 #include <urcu/tls-compat.h>
 #include <urcu/list.h>
 #include <urcu/futex.h>
 #include <urcu/tls-compat.h>
-#include <urcu/debug.h>
 
 #ifdef __cplusplus
 extern "C" {
 
 #ifdef __cplusplus
 extern "C" {
@@ -106,7 +92,8 @@ static inline void urcu_common_wake_up_gp(struct urcu_gp *gp)
 }
 
 static inline enum urcu_state urcu_common_reader_state(struct urcu_gp *gp,
 }
 
 static inline enum urcu_state urcu_common_reader_state(struct urcu_gp *gp,
-               unsigned long *ctr)
+                                               unsigned long *ctr,
+                                               cmm_annotate_t *group)
 {
        unsigned long v;
 
 {
        unsigned long v;
 
@@ -114,7 +101,9 @@ static inline enum urcu_state urcu_common_reader_state(struct urcu_gp *gp,
         * Make sure both tests below are done on the same version of *value
         * to insure consistency.
         */
         * Make sure both tests below are done on the same version of *value
         * to insure consistency.
         */
-       v = CMM_LOAD_SHARED(*ctr);
+       v = uatomic_load(ctr, CMM_RELAXED);
+       cmm_annotate_group_mem_acquire(group, ctr);
+
        if (!(v & URCU_GP_CTR_NEST_MASK))
                return URCU_READER_INACTIVE;
        if (!((v ^ gp->ctr) & URCU_GP_CTR_PHASE))
        if (!(v & URCU_GP_CTR_NEST_MASK))
                return URCU_READER_INACTIVE;
        if (!((v ^ gp->ctr) & URCU_GP_CTR_PHASE))
index 0dd7d427b567635adb8dbfa7a397dcc8676e1576..8ddbd0026cbcc129dd374fdf48a974a2bb4db665 100644 (file)
@@ -1,31 +1,17 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_MB_STATIC_H
 #define _URCU_MB_STATIC_H
 
 /*
 #ifndef _URCU_MB_STATIC_H
 #define _URCU_MB_STATIC_H
 
 /*
- * urcu-mb-static.h
- *
  * Userspace RCU header.
  *
  * TO BE INCLUDED ONLY IN CODE THAT IS TO BE RECOMPILED ON EACH LIBURCU
  * RELEASE. See urcu.h for linking dynamically with the userspace rcu library.
  *
  * Userspace RCU header.
  *
  * TO BE INCLUDED ONLY IN CODE THAT IS TO BE RECOMPILED ON EACH LIBURCU
  * RELEASE. See urcu.h for linking dynamically with the userspace rcu library.
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
@@ -34,6 +20,7 @@
 #include <unistd.h>
 #include <stdint.h>
 
 #include <unistd.h>
 #include <stdint.h>
 
+#include <urcu/debug.h>
 #include <urcu/config.h>
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
 #include <urcu/config.h>
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
@@ -42,7 +29,6 @@
 #include <urcu/list.h>
 #include <urcu/futex.h>
 #include <urcu/tls-compat.h>
 #include <urcu/list.h>
 #include <urcu/futex.h>
 #include <urcu/tls-compat.h>
-#include <urcu/debug.h>
 #include <urcu/static/urcu-common.h>
 
 #ifdef __cplusplus
 #include <urcu/static/urcu-common.h>
 
 #ifdef __cplusplus
@@ -63,9 +49,9 @@ extern DECLARE_URCU_TLS(struct urcu_reader, urcu_mb_reader);
 
 /*
  * Helper for _urcu_mb_read_lock().  The format of urcu_mb_gp.ctr (as well as
 
 /*
  * Helper for _urcu_mb_read_lock().  The format of urcu_mb_gp.ctr (as well as
- * the per-thread rcu_reader.ctr) has the upper bits containing a count of
- * _urcu_mb_read_lock() nesting, and a lower-order bit that contains either zero
- * or URCU_GP_CTR_PHASE.  The cmm_smp_mb() ensures that the accesses in
+ * the per-thread rcu_reader.ctr) has the lower-order bits containing a count of
+ * _urcu_mb_read_lock() nesting, and a single high-order URCU_BP_GP_CTR_PHASE bit
+ * that contains either zero or one.  The cmm_smp_mb() ensures that the accesses in
  * _urcu_mb_read_lock() happen before the subsequent read-side critical section.
  */
 static inline void _urcu_mb_read_lock_update(unsigned long tmp)
  * _urcu_mb_read_lock() happen before the subsequent read-side critical section.
  */
 static inline void _urcu_mb_read_lock_update(unsigned long tmp)
@@ -91,10 +77,10 @@ static inline void _urcu_mb_read_lock(void)
 {
        unsigned long tmp;
 
 {
        unsigned long tmp;
 
-       urcu_assert(URCU_TLS(urcu_mb_reader).registered);
+       urcu_assert_debug(URCU_TLS(urcu_mb_reader).registered);
        cmm_barrier();
        tmp = URCU_TLS(urcu_mb_reader).ctr;
        cmm_barrier();
        tmp = URCU_TLS(urcu_mb_reader).ctr;
-       urcu_assert((tmp & URCU_GP_CTR_NEST_MASK) != URCU_GP_CTR_NEST_MASK);
+       urcu_assert_debug((tmp & URCU_GP_CTR_NEST_MASK) != URCU_GP_CTR_NEST_MASK);
        _urcu_mb_read_lock_update(tmp);
 }
 
        _urcu_mb_read_lock_update(tmp);
 }
 
@@ -108,17 +94,18 @@ static inline void _urcu_mb_read_lock(void)
  */
 static inline void _urcu_mb_read_unlock_update_and_wakeup(unsigned long tmp)
 {
  */
 static inline void _urcu_mb_read_unlock_update_and_wakeup(unsigned long tmp)
 {
+       unsigned long *ctr = &URCU_TLS(urcu_mb_reader).ctr;
+
        if (caa_likely((tmp & URCU_GP_CTR_NEST_MASK) == URCU_GP_COUNT)) {
        if (caa_likely((tmp & URCU_GP_CTR_NEST_MASK) == URCU_GP_COUNT)) {
-               cmm_smp_mb();
-               _CMM_STORE_SHARED(URCU_TLS(urcu_mb_reader).ctr, tmp - URCU_GP_COUNT);
-               cmm_smp_mb();
+               uatomic_store(ctr, tmp - URCU_GP_COUNT, CMM_SEQ_CST);
                urcu_common_wake_up_gp(&urcu_mb_gp);
                urcu_common_wake_up_gp(&urcu_mb_gp);
-       } else
-               _CMM_STORE_SHARED(URCU_TLS(urcu_mb_reader).ctr, tmp - URCU_GP_COUNT);
+       } else {
+               uatomic_store(ctr, tmp - URCU_GP_COUNT, CMM_RELAXED);
+       }
 }
 
 /*
 }
 
 /*
- * Exit an RCU read-side crtical section.  Both this function and its
+ * Exit an RCU read-side critical section.  Both this function and its
  * helper are smaller than 10 lines of code, and are intended to be
  * usable by non-LGPL code, as called out in LGPL.
  */
  * helper are smaller than 10 lines of code, and are intended to be
  * usable by non-LGPL code, as called out in LGPL.
  */
@@ -126,9 +113,9 @@ static inline void _urcu_mb_read_unlock(void)
 {
        unsigned long tmp;
 
 {
        unsigned long tmp;
 
-       urcu_assert(URCU_TLS(urcu_mb_reader).registered);
+       urcu_assert_debug(URCU_TLS(urcu_mb_reader).registered);
        tmp = URCU_TLS(urcu_mb_reader).ctr;
        tmp = URCU_TLS(urcu_mb_reader).ctr;
-       urcu_assert(tmp & URCU_GP_CTR_NEST_MASK);
+       urcu_assert_debug(tmp & URCU_GP_CTR_NEST_MASK);
        _urcu_mb_read_unlock_update_and_wakeup(tmp);
        cmm_barrier();  /* Ensure the compiler does not reorder us with mutex */
 }
        _urcu_mb_read_unlock_update_and_wakeup(tmp);
        cmm_barrier();  /* Ensure the compiler does not reorder us with mutex */
 }
index a64efee3f9019b0bc37dbcddebc285c4b5b0fb5b..b9178c879e1ac282a00cf9958a91d3f489d22bbe 100644 (file)
@@ -1,31 +1,17 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_MEMB_STATIC_H
 #define _URCU_MEMB_STATIC_H
 
 /*
 #ifndef _URCU_MEMB_STATIC_H
 #define _URCU_MEMB_STATIC_H
 
 /*
- * urcu-memb-static.h
- *
  * Userspace RCU header.
  *
  * TO BE INCLUDED ONLY IN CODE THAT IS TO BE RECOMPILED ON EACH LIBURCU
  * RELEASE. See urcu.h for linking dynamically with the userspace rcu library.
  *
  * Userspace RCU header.
  *
  * TO BE INCLUDED ONLY IN CODE THAT IS TO BE RECOMPILED ON EACH LIBURCU
  * RELEASE. See urcu.h for linking dynamically with the userspace rcu library.
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
@@ -34,6 +20,8 @@
 #include <unistd.h>
 #include <stdint.h>
 
 #include <unistd.h>
 #include <stdint.h>
 
+#include <urcu/annotate.h>
+#include <urcu/debug.h>
 #include <urcu/config.h>
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
 #include <urcu/config.h>
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
@@ -42,7 +30,6 @@
 #include <urcu/list.h>
 #include <urcu/futex.h>
 #include <urcu/tls-compat.h>
 #include <urcu/list.h>
 #include <urcu/futex.h>
 #include <urcu/tls-compat.h>
-#include <urcu/debug.h>
 #include <urcu/static/urcu-common.h>
 
 #ifdef __cplusplus
 #include <urcu/static/urcu-common.h>
 
 #ifdef __cplusplus
@@ -86,18 +73,27 @@ extern DECLARE_URCU_TLS(struct urcu_reader, urcu_memb_reader);
 
 /*
  * Helper for _rcu_read_lock().  The format of urcu_memb_gp.ctr (as well as
 
 /*
  * Helper for _rcu_read_lock().  The format of urcu_memb_gp.ctr (as well as
- * the per-thread rcu_reader.ctr) has the upper bits containing a count of
- * _rcu_read_lock() nesting, and a lower-order bit that contains either zero
- * or URCU_GP_CTR_PHASE.  The smp_mb_slave() ensures that the accesses in
+ * the per-thread rcu_reader.ctr) has the lower-order bits containing a count of
+ * _rcu_read_lock() nesting, and a single high-order URCU_BP_GP_CTR_PHASE bit
+ * that contains either zero or one.  The smp_mb_slave() ensures that the accesses in
  * _rcu_read_lock() happen before the subsequent read-side critical section.
  */
 static inline void _urcu_memb_read_lock_update(unsigned long tmp)
 {
  * _rcu_read_lock() happen before the subsequent read-side critical section.
  */
 static inline void _urcu_memb_read_lock_update(unsigned long tmp)
 {
+       unsigned long *ctr = &URCU_TLS(urcu_memb_reader).ctr;
+
        if (caa_likely(!(tmp & URCU_GP_CTR_NEST_MASK))) {
        if (caa_likely(!(tmp & URCU_GP_CTR_NEST_MASK))) {
-               _CMM_STORE_SHARED(URCU_TLS(urcu_memb_reader).ctr, _CMM_LOAD_SHARED(urcu_memb_gp.ctr));
+               unsigned long *pgctr = &urcu_memb_gp.ctr;
+               unsigned long gctr = uatomic_load(pgctr, CMM_RELAXED);
+
+               /* Paired with following mb slave. */
+               cmm_annotate_mem_acquire(pgctr);
+               uatomic_store(ctr, gctr, CMM_RELAXED);
+
                urcu_memb_smp_mb_slave();
                urcu_memb_smp_mb_slave();
-       } else
-               _CMM_STORE_SHARED(URCU_TLS(urcu_memb_reader).ctr, tmp + URCU_GP_COUNT);
+       } else {
+               uatomic_store(ctr, tmp + URCU_GP_COUNT, CMM_RELAXED);
+       }
 }
 
 /*
 }
 
 /*
@@ -114,10 +110,10 @@ static inline void _urcu_memb_read_lock(void)
 {
        unsigned long tmp;
 
 {
        unsigned long tmp;
 
-       urcu_assert(URCU_TLS(urcu_memb_reader).registered);
+       urcu_assert_debug(URCU_TLS(urcu_memb_reader).registered);
        cmm_barrier();
        tmp = URCU_TLS(urcu_memb_reader).ctr;
        cmm_barrier();
        tmp = URCU_TLS(urcu_memb_reader).ctr;
-       urcu_assert((tmp & URCU_GP_CTR_NEST_MASK) != URCU_GP_CTR_NEST_MASK);
+       urcu_assert_debug((tmp & URCU_GP_CTR_NEST_MASK) != URCU_GP_CTR_NEST_MASK);
        _urcu_memb_read_lock_update(tmp);
 }
 
        _urcu_memb_read_lock_update(tmp);
 }
 
@@ -131,17 +127,21 @@ static inline void _urcu_memb_read_lock(void)
  */
 static inline void _urcu_memb_read_unlock_update_and_wakeup(unsigned long tmp)
 {
  */
 static inline void _urcu_memb_read_unlock_update_and_wakeup(unsigned long tmp)
 {
+       unsigned long *ctr = &URCU_TLS(urcu_memb_reader).ctr;
+
        if (caa_likely((tmp & URCU_GP_CTR_NEST_MASK) == URCU_GP_COUNT)) {
                urcu_memb_smp_mb_slave();
        if (caa_likely((tmp & URCU_GP_CTR_NEST_MASK) == URCU_GP_COUNT)) {
                urcu_memb_smp_mb_slave();
-               _CMM_STORE_SHARED(URCU_TLS(urcu_memb_reader).ctr, tmp - URCU_GP_COUNT);
+               cmm_annotate_mem_release(ctr);
+               uatomic_store(ctr, tmp - URCU_GP_COUNT, CMM_RELAXED);
                urcu_memb_smp_mb_slave();
                urcu_common_wake_up_gp(&urcu_memb_gp);
                urcu_memb_smp_mb_slave();
                urcu_common_wake_up_gp(&urcu_memb_gp);
-       } else
-               _CMM_STORE_SHARED(URCU_TLS(urcu_memb_reader).ctr, tmp - URCU_GP_COUNT);
+       } else {
+               uatomic_store(ctr, tmp - URCU_GP_COUNT, CMM_RELAXED);
+       }
 }
 
 /*
 }
 
 /*
- * Exit an RCU read-side crtical section.  Both this function and its
+ * Exit an RCU read-side critical section.  Both this function and its
  * helper are smaller than 10 lines of code, and are intended to be
  * usable by non-LGPL code, as called out in LGPL.
  */
  * helper are smaller than 10 lines of code, and are intended to be
  * usable by non-LGPL code, as called out in LGPL.
  */
@@ -149,9 +149,9 @@ static inline void _urcu_memb_read_unlock(void)
 {
        unsigned long tmp;
 
 {
        unsigned long tmp;
 
-       urcu_assert(URCU_TLS(urcu_memb_reader).registered);
+       urcu_assert_debug(URCU_TLS(urcu_memb_reader).registered);
        tmp = URCU_TLS(urcu_memb_reader).ctr;
        tmp = URCU_TLS(urcu_memb_reader).ctr;
-       urcu_assert(tmp & URCU_GP_CTR_NEST_MASK);
+       urcu_assert_debug(tmp & URCU_GP_CTR_NEST_MASK);
        _urcu_memb_read_unlock_update_and_wakeup(tmp);
        cmm_barrier();  /* Ensure the compiler does not reorder us with mutex */
 }
        _urcu_memb_read_unlock_update_and_wakeup(tmp);
        cmm_barrier();  /* Ensure the compiler does not reorder us with mutex */
 }
index a6063e2de2de78f1f7a0da84f004b790825ad118..de798831bb5c1ac7aaa950351171b17c750053bb 100644 (file)
@@ -1,31 +1,17 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_QSBR_STATIC_H
 #define _URCU_QSBR_STATIC_H
 
 /*
 #ifndef _URCU_QSBR_STATIC_H
 #define _URCU_QSBR_STATIC_H
 
 /*
- * urcu-qsbr-static.h
- *
  * Userspace RCU QSBR header.
  *
  * TO BE INCLUDED ONLY IN CODE THAT IS TO BE RECOMPILED ON EACH LIBURCU
  * RELEASE. See urcu.h for linking dynamically with the userspace rcu library.
  *
  * Userspace RCU QSBR header.
  *
  * TO BE INCLUDED ONLY IN CODE THAT IS TO BE RECOMPILED ON EACH LIBURCU
  * RELEASE. See urcu.h for linking dynamically with the userspace rcu library.
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
@@ -35,6 +21,8 @@
 #include <unistd.h>
 #include <stdint.h>
 
 #include <unistd.h>
 #include <stdint.h>
 
+#include <urcu/annotate.h>
+#include <urcu/debug.h>
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
 #include <urcu/system.h>
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
 #include <urcu/system.h>
@@ -42,7 +30,6 @@
 #include <urcu/list.h>
 #include <urcu/futex.h>
 #include <urcu/tls-compat.h>
 #include <urcu/list.h>
 #include <urcu/futex.h>
 #include <urcu/tls-compat.h>
-#include <urcu/debug.h>
 #include <urcu/static/urcu-common.h>
 
 #ifdef __cplusplus
 #include <urcu/static/urcu-common.h>
 
 #ifdef __cplusplus
@@ -96,11 +83,14 @@ static inline void urcu_qsbr_wake_up_gp(void)
        }
 }
 
        }
 }
 
-static inline enum urcu_state urcu_qsbr_reader_state(unsigned long *ctr)
+static inline enum urcu_state urcu_qsbr_reader_state(unsigned long *ctr,
+                                               cmm_annotate_t *group)
 {
        unsigned long v;
 
 {
        unsigned long v;
 
-       v = CMM_LOAD_SHARED(*ctr);
+       v = uatomic_load(ctr, CMM_RELAXED);
+       cmm_annotate_group_mem_acquire(group, ctr);
+
        if (!v)
                return URCU_READER_INACTIVE;
        if (v == urcu_qsbr_gp.ctr)
        if (!v)
                return URCU_READER_INACTIVE;
        if (v == urcu_qsbr_gp.ctr)
@@ -117,7 +107,7 @@ static inline enum urcu_state urcu_qsbr_reader_state(unsigned long *ctr)
  */
 static inline void _urcu_qsbr_read_lock(void)
 {
  */
 static inline void _urcu_qsbr_read_lock(void)
 {
-       urcu_assert(URCU_TLS(urcu_qsbr_reader).ctr);
+       urcu_assert_debug(URCU_TLS(urcu_qsbr_reader).ctr);
 }
 
 /*
 }
 
 /*
@@ -129,7 +119,7 @@ static inline void _urcu_qsbr_read_lock(void)
  */
 static inline void _urcu_qsbr_read_unlock(void)
 {
  */
 static inline void _urcu_qsbr_read_unlock(void)
 {
-       urcu_assert(URCU_TLS(urcu_qsbr_reader).ctr);
+       urcu_assert_debug(URCU_TLS(urcu_qsbr_reader).ctr);
 }
 
 /*
 }
 
 /*
@@ -155,9 +145,9 @@ static inline int _urcu_qsbr_read_ongoing(void)
  */
 static inline void _urcu_qsbr_quiescent_state_update_and_wakeup(unsigned long gp_ctr)
 {
  */
 static inline void _urcu_qsbr_quiescent_state_update_and_wakeup(unsigned long gp_ctr)
 {
-       cmm_smp_mb();
-       _CMM_STORE_SHARED(URCU_TLS(urcu_qsbr_reader).ctr, gp_ctr);
-       cmm_smp_mb();   /* write URCU_TLS(urcu_qsbr_reader).ctr before read futex */
+       uatomic_store(&URCU_TLS(urcu_qsbr_reader).ctr, gp_ctr, CMM_SEQ_CST);
+
+       /* write URCU_TLS(urcu_qsbr_reader).ctr before read futex */
        urcu_qsbr_wake_up_gp();
        cmm_smp_mb();
 }
        urcu_qsbr_wake_up_gp();
        cmm_smp_mb();
 }
@@ -178,8 +168,9 @@ static inline void _urcu_qsbr_quiescent_state(void)
 {
        unsigned long gp_ctr;
 
 {
        unsigned long gp_ctr;
 
-       urcu_assert(URCU_TLS(urcu_qsbr_reader).registered);
-       if ((gp_ctr = CMM_LOAD_SHARED(urcu_qsbr_gp.ctr)) == URCU_TLS(urcu_qsbr_reader).ctr)
+       urcu_assert_debug(URCU_TLS(urcu_qsbr_reader).registered);
+       gp_ctr = uatomic_load(&urcu_qsbr_gp.ctr, CMM_RELAXED);
+       if (gp_ctr == URCU_TLS(urcu_qsbr_reader).ctr)
                return;
        _urcu_qsbr_quiescent_state_update_and_wakeup(gp_ctr);
 }
                return;
        _urcu_qsbr_quiescent_state_update_and_wakeup(gp_ctr);
 }
@@ -194,10 +185,9 @@ static inline void _urcu_qsbr_quiescent_state(void)
  */
 static inline void _urcu_qsbr_thread_offline(void)
 {
  */
 static inline void _urcu_qsbr_thread_offline(void)
 {
-       urcu_assert(URCU_TLS(urcu_qsbr_reader).registered);
-       cmm_smp_mb();
-       CMM_STORE_SHARED(URCU_TLS(urcu_qsbr_reader).ctr, 0);
-       cmm_smp_mb();   /* write URCU_TLS(urcu_qsbr_reader).ctr before read futex */
+       urcu_assert_debug(URCU_TLS(urcu_qsbr_reader).registered);
+       uatomic_store(&URCU_TLS(urcu_qsbr_reader).ctr, 0, CMM_SEQ_CST);
+       /* write URCU_TLS(urcu_qsbr_reader).ctr before read futex */
        urcu_qsbr_wake_up_gp();
        cmm_barrier();  /* Ensure the compiler does not reorder us with mutex */
 }
        urcu_qsbr_wake_up_gp();
        cmm_barrier();  /* Ensure the compiler does not reorder us with mutex */
 }
@@ -212,9 +202,14 @@ static inline void _urcu_qsbr_thread_offline(void)
  */
 static inline void _urcu_qsbr_thread_online(void)
 {
  */
 static inline void _urcu_qsbr_thread_online(void)
 {
-       urcu_assert(URCU_TLS(urcu_qsbr_reader).registered);
+       unsigned long *pctr = &URCU_TLS(urcu_qsbr_reader).ctr;
+       unsigned long ctr;
+
+       urcu_assert_debug(URCU_TLS(urcu_qsbr_reader).registered);
        cmm_barrier();  /* Ensure the compiler does not reorder us with mutex */
        cmm_barrier();  /* Ensure the compiler does not reorder us with mutex */
-       _CMM_STORE_SHARED(URCU_TLS(urcu_qsbr_reader).ctr, CMM_LOAD_SHARED(urcu_qsbr_gp.ctr));
+       ctr = uatomic_load(&urcu_qsbr_gp.ctr, CMM_RELAXED);
+       cmm_annotate_mem_acquire(&urcu_qsbr_gp.ctr);
+       uatomic_store(pctr, ctr, CMM_RELAXED);
        cmm_smp_mb();
 }
 
        cmm_smp_mb();
 }
 
diff --git a/include/urcu/static/urcu-signal-nr.h b/include/urcu/static/urcu-signal-nr.h
deleted file mode 100644 (file)
index a488f3a..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef _STATIC_URCU_SIGNAL_NR_H
-#define _STATIC_URCU_SIGNAL_NR_H
-
-/*
- * static/urcu-signal-nr.h
- *
- * Userspace RCU header.
- *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * IBM's contributions to this file may be relicensed under LGPLv2 or later.
- */
-
-/*
- * The signal number used by the RCU library can be overridden with
- * -DSIGRCU= when compiling the library.
- * Provide backward compatibility for liburcu 0.3.x SIGURCU.
- */
-#ifdef SIGURCU
-#define SIGRCU SIGURCU
-#endif
-
-#ifndef SIGRCU
-#define SIGRCU SIGUSR1
-#endif
-
-#endif /* _STATIC_URCU_SIGNAL_NR_H */
diff --git a/include/urcu/static/urcu-signal.h b/include/urcu/static/urcu-signal.h
deleted file mode 100644 (file)
index f0faf3a..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-#ifndef _URCU_SIGNAL_STATIC_H
-#define _URCU_SIGNAL_STATIC_H
-
-/*
- * urcu-signal-static.h
- *
- * Userspace RCU header.
- *
- * TO BE INCLUDED ONLY IN CODE THAT IS TO BE RECOMPILED ON EACH LIBURCU
- * RELEASE. See urcu.h for linking dynamically with the userspace rcu library.
- *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * IBM's contributions to this file may be relicensed under LGPLv2 or later.
- */
-
-#include <stdlib.h>
-#include <pthread.h>
-#include <unistd.h>
-#include <stdint.h>
-
-#include <urcu/config.h>
-#include <urcu/compiler.h>
-#include <urcu/arch.h>
-#include <urcu/system.h>
-#include <urcu/uatomic.h>
-#include <urcu/list.h>
-#include <urcu/futex.h>
-#include <urcu/tls-compat.h>
-#include <urcu/debug.h>
-#include <urcu/static/urcu-common.h>
-#include <urcu/static/urcu-signal-nr.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * This code section can only be included in LGPL 2.1 compatible source code.
- * See below for the function call wrappers which can be used in code meant to
- * be only linked with the Userspace RCU library. This comes with a small
- * performance degradation on the read-side due to the added function calls.
- * This is required to permit relinking with newer versions of the library.
- */
-
-extern struct urcu_gp urcu_signal_gp;
-
-extern DECLARE_URCU_TLS(struct urcu_reader, urcu_signal_reader);
-
-/*
- * Helper for _rcu_read_lock().  The format of urcu_signal_gp.ctr (as well as
- * the per-thread rcu_reader.ctr) has the upper bits containing a count of
- * _rcu_read_lock() nesting, and a lower-order bit that contains either zero
- * or URCU_GP_CTR_PHASE.  The cmm_barrier() ensures that the accesses in
- * _rcu_read_lock() happen before the subsequent read-side critical section.
- */
-static inline void _urcu_signal_read_lock_update(unsigned long tmp)
-{
-       if (caa_likely(!(tmp & URCU_GP_CTR_NEST_MASK))) {
-               _CMM_STORE_SHARED(URCU_TLS(urcu_signal_reader).ctr, _CMM_LOAD_SHARED(urcu_signal_gp.ctr));
-               cmm_barrier();
-       } else
-               _CMM_STORE_SHARED(URCU_TLS(urcu_signal_reader).ctr, tmp + URCU_GP_COUNT);
-}
-
-/*
- * Enter an RCU read-side critical section.
- *
- * The first cmm_barrier() call ensures that the compiler does not reorder
- * the body of _rcu_read_lock() with a mutex.
- *
- * This function and its helper are both less than 10 lines long.  The
- * intent is that this function meets the 10-line criterion in LGPL,
- * allowing this function to be invoked directly from non-LGPL code.
- */
-static inline void _urcu_signal_read_lock(void)
-{
-       unsigned long tmp;
-
-       urcu_assert(URCU_TLS(urcu_signal_reader).registered);
-       cmm_barrier();
-       tmp = URCU_TLS(urcu_signal_reader).ctr;
-       urcu_assert((tmp & URCU_GP_CTR_NEST_MASK) != URCU_GP_CTR_NEST_MASK);
-       _urcu_signal_read_lock_update(tmp);
-}
-
-/*
- * This is a helper function for _rcu_read_unlock().
- *
- * The first cmm_barrier() call ensures that the critical section is
- * seen to precede the store to rcu_reader.ctr.
- * The second cmm_barrier() call ensures that we write to rcu_reader.ctr
- * before reading the update-side futex.
- */
-static inline void _urcu_signal_read_unlock_update_and_wakeup(unsigned long tmp)
-{
-       if (caa_likely((tmp & URCU_GP_CTR_NEST_MASK) == URCU_GP_COUNT)) {
-               cmm_barrier();
-               _CMM_STORE_SHARED(URCU_TLS(urcu_signal_reader).ctr, tmp - URCU_GP_COUNT);
-               cmm_barrier();
-               urcu_common_wake_up_gp(&urcu_signal_gp);
-       } else
-               _CMM_STORE_SHARED(URCU_TLS(urcu_signal_reader).ctr, tmp - URCU_GP_COUNT);
-}
-
-/*
- * Exit an RCU read-side crtical section.  Both this function and its
- * helper are smaller than 10 lines of code, and are intended to be
- * usable by non-LGPL code, as called out in LGPL.
- */
-static inline void _urcu_signal_read_unlock(void)
-{
-       unsigned long tmp;
-
-       urcu_assert(URCU_TLS(urcu_signal_reader).registered);
-       tmp = URCU_TLS(urcu_signal_reader).ctr;
-       urcu_assert(tmp & URCU_GP_CTR_NEST_MASK);
-       _urcu_signal_read_unlock_update_and_wakeup(tmp);
-       cmm_barrier();  /* Ensure the compiler does not reorder us with mutex */
-}
-
-/*
- * Returns whether within a RCU read-side critical section.
- *
- * This function is less than 10 lines long.  The intent is that this
- * function meets the 10-line criterion for LGPL, allowing this function
- * to be invoked directly from non-LGPL code.
- */
-static inline int _urcu_signal_read_ongoing(void)
-{
-       return URCU_TLS(urcu_signal_reader).ctr & URCU_GP_CTR_NEST_MASK;
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _URCU_SIGNAL_STATIC_H */
index b83e72ba6760fa1714a9f5b94da5157667bba502..c164ae31bca00947e2259594a46d48f48ae1d341 100644 (file)
@@ -1,36 +1,22 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_STATIC_H
 #define _URCU_STATIC_H
 
 /*
 #ifndef _URCU_STATIC_H
 #define _URCU_STATIC_H
 
 /*
- * urcu-static.h
- *
  * Userspace RCU header.
  *
  * TO BE INCLUDED ONLY IN CODE THAT IS TO BE RECOMPILED ON EACH LIBURCU
  * RELEASE. See urcu.h for linking dynamically with the userspace rcu library.
  *
  * Userspace RCU header.
  *
  * TO BE INCLUDED ONLY IN CODE THAT IS TO BE RECOMPILED ON EACH LIBURCU
  * RELEASE. See urcu.h for linking dynamically with the userspace rcu library.
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 /* Default is RCU_MEMBARRIER */
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 /* Default is RCU_MEMBARRIER */
-#if !defined(RCU_MEMBARRIER) && !defined(RCU_MB) && !defined(RCU_SIGNAL)
+#if !defined(RCU_MEMBARRIER) && !defined(RCU_MB)
 #define RCU_MEMBARRIER
 #endif
 
 #define RCU_MEMBARRIER
 #endif
 
@@ -42,8 +28,4 @@
 #include <urcu/static/urcu-mb.h>
 #endif
 
 #include <urcu/static/urcu-mb.h>
 #endif
 
-#ifdef RCU_SIGNAL
-#include <urcu/static/urcu-signal.h>
-#endif
-
 #endif /* _URCU_STATIC_H */
 #endif /* _URCU_STATIC_H */
index eae074323479bfc729ad8e06983a38b3407ec316..26741ae81d241ed04f1917b68e7755847c90490b 100644 (file)
@@ -1,36 +1,22 @@
+// SPDX-FileCopyrightText: 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2011-2012 Lai Jiangshan <laijs@cn.fujitsu.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_WFCQUEUE_STATIC_H
 #define _URCU_WFCQUEUE_STATIC_H
 
 /*
 #ifndef _URCU_WFCQUEUE_STATIC_H
 #define _URCU_WFCQUEUE_STATIC_H
 
 /*
- * urcu/static/wfcqueue.h
- *
  * Userspace RCU library - Concurrent Queue with Wait-Free Enqueue/Blocking Dequeue
  *
  * TO BE INCLUDED ONLY IN LGPL-COMPATIBLE CODE. See urcu/wfcqueue.h for
  * linking dynamically with the userspace rcu library.
  * Userspace RCU library - Concurrent Queue with Wait-Free Enqueue/Blocking Dequeue
  *
  * TO BE INCLUDED ONLY IN LGPL-COMPATIBLE CODE. See urcu/wfcqueue.h for
  * linking dynamically with the userspace rcu library.
- *
- * Copyright 2010-2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright 2011-2012 - Lai Jiangshan <laijs@cn.fujitsu.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <pthread.h>
  */
 
 #include <pthread.h>
-#include <assert.h>
 #include <poll.h>
 #include <stdbool.h>
 #include <poll.h>
 #include <stdbool.h>
+#include <urcu/assert.h>
 #include <urcu/compiler.h>
 #include <urcu/uatomic.h>
 
 #include <urcu/compiler.h>
 #include <urcu/uatomic.h>
 
@@ -91,6 +77,11 @@ static inline void _cds_wfcq_node_init(struct cds_wfcq_node *node)
        node->next = NULL;
 }
 
        node->next = NULL;
 }
 
+static inline void _cds_wfcq_node_init_atomic(struct cds_wfcq_node *node)
+{
+       uatomic_store(&node->next, NULL, CMM_RELAXED);
+}
+
 /*
  * cds_wfcq_init: initialize wait-free queue (with lock). Pair with
  * cds_wfcq_destroy().
 /*
  * cds_wfcq_init: initialize wait-free queue (with lock). Pair with
  * cds_wfcq_destroy().
@@ -104,7 +95,7 @@ static inline void _cds_wfcq_init(struct cds_wfcq_head *head,
        _cds_wfcq_node_init(&head->node);
        tail->p = &head->node;
        ret = pthread_mutex_init(&head->lock, NULL);
        _cds_wfcq_node_init(&head->node);
        tail->p = &head->node;
        ret = pthread_mutex_init(&head->lock, NULL);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 }
 
 /*
 }
 
 /*
@@ -112,10 +103,10 @@ static inline void _cds_wfcq_init(struct cds_wfcq_head *head,
  * cds_wfcq_init().
  */
 static inline void _cds_wfcq_destroy(struct cds_wfcq_head *head,
  * cds_wfcq_init().
  */
 static inline void _cds_wfcq_destroy(struct cds_wfcq_head *head,
-               struct cds_wfcq_tail *tail)
+               struct cds_wfcq_tail *tail __attribute__((unused)))
 {
        int ret = pthread_mutex_destroy(&head->lock);
 {
        int ret = pthread_mutex_destroy(&head->lock);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 }
 
 /*
 }
 
 /*
@@ -153,26 +144,26 @@ static inline bool _cds_wfcq_empty(cds_wfcq_head_ptr_t u_head,
         * common case to ensure that dequeuers do not frequently access
         * enqueuer's tail->p cache line.
         */
         * common case to ensure that dequeuers do not frequently access
         * enqueuer's tail->p cache line.
         */
-       return CMM_LOAD_SHARED(head->node.next) == NULL
-               && CMM_LOAD_SHARED(tail->p) == &head->node;
+       return uatomic_load(&head->node.next, CMM_CONSUME) == NULL
+               && uatomic_load(&tail->p, CMM_CONSUME) == &head->node;
 }
 
 static inline void _cds_wfcq_dequeue_lock(struct cds_wfcq_head *head,
 }
 
 static inline void _cds_wfcq_dequeue_lock(struct cds_wfcq_head *head,
-               struct cds_wfcq_tail *tail)
+               struct cds_wfcq_tail *tail __attribute__((unused)))
 {
        int ret;
 
        ret = pthread_mutex_lock(&head->lock);
 {
        int ret;
 
        ret = pthread_mutex_lock(&head->lock);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 }
 
 static inline void _cds_wfcq_dequeue_unlock(struct cds_wfcq_head *head,
 }
 
 static inline void _cds_wfcq_dequeue_unlock(struct cds_wfcq_head *head,
-               struct cds_wfcq_tail *tail)
+               struct cds_wfcq_tail *tail __attribute__((unused)))
 {
        int ret;
 
        ret = pthread_mutex_unlock(&head->lock);
 {
        int ret;
 
        ret = pthread_mutex_unlock(&head->lock);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 }
 
 static inline bool ___cds_wfcq_append(cds_wfcq_head_ptr_t u_head,
 }
 
 static inline bool ___cds_wfcq_append(cds_wfcq_head_ptr_t u_head,
@@ -188,7 +179,7 @@ static inline bool ___cds_wfcq_append(cds_wfcq_head_ptr_t u_head,
         * stores to data structure containing node and setting
         * node->next to NULL before publication.
         */
         * stores to data structure containing node and setting
         * node->next to NULL before publication.
         */
-       old_tail = uatomic_xchg(&tail->p, new_tail);
+       old_tail = uatomic_xchg_mo(&tail->p, new_tail, CMM_SEQ_CST);
 
        /*
         * Implicit memory barrier after uatomic_xchg() orders store to
 
        /*
         * Implicit memory barrier after uatomic_xchg() orders store to
@@ -199,7 +190,8 @@ static inline bool ___cds_wfcq_append(cds_wfcq_head_ptr_t u_head,
         * store will append "node" to the queue from a dequeuer
         * perspective.
         */
         * store will append "node" to the queue from a dequeuer
         * perspective.
         */
-       CMM_STORE_SHARED(old_tail->next, new_head);
+       uatomic_store(&old_tail->next, new_head, CMM_RELEASE);
+
        /*
         * Return false if queue was empty prior to adding the node,
         * else return true.
        /*
         * Return false if queue was empty prior to adding the node,
         * else return true.
@@ -210,8 +202,8 @@ static inline bool ___cds_wfcq_append(cds_wfcq_head_ptr_t u_head,
 /*
  * cds_wfcq_enqueue: enqueue a node into a wait-free queue.
  *
 /*
  * cds_wfcq_enqueue: enqueue a node into a wait-free queue.
  *
- * Issues a full memory barrier before enqueue. No mutual exclusion is
- * required.
+ * Operations prior to enqueue are consistant with respect to dequeuing or
+ * splicing and iterating.
  *
  * Returns false if the queue was empty prior to adding the node.
  * Returns true otherwise.
  *
  * Returns false if the queue was empty prior to adding the node.
  * Returns true otherwise.
@@ -220,6 +212,8 @@ static inline bool _cds_wfcq_enqueue(cds_wfcq_head_ptr_t head,
                struct cds_wfcq_tail *tail,
                struct cds_wfcq_node *new_tail)
 {
                struct cds_wfcq_tail *tail,
                struct cds_wfcq_node *new_tail)
 {
+       cmm_emit_legacy_smp_mb();
+
        return ___cds_wfcq_append(head, tail, new_tail, new_tail);
 }
 
        return ___cds_wfcq_append(head, tail, new_tail, new_tail);
 }
 
@@ -270,8 +264,10 @@ ___cds_wfcq_node_sync_next(struct cds_wfcq_node *node, int blocking)
 
        /*
         * Adaptative busy-looping waiting for enqueuer to complete enqueue.
 
        /*
         * Adaptative busy-looping waiting for enqueuer to complete enqueue.
+        *
+        * Load node.next before loading node's content
         */
         */
-       while ((next = CMM_LOAD_SHARED(node->next)) == NULL) {
+       while ((next = uatomic_load(&node->next, CMM_CONSUME)) == NULL) {
                if (___cds_wfcq_busy_wait(&attempt, blocking))
                        return CDS_WFCQ_WOULDBLOCK;
        }
                if (___cds_wfcq_busy_wait(&attempt, blocking))
                        return CDS_WFCQ_WOULDBLOCK;
        }
@@ -290,8 +286,7 @@ ___cds_wfcq_first(cds_wfcq_head_ptr_t u_head,
        if (_cds_wfcq_empty(__cds_wfcq_head_cast(head), tail))
                return NULL;
        node = ___cds_wfcq_node_sync_next(&head->node, blocking);
        if (_cds_wfcq_empty(__cds_wfcq_head_cast(head), tail))
                return NULL;
        node = ___cds_wfcq_node_sync_next(&head->node, blocking);
-       /* Load head->node.next before loading node's content */
-       cmm_smp_read_barrier_depends();
+
        return node;
 }
 
        return node;
 }
 
@@ -331,7 +326,7 @@ ___cds_wfcq_first_nonblocking(cds_wfcq_head_ptr_t head,
 }
 
 static inline struct cds_wfcq_node *
 }
 
 static inline struct cds_wfcq_node *
-___cds_wfcq_next(cds_wfcq_head_ptr_t head,
+___cds_wfcq_next(cds_wfcq_head_ptr_t head __attribute__((unused)),
                struct cds_wfcq_tail *tail,
                struct cds_wfcq_node *node,
                int blocking)
                struct cds_wfcq_tail *tail,
                struct cds_wfcq_node *node,
                int blocking)
@@ -343,16 +338,15 @@ ___cds_wfcq_next(cds_wfcq_head_ptr_t head,
         * out if we reached the end of the queue, we first check
         * node->next as a common case to ensure that iteration on nodes
         * do not frequently access enqueuer's tail->p cache line.
         * out if we reached the end of the queue, we first check
         * node->next as a common case to ensure that iteration on nodes
         * do not frequently access enqueuer's tail->p cache line.
+        *
+        * Load node->next before loading next's content
         */
         */
-       if ((next = CMM_LOAD_SHARED(node->next)) == NULL) {
-               /* Load node->next before tail->p */
-               cmm_smp_rmb();
-               if (CMM_LOAD_SHARED(tail->p) == node)
+       if ((next = uatomic_load(&node->next, CMM_CONSUME)) == NULL) {
+               if (uatomic_load(&tail->p, CMM_RELAXED) == node)
                        return NULL;
                next = ___cds_wfcq_node_sync_next(node, blocking);
        }
                        return NULL;
                next = ___cds_wfcq_node_sync_next(node, blocking);
        }
-       /* Load node->next before loading next's content */
-       cmm_smp_read_barrier_depends();
+
        return next;
 }
 
        return next;
 }
 
@@ -414,7 +408,7 @@ ___cds_wfcq_dequeue_with_state(cds_wfcq_head_ptr_t u_head,
                return CDS_WFCQ_WOULDBLOCK;
        }
 
                return CDS_WFCQ_WOULDBLOCK;
        }
 
-       if ((next = CMM_LOAD_SHARED(node->next)) == NULL) {
+       if ((next = uatomic_load(&node->next, CMM_CONSUME)) == NULL) {
                /*
                 * @node is probably the only node in the queue.
                 * Try to move the tail to &q->head.
                /*
                 * @node is probably the only node in the queue.
                 * Try to move the tail to &q->head.
@@ -422,17 +416,13 @@ ___cds_wfcq_dequeue_with_state(cds_wfcq_head_ptr_t u_head,
                 * NULL if the cmpxchg succeeds. Should the
                 * cmpxchg fail due to a concurrent enqueue, the
                 * q->head.next will be set to the next node.
                 * NULL if the cmpxchg succeeds. Should the
                 * cmpxchg fail due to a concurrent enqueue, the
                 * q->head.next will be set to the next node.
-                * The implicit memory barrier before
-                * uatomic_cmpxchg() orders load node->next
-                * before loading q->tail.
-                * The implicit memory barrier before uatomic_cmpxchg
-                * orders load q->head.next before loading node's
-                * content.
                 */
                 */
-               _cds_wfcq_node_init(&head->node);
-               if (uatomic_cmpxchg(&tail->p, node, &head->node) == node) {
+               _cds_wfcq_node_init_atomic(&head->node);
+               if (uatomic_cmpxchg_mo(&tail->p, node, &head->node,
+                                       CMM_SEQ_CST, CMM_SEQ_CST) == node) {
                        if (state)
                                *state |= CDS_WFCQ_STATE_LAST;
                        if (state)
                                *state |= CDS_WFCQ_STATE_LAST;
+                       cmm_emit_legacy_smp_mb();
                        return node;
                }
                next = ___cds_wfcq_node_sync_next(node, blocking);
                        return node;
                }
                next = ___cds_wfcq_node_sync_next(node, blocking);
@@ -442,7 +432,7 @@ ___cds_wfcq_dequeue_with_state(cds_wfcq_head_ptr_t u_head,
                 * (currently NULL) back to its original value.
                 */
                if (!blocking && next == CDS_WFCQ_WOULDBLOCK) {
                 * (currently NULL) back to its original value.
                 */
                if (!blocking && next == CDS_WFCQ_WOULDBLOCK) {
-                       head->node.next = node;
+                       uatomic_store(&head->node.next, node, CMM_RELAXED);
                        return CDS_WFCQ_WOULDBLOCK;
                }
        }
                        return CDS_WFCQ_WOULDBLOCK;
                }
        }
@@ -450,10 +440,9 @@ ___cds_wfcq_dequeue_with_state(cds_wfcq_head_ptr_t u_head,
        /*
         * Move queue head forward.
         */
        /*
         * Move queue head forward.
         */
-       head->node.next = next;
+       uatomic_store(&head->node.next, next, CMM_RELAXED);
+       cmm_emit_legacy_smp_mb();
 
 
-       /* Load q->head.next before loading node's content */
-       cmm_smp_read_barrier_depends();
        return node;
 }
 
        return node;
 }
 
@@ -515,6 +504,8 @@ ___cds_wfcq_dequeue_nonblocking(cds_wfcq_head_ptr_t head,
 /*
  * __cds_wfcq_splice: enqueue all src_q nodes at the end of dest_q.
  *
 /*
  * __cds_wfcq_splice: enqueue all src_q nodes at the end of dest_q.
  *
+ * Operations after splice are consistant with respect to enqueue.
+ *
  * Dequeue all nodes from src_q.
  * dest_q must be already initialized.
  * Mutual exclusion for src_q should be ensured by the caller as
  * Dequeue all nodes from src_q.
  * dest_q must be already initialized.
  * Mutual exclusion for src_q should be ensured by the caller as
@@ -548,10 +539,10 @@ ___cds_wfcq_splice(
                 * uatomic_xchg, as well as tail pointer vs head node
                 * address.
                 */
                 * uatomic_xchg, as well as tail pointer vs head node
                 * address.
                 */
-               head = uatomic_xchg(&src_q_head->node.next, NULL);
+               head = uatomic_xchg_mo(&src_q_head->node.next, NULL, CMM_SEQ_CST);
                if (head)
                        break;  /* non-empty */
                if (head)
                        break;  /* non-empty */
-               if (CMM_LOAD_SHARED(src_q_tail->p) == &src_q_head->node)
+               if (uatomic_load(&src_q_tail->p, CMM_CONSUME) == &src_q_head->node)
                        return CDS_WFCQ_RET_SRC_EMPTY;
                if (___cds_wfcq_busy_wait(&attempt, blocking))
                        return CDS_WFCQ_RET_WOULDBLOCK;
                        return CDS_WFCQ_RET_SRC_EMPTY;
                if (___cds_wfcq_busy_wait(&attempt, blocking))
                        return CDS_WFCQ_RET_WOULDBLOCK;
@@ -563,7 +554,8 @@ ___cds_wfcq_splice(
         * concurrent enqueue on src_q, which exchanges the tail before
         * updating the previous tail's next pointer.
         */
         * concurrent enqueue on src_q, which exchanges the tail before
         * updating the previous tail's next pointer.
         */
-       tail = uatomic_xchg(&src_q_tail->p, &src_q_head->node);
+       cmm_emit_legacy_smp_mb();
+       tail = uatomic_xchg_mo(&src_q_tail->p, &src_q_head->node, CMM_SEQ_CST);
 
        /*
         * Append the spliced content of src_q into dest_q. Does not
 
        /*
         * Append the spliced content of src_q into dest_q. Does not
index df9f62f28bafa189a5b2f0d61fcbfce8b978b7b4..0cb7b1b98cd965557121af56910687c94c2ecdd8 100644 (file)
@@ -1,34 +1,20 @@
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_WFQUEUE_STATIC_H
 #define _URCU_WFQUEUE_STATIC_H
 
 /*
 #ifndef _URCU_WFQUEUE_STATIC_H
 #define _URCU_WFQUEUE_STATIC_H
 
 /*
- * wfqueue-static.h
- *
  * Userspace RCU library - Queue with Wait-Free Enqueue/Blocking Dequeue
  *
  * TO BE INCLUDED ONLY IN LGPL-COMPATIBLE CODE. See wfqueue.h for linking
  * dynamically with the userspace rcu library.
  * Userspace RCU library - Queue with Wait-Free Enqueue/Blocking Dequeue
  *
  * TO BE INCLUDED ONLY IN LGPL-COMPATIBLE CODE. See wfqueue.h for linking
  * dynamically with the userspace rcu library.
- *
- * Copyright 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <pthread.h>
  */
 
 #include <pthread.h>
-#include <assert.h>
 #include <poll.h>
 #include <poll.h>
+#include <urcu/assert.h>
 #include <urcu/compiler.h>
 #include <urcu/uatomic.h>
 
 #include <urcu/compiler.h>
 #include <urcu/uatomic.h>
 
@@ -62,13 +48,13 @@ static inline void _cds_wfq_init(struct cds_wfq_queue *q)
        q->head = &q->dummy;
        q->tail = &q->dummy.next;
        ret = pthread_mutex_init(&q->lock, NULL);
        q->head = &q->dummy;
        q->tail = &q->dummy.next;
        ret = pthread_mutex_init(&q->lock, NULL);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 }
 
 static inline void _cds_wfq_destroy(struct cds_wfq_queue *q)
 {
        int ret = pthread_mutex_destroy(&q->lock);
 }
 
 static inline void _cds_wfq_destroy(struct cds_wfq_queue *q)
 {
        int ret = pthread_mutex_destroy(&q->lock);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 }
 
 static inline void _cds_wfq_enqueue(struct cds_wfq_queue *q,
 }
 
 static inline void _cds_wfq_enqueue(struct cds_wfq_queue *q,
@@ -81,13 +67,14 @@ static inline void _cds_wfq_enqueue(struct cds_wfq_queue *q,
         * structure containing node and setting node->next to NULL before
         * publication.
         */
         * structure containing node and setting node->next to NULL before
         * publication.
         */
-       old_tail = uatomic_xchg(&q->tail, &node->next);
+       cmm_emit_legacy_smp_mb();
+       old_tail = uatomic_xchg_mo(&q->tail, &node->next, CMM_SEQ_CST);
        /*
         * At this point, dequeuers see a NULL old_tail->next, which indicates
         * that the queue is being appended to. The following store will append
         * "node" to the queue from a dequeuer perspective.
         */
        /*
         * At this point, dequeuers see a NULL old_tail->next, which indicates
         * that the queue is being appended to. The following store will append
         * "node" to the queue from a dequeuer perspective.
         */
-       CMM_STORE_SHARED(*old_tail, node);
+       uatomic_store(old_tail, node, CMM_RELEASE);
 }
 
 /*
 }
 
 /*
@@ -102,7 +89,7 @@ ___cds_wfq_node_sync_next(struct cds_wfq_node *node)
        /*
         * Adaptative busy-looping waiting for enqueuer to complete enqueue.
         */
        /*
         * Adaptative busy-looping waiting for enqueuer to complete enqueue.
         */
-       while ((next = CMM_LOAD_SHARED(node->next)) == NULL) {
+       while ((next = uatomic_load(&node->next, CMM_CONSUME)) == NULL) {
                if (++attempt >= WFQ_ADAPT_ATTEMPTS) {
                        (void) poll(NULL, 0, WFQ_WAIT); /* Wait for 10ms */
                        attempt = 0;
                if (++attempt >= WFQ_ADAPT_ATTEMPTS) {
                        (void) poll(NULL, 0, WFQ_WAIT); /* Wait for 10ms */
                        attempt = 0;
@@ -129,7 +116,7 @@ ___cds_wfq_dequeue_blocking(struct cds_wfq_queue *q)
        /*
         * Queue is empty if it only contains the dummy node.
         */
        /*
         * Queue is empty if it only contains the dummy node.
         */
-       if (q->head == &q->dummy && CMM_LOAD_SHARED(q->tail) == &q->dummy.next)
+       if (q->head == &q->dummy && uatomic_load(&q->tail, CMM_CONSUME) == &q->dummy.next)
                return NULL;
        node = q->head;
 
                return NULL;
        node = q->head;
 
@@ -157,10 +144,10 @@ _cds_wfq_dequeue_blocking(struct cds_wfq_queue *q)
        int ret;
 
        ret = pthread_mutex_lock(&q->lock);
        int ret;
 
        ret = pthread_mutex_lock(&q->lock);
-       assert(!ret);
+       urcu_posix_assert(!ret);
        retnode = ___cds_wfq_dequeue_blocking(q);
        ret = pthread_mutex_unlock(&q->lock);
        retnode = ___cds_wfq_dequeue_blocking(q);
        ret = pthread_mutex_unlock(&q->lock);
-       assert(!ret);
+       urcu_posix_assert(!ret);
        return retnode;
 }
 
        return retnode;
 }
 
index e96c8876a2b916dcd5bde1e1ba2ad3f8b5ff4ec8..c46e97d9f25197e0e701a55ef24b0975bd1b2aac 100644 (file)
@@ -1,35 +1,21 @@
+// SPDX-FileCopyrightText: 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_STATIC_WFSTACK_H
 #define _URCU_STATIC_WFSTACK_H
 
 /*
 #ifndef _URCU_STATIC_WFSTACK_H
 #define _URCU_STATIC_WFSTACK_H
 
 /*
- * urcu/static/wfstack.h
- *
  * Userspace RCU library - Stack with with wait-free push, blocking traversal.
  *
  * TO BE INCLUDED ONLY IN LGPL-COMPATIBLE CODE. See urcu/wfstack.h for
  * linking dynamically with the userspace rcu library.
  * Userspace RCU library - Stack with with wait-free push, blocking traversal.
  *
  * TO BE INCLUDED ONLY IN LGPL-COMPATIBLE CODE. See urcu/wfstack.h for
  * linking dynamically with the userspace rcu library.
- *
- * Copyright 2010-2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <pthread.h>
  */
 
 #include <pthread.h>
-#include <assert.h>
 #include <poll.h>
 #include <stdbool.h>
 #include <poll.h>
 #include <stdbool.h>
+#include <urcu/assert.h>
 #include <urcu/compiler.h>
 #include <urcu/uatomic.h>
 
 #include <urcu/compiler.h>
 #include <urcu/uatomic.h>
 
@@ -37,7 +23,7 @@
 extern "C" {
 #endif
 
 extern "C" {
 #endif
 
-#define CDS_WFS_END                    ((void *) 0x1UL)
+#define CDS_WFS_END                    ((struct cds_wfs_head *) 0x1UL)
 #define CDS_WFS_ADAPT_ATTEMPTS         10      /* Retry if being set */
 #define CDS_WFS_WAIT                   10      /* Wait 10 ms if being set */
 
 #define CDS_WFS_ADAPT_ATTEMPTS         10      /* Retry if being set */
 #define CDS_WFS_WAIT                   10      /* Wait 10 ms if being set */
 
@@ -96,7 +82,7 @@ void _cds_wfs_init(struct cds_wfs_stack *s)
 
        s->head = CDS_WFS_END;
        ret = pthread_mutex_init(&s->lock, NULL);
 
        s->head = CDS_WFS_END;
        ret = pthread_mutex_init(&s->lock, NULL);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 }
 
 /*
 }
 
 /*
@@ -107,7 +93,7 @@ static inline
 void _cds_wfs_destroy(struct cds_wfs_stack *s)
 {
        int ret = pthread_mutex_destroy(&s->lock);
 void _cds_wfs_destroy(struct cds_wfs_stack *s)
 {
        int ret = pthread_mutex_destroy(&s->lock);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 }
 
 static inline bool ___cds_wfs_end(void *node)
 }
 
 static inline bool ___cds_wfs_end(void *node)
@@ -124,7 +110,7 @@ static inline bool _cds_wfs_empty(cds_wfs_stack_ptr_t u_stack)
 {
        struct __cds_wfs_stack *s = u_stack._s;
 
 {
        struct __cds_wfs_stack *s = u_stack._s;
 
-       return ___cds_wfs_end(CMM_LOAD_SHARED(s->head));
+       return ___cds_wfs_end(uatomic_load(&s->head, CMM_RELAXED));
 }
 
 /*
 }
 
 /*
@@ -133,6 +119,8 @@ static inline bool _cds_wfs_empty(cds_wfs_stack_ptr_t u_stack)
  * Issues a full memory barrier before push. No mutual exclusion is
  * required.
  *
  * Issues a full memory barrier before push. No mutual exclusion is
  * required.
  *
+ * Operations before push are consistent when observed after associated pop.
+ *
  * Returns 0 if the stack was empty prior to adding the node.
  * Returns non-zero otherwise.
  */
  * Returns 0 if the stack was empty prior to adding the node.
  * Returns non-zero otherwise.
  */
@@ -142,18 +130,19 @@ int _cds_wfs_push(cds_wfs_stack_ptr_t u_stack, struct cds_wfs_node *node)
        struct __cds_wfs_stack *s = u_stack._s;
        struct cds_wfs_head *old_head, *new_head;
 
        struct __cds_wfs_stack *s = u_stack._s;
        struct cds_wfs_head *old_head, *new_head;
 
-       assert(node->next == NULL);
+       urcu_posix_assert(node->next == NULL);
        new_head = caa_container_of(node, struct cds_wfs_head, node);
        /*
         * uatomic_xchg() implicit memory barrier orders earlier stores
         * to node (setting it to NULL) before publication.
         */
        new_head = caa_container_of(node, struct cds_wfs_head, node);
        /*
         * uatomic_xchg() implicit memory barrier orders earlier stores
         * to node (setting it to NULL) before publication.
         */
-       old_head = uatomic_xchg(&s->head, new_head);
+       cmm_emit_legacy_smp_mb();
+       old_head = uatomic_xchg_mo(&s->head, new_head, CMM_SEQ_CST);
        /*
         * At this point, dequeuers see a NULL node->next, they should
         * busy-wait until node->next is set to old_head.
         */
        /*
         * At this point, dequeuers see a NULL node->next, they should
         * busy-wait until node->next is set to old_head.
         */
-       CMM_STORE_SHARED(node->next, &old_head->node);
+       uatomic_store(&node->next, &old_head->node, CMM_RELEASE);
        return !___cds_wfs_end(old_head);
 }
 
        return !___cds_wfs_end(old_head);
 }
 
@@ -169,7 +158,7 @@ ___cds_wfs_node_sync_next(struct cds_wfs_node *node, int blocking)
        /*
         * Adaptative busy-looping waiting for push to complete.
         */
        /*
         * Adaptative busy-looping waiting for push to complete.
         */
-       while ((next = CMM_LOAD_SHARED(node->next)) == NULL) {
+       while ((next = uatomic_load(&node->next, CMM_CONSUME)) == NULL) {
                if (!blocking)
                        return CDS_WFS_WOULDBLOCK;
                if (++attempt >= CDS_WFS_ADAPT_ATTEMPTS) {
                if (!blocking)
                        return CDS_WFS_WOULDBLOCK;
                if (++attempt >= CDS_WFS_ADAPT_ATTEMPTS) {
@@ -194,7 +183,7 @@ ___cds_wfs_pop(cds_wfs_stack_ptr_t u_stack, int *state, int blocking)
        if (state)
                *state = 0;
        for (;;) {
        if (state)
                *state = 0;
        for (;;) {
-               head = CMM_LOAD_SHARED(s->head);
+               head = uatomic_load(&s->head, CMM_CONSUME);
                if (___cds_wfs_end(head)) {
                        return NULL;
                }
                if (___cds_wfs_end(head)) {
                        return NULL;
                }
@@ -203,9 +192,11 @@ ___cds_wfs_pop(cds_wfs_stack_ptr_t u_stack, int *state, int blocking)
                        return CDS_WFS_WOULDBLOCK;
                }
                new_head = caa_container_of(next, struct cds_wfs_head, node);
                        return CDS_WFS_WOULDBLOCK;
                }
                new_head = caa_container_of(next, struct cds_wfs_head, node);
-               if (uatomic_cmpxchg(&s->head, head, new_head) == head) {
+               if (uatomic_cmpxchg_mo(&s->head, head, new_head,
+                                       CMM_SEQ_CST, CMM_SEQ_CST) == head) {
                        if (state && ___cds_wfs_end(new_head))
                                *state |= CDS_WFS_STATE_LAST;
                        if (state && ___cds_wfs_end(new_head))
                                *state |= CDS_WFS_STATE_LAST;
+                       cmm_emit_legacy_smp_mb();
                        return &head->node;
                }
                if (!blocking) {
                        return &head->node;
                }
                if (!blocking) {
@@ -220,6 +211,8 @@ ___cds_wfs_pop(cds_wfs_stack_ptr_t u_stack, int *state, int blocking)
  *
  * Returns NULL if stack is empty.
  *
  *
  * Returns NULL if stack is empty.
  *
+ * Operations after pop push are consistent when observed before associated push.
+ *
  * __cds_wfs_pop_blocking needs to be synchronized using one of the
  * following techniques:
  *
  * __cds_wfs_pop_blocking needs to be synchronized using one of the
  * following techniques:
  *
@@ -278,6 +271,8 @@ ___cds_wfs_pop_nonblocking(cds_wfs_stack_ptr_t u_stack)
 /*
  * __cds_wfs_pop_all: pop all nodes from a stack.
  *
 /*
  * __cds_wfs_pop_all: pop all nodes from a stack.
  *
+ * Operations after pop push are consistent when observed before associated push.
+ *
  * __cds_wfs_pop_all does not require any synchronization with other
  * push, nor with other __cds_wfs_pop_all, but requires synchronization
  * matching the technique used to synchronize __cds_wfs_pop_blocking:
  * __cds_wfs_pop_all does not require any synchronization with other
  * push, nor with other __cds_wfs_pop_all, but requires synchronization
  * matching the technique used to synchronize __cds_wfs_pop_blocking:
@@ -309,7 +304,8 @@ ___cds_wfs_pop_all(cds_wfs_stack_ptr_t u_stack)
         * taking care to order writes to each node prior to the full
         * memory barrier after this uatomic_xchg().
         */
         * taking care to order writes to each node prior to the full
         * memory barrier after this uatomic_xchg().
         */
-       head = uatomic_xchg(&s->head, CDS_WFS_END);
+       head = uatomic_xchg_mo(&s->head, CDS_WFS_END, CMM_SEQ_CST);
+       cmm_emit_legacy_smp_mb();
        if (___cds_wfs_end(head))
                return NULL;
        return head;
        if (___cds_wfs_end(head))
                return NULL;
        return head;
@@ -323,7 +319,7 @@ static inline void _cds_wfs_pop_lock(struct cds_wfs_stack *s)
        int ret;
 
        ret = pthread_mutex_lock(&s->lock);
        int ret;
 
        ret = pthread_mutex_lock(&s->lock);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 }
 
 /*
 }
 
 /*
@@ -334,7 +330,7 @@ static inline void _cds_wfs_pop_unlock(struct cds_wfs_stack *s)
        int ret;
 
        ret = pthread_mutex_unlock(&s->lock);
        int ret;
 
        ret = pthread_mutex_unlock(&s->lock);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 }
 
 /*
 }
 
 /*
@@ -345,9 +341,11 @@ struct cds_wfs_node *
 _cds_wfs_pop_with_state_blocking(struct cds_wfs_stack *s, int *state)
 {
        struct cds_wfs_node *retnode;
 _cds_wfs_pop_with_state_blocking(struct cds_wfs_stack *s, int *state)
 {
        struct cds_wfs_node *retnode;
+       cds_wfs_stack_ptr_t stack;
 
        _cds_wfs_pop_lock(s);
 
        _cds_wfs_pop_lock(s);
-       retnode = ___cds_wfs_pop_with_state_blocking(s, state);
+       stack.s = s;
+       retnode = ___cds_wfs_pop_with_state_blocking(stack, state);
        _cds_wfs_pop_unlock(s);
        return retnode;
 }
        _cds_wfs_pop_unlock(s);
        return retnode;
 }
@@ -370,9 +368,11 @@ struct cds_wfs_head *
 _cds_wfs_pop_all_blocking(struct cds_wfs_stack *s)
 {
        struct cds_wfs_head *rethead;
 _cds_wfs_pop_all_blocking(struct cds_wfs_stack *s)
 {
        struct cds_wfs_head *rethead;
+       cds_wfs_stack_ptr_t stack;
 
        _cds_wfs_pop_lock(s);
 
        _cds_wfs_pop_lock(s);
-       rethead = ___cds_wfs_pop_all(s);
+       stack.s = s;
+       rethead = ___cds_wfs_pop_all(stack);
        _cds_wfs_pop_unlock(s);
        return rethead;
 }
        _cds_wfs_pop_unlock(s);
        return rethead;
 }
index fa63a7bbee8eda960dfaf4d1709ca0595189ccc2..d49b9886b8d004e01db531f7ec860ab28093ab67 100644 (file)
@@ -1,30 +1,12 @@
+// SPDX-FileCopyrightText: 2013 Pierre-Luc St-Charles <pierre-luc.st-charles@polymtl.ca>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_SYSCALL_COMPAT_H
 #define _URCU_SYSCALL_COMPAT_H
 
 /*
 #ifndef _URCU_SYSCALL_COMPAT_H
 #define _URCU_SYSCALL_COMPAT_H
 
 /*
- * urcu/syscall-compat.h
- *
  * Userspace RCU library - Syscall Compatibility Header
  * Userspace RCU library - Syscall Compatibility Header
- *
- * Copyright 2013 - Pierre-Luc St-Charles <pierre-luc.st-charles@polymtl.ca>
- *
- * Note: this file is only used to simplify the code required to
- * include the 'syscall.h' system header across multiple platforms,
- * which might not always be located at the same place (or needed at all).
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #if defined(__ANDROID__) || defined(__sun__) || defined(__GNU__)
  */
 
 #if defined(__ANDROID__) || defined(__sun__) || defined(__GNU__)
 #elif defined(__linux__) || defined(__GLIBC__)
 #include <syscall.h>
 
 #elif defined(__linux__) || defined(__GLIBC__)
 #include <syscall.h>
 
-#elif defined(__CYGWIN__) || defined(__APPLE__)
-/* Don't include anything on Cygwin or MacOSX. */
+#elif defined(__CYGWIN__) || defined(__APPLE__) || \
+       defined(__FreeBSD__) || defined(__DragonFly__) || \
+       defined(__OpenBSD__)
+/* Don't include anything on these platforms. */
 
 #else
 #error "Add platform support to urcu/syscall-compat.h"
 
 #else
 #error "Add platform support to urcu/syscall-compat.h"
index faae39055484875b237dd62dd0928e9903725da1..139c37f6d474a646141bb0650b6f8c936061a9a2 100644 (file)
@@ -1,27 +1,37 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 #ifndef _URCU_SYSTEM_H
 #define _URCU_SYSTEM_H
 
 /*
 #ifndef _URCU_SYSTEM_H
 #define _URCU_SYSTEM_H
 
 /*
- * system.h
- *
  * System definitions.
  * System definitions.
- *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
  */
 
  */
 
+#include <urcu/config.h>
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
 
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
 
+#ifdef CONFIG_RCU_USE_ATOMIC_BUILTINS
+
+#define CMM_LOAD_SHARED(x)                                             \
+       __atomic_load_n(cmm_cast_volatile(&(x)), __ATOMIC_RELAXED)
+
+#define _CMM_LOAD_SHARED(x) CMM_LOAD_SHARED(x)
+
+#define CMM_STORE_SHARED(x, v)                                 \
+       __extension__                                           \
+       ({                                                      \
+               __typeof__(v) _v = (v);                         \
+               __atomic_store_n(cmm_cast_volatile(&(x)), _v,   \
+                                __ATOMIC_RELAXED);             \
+               _v;                                             \
+       })
+
+#define _CMM_STORE_SHARED(x, v) CMM_STORE_SHARED(x, v)
+
+#else
 /*
  * Identify a shared load. A cmm_smp_rmc() or cmm_smp_mc() should come
  * before the load.
 /*
  * Identify a shared load. A cmm_smp_rmc() or cmm_smp_mc() should come
  * before the load.
@@ -56,4 +66,6 @@
                _v = _v;        /* Work around clang "unused result" */ \
        })
 
                _v = _v;        /* Work around clang "unused result" */ \
        })
 
+#endif /* CONFIG_RCU_USE_ATOMIC_BUILTINS */
+
 #endif /* _URCU_SYSTEM_H */
 #endif /* _URCU_SYSTEM_H */
index 8ac1ea0615ddc2eb91ee51e9e15b89bd094d4c81..1f3ef0fbbdb5bfe8f03d58e642ccdc1373e2f54c 100644 (file)
@@ -1,26 +1,12 @@
+// SPDX-FileCopyrightText: 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_TLS_COMPAT_H
 #define _URCU_TLS_COMPAT_H
 
 /*
 #ifndef _URCU_TLS_COMPAT_H
 #define _URCU_TLS_COMPAT_H
 
 /*
- * urcu/tls-compat.h
- *
  * Userspace RCU library - Thread-Local Storage Compatibility Header
  * Userspace RCU library - Thread-Local Storage Compatibility Header
- *
- * Copyright 2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <stdlib.h>
  */
 
 #include <stdlib.h>
 extern "C" {
 #endif
 
 extern "C" {
 #endif
 
-#ifdef CONFIG_RCU_TLS  /* Based on ax_tls.m4 */
+#ifdef CONFIG_RCU_TLS
+
+/*
+ * Default to '__thread' on all C and C++ compilers except MSVC. While C11 has
+ * '_Thread_local' and C++11 has 'thread_local', only '__thread' seems to have
+ * a compatible implementation when linking public extern symbols across
+ * language boundaries.
+ *
+ * For more details, see 'https://gcc.gnu.org/onlinedocs/gcc/Thread-Local.html'.
+ */
+#if defined(_MSC_VER)
+# define URCU_TLS_STORAGE_CLASS        __declspec(thread)
+#else
+# define URCU_TLS_STORAGE_CLASS        __thread
+#endif
 
 /*
  * Hint: How to define/declare TLS variables of compound types
 
 /*
  * Hint: How to define/declare TLS variables of compound types
@@ -65,10 +65,13 @@ extern "C" {
  */
 
 # define DECLARE_URCU_TLS(type, name)  \
  */
 
 # define DECLARE_URCU_TLS(type, name)  \
-       CONFIG_RCU_TLS type name
+       URCU_TLS_STORAGE_CLASS type name
 
 # define DEFINE_URCU_TLS(type, name)   \
 
 # define DEFINE_URCU_TLS(type, name)   \
-       CONFIG_RCU_TLS type name
+       URCU_TLS_STORAGE_CLASS type name
+
+# define DEFINE_URCU_TLS_INIT(type, name, init)        \
+       URCU_TLS_STORAGE_CLASS type name = (init)
 
 # define URCU_TLS(name)                (name)
 
 
 # define URCU_TLS(name)                (name)
 
@@ -95,14 +98,15 @@ struct urcu_tls {
  * Note: we don't free memory at process exit, since it will be dealt
  * with by the OS.
  */
  * Note: we don't free memory at process exit, since it will be dealt
  * with by the OS.
  */
-# define DEFINE_URCU_TLS_1(type, name)                         \
+# define DEFINE_URCU_TLS_INIT_1(type, name, do_init)           \
        type *__tls_access_ ## name(void)                       \
        {                                                       \
                static struct urcu_tls __tls_ ## name = {       \
        type *__tls_access_ ## name(void)                       \
        {                                                       \
                static struct urcu_tls __tls_ ## name = {       \
+                       .key = 0,                               \
                        .init_mutex = PTHREAD_MUTEX_INITIALIZER,\
                        .init_done = 0,                         \
                };                                              \
                        .init_mutex = PTHREAD_MUTEX_INITIALIZER,\
                        .init_done = 0,                         \
                };                                              \
-               void *__tls_p;                                  \
+               __typeof__(type) *__tls_p;                      \
                if (!__tls_ ## name.init_done) {                \
                        /* Mutex to protect concurrent init */  \
                        pthread_mutex_lock(&__tls_ ## name.init_mutex); \
                if (!__tls_ ## name.init_done) {                \
                        /* Mutex to protect concurrent init */  \
                        pthread_mutex_lock(&__tls_ ## name.init_mutex); \
@@ -115,17 +119,24 @@ struct urcu_tls {
                        pthread_mutex_unlock(&__tls_ ## name.init_mutex); \
                }                                               \
                cmm_smp_rmb();  /* read init_done before getting key */ \
                        pthread_mutex_unlock(&__tls_ ## name.init_mutex); \
                }                                               \
                cmm_smp_rmb();  /* read init_done before getting key */ \
-               __tls_p = pthread_getspecific(__tls_ ## name.key); \
+               __tls_p = (__typeof__(type) *) pthread_getspecific(__tls_ ## name.key); \
                if (caa_unlikely(__tls_p == NULL)) {            \
                if (caa_unlikely(__tls_p == NULL)) {            \
-                       __tls_p = calloc(1, sizeof(type));      \
+                       __tls_p = (__typeof__(type) *) calloc(1, sizeof(type)); \
+                       do_init                                 \
                        (void) pthread_setspecific(__tls_ ## name.key,  \
                                __tls_p);                       \
                }                                               \
                return __tls_p;                                 \
        }
 
                        (void) pthread_setspecific(__tls_ ## name.key,  \
                                __tls_p);                       \
                }                                               \
                return __tls_p;                                 \
        }
 
+# define _URCU_TLS_INIT(init)                                  \
+       *__tls_p = (init);
+
+# define DEFINE_URCU_TLS_INIT(type, name, init)                        \
+       DEFINE_URCU_TLS_INIT_1(type, name, _URCU_TLS_INIT(init))
+
 # define DEFINE_URCU_TLS(type, name)                           \
 # define DEFINE_URCU_TLS(type, name)                           \
-       DEFINE_URCU_TLS_1(type, name)
+       DEFINE_URCU_TLS_INIT_1(type, name, /* empty */)
 
 # define URCU_TLS_1(name)      (*__tls_access_ ## name())
 
 
 # define URCU_TLS_1(name)      (*__tls_access_ ## name())
 
diff --git a/include/urcu/uatomic.h b/include/urcu/uatomic.h
new file mode 100644 (file)
index 0000000..561c829
--- /dev/null
@@ -0,0 +1,102 @@
+// SPDX-FileCopyrightText: 2020 Michael Jeanson <mjeanson@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+#ifndef _URCU_UATOMIC_H
+#define _URCU_UATOMIC_H
+
+#include <urcu/arch.h>
+#include <urcu/compiler.h>
+#include <urcu/config.h>
+
+enum cmm_memorder {
+       CMM_RELAXED = 0,
+       CMM_CONSUME = 1,
+       CMM_ACQUIRE = 2,
+       CMM_RELEASE = 3,
+       CMM_ACQ_REL = 4,
+       CMM_SEQ_CST = 5,
+       CMM_SEQ_CST_FENCE = 6,
+};
+
+#ifdef CONFIG_RCU_USE_ATOMIC_BUILTINS
+
+/*
+ * Make sure that CMM_SEQ_CST_FENCE is not equivalent to other memory orders.
+ */
+urcu_static_assert(CMM_RELAXED == __ATOMIC_RELAXED, "CMM_RELAXED vs __ATOMIC_RELAXED values mismatch", cmm_relaxed_values_mismatch);
+urcu_static_assert(CMM_CONSUME == __ATOMIC_CONSUME, "CMM_CONSUME vs __ATOMIC_CONSUME values mismatch", cmm_consume_values_mismatch);
+urcu_static_assert(CMM_ACQUIRE == __ATOMIC_ACQUIRE, "CMM_ACQUIRE vs __ATOMIC_ACQUIRE values mismatch", cmm_acquire_values_mismatch);
+urcu_static_assert(CMM_RELEASE == __ATOMIC_RELEASE, "CMM_RELEASE vs __ATOMIC_RELEASE values mismatch", cmm_release_values_mismatch);
+urcu_static_assert(CMM_ACQ_REL == __ATOMIC_ACQ_REL, "CMM_ACQ_REL vs __ATOMIC_ACQ_REL values mismatch", cmm_acq_rel_values_mismatch);
+urcu_static_assert(CMM_SEQ_CST == __ATOMIC_SEQ_CST, "CMM_SEQ_CST vs __ATOMIC_SEQ_CST values mismatch", cmm_seq_cst_values_mismatch);
+
+/*
+ * This is not part of the public API. It it used internally to implement the
+ * CMM_SEQ_CST_FENCE memory order.
+ *
+ * NOTE: Using switch here instead of if statement to avoid -Wduplicated-cond
+ * warning when memory order is conditionally determined.
+ */
+static inline void cmm_seq_cst_fence_after_atomic(enum cmm_memorder mo)
+{
+       switch (mo) {
+       case CMM_SEQ_CST_FENCE:
+               cmm_smp_mb();
+               break;
+       default:
+               break;
+       }
+}
+
+#endif
+
+/*
+ * This is not part of the public API. It is used internally to convert from the
+ * CMM memory model to the C11 memory model.
+ */
+static inline int cmm_to_c11(int mo)
+{
+       if (mo == CMM_SEQ_CST_FENCE) {
+               return CMM_SEQ_CST;
+       }
+       return mo;
+}
+
+#if defined(CONFIG_RCU_USE_ATOMIC_BUILTINS)
+#include <urcu/uatomic/builtins.h>
+#elif defined(URCU_ARCH_X86)
+#include <urcu/uatomic/x86.h>
+#elif defined(URCU_ARCH_PPC)
+#include <urcu/uatomic/ppc.h>
+#elif defined(URCU_ARCH_S390)
+#include <urcu/uatomic/s390.h>
+#elif defined(URCU_ARCH_SPARC64)
+#include <urcu/uatomic/sparc64.h>
+#elif defined(URCU_ARCH_ALPHA)
+#include <urcu/uatomic/alpha.h>
+#elif defined(URCU_ARCH_IA64)
+#include <urcu/uatomic/ia64.h>
+#elif defined(URCU_ARCH_ARM)
+#include <urcu/uatomic/arm.h>
+#elif defined(URCU_ARCH_AARCH64)
+#include <urcu/uatomic/aarch64.h>
+#elif defined(URCU_ARCH_MIPS)
+#include <urcu/uatomic/mips.h>
+#elif defined(URCU_ARCH_NIOS2)
+#include <urcu/uatomic/nios2.h>
+#elif defined(URCU_ARCH_TILE)
+#include <urcu/uatomic/tile.h>
+#elif defined(URCU_ARCH_HPPA)
+#include <urcu/uatomic/hppa.h>
+#elif defined(URCU_ARCH_M68K)
+#include <urcu/uatomic/m68k.h>
+#elif defined(URCU_ARCH_RISCV)
+#include <urcu/uatomic/riscv.h>
+#elif defined(URCU_ARCH_LOONGARCH)
+#include <urcu/uatomic/loongarch.h>
+#else
+#error "Cannot build: unrecognized architecture, see <urcu/arch.h>."
+#endif
+
+#endif /* _URCU_UATOMIC_H */
index 58698ce5d405f3a23b83ea013b3fe0ec23e1baf1..31d428d339ececff3910a5e499317b809e0c133f 100644 (file)
@@ -1,23 +1,15 @@
+// SPDX-FileCopyrightText: 1991-1994 by Xerox Corporation.  All rights reserved.
+// SPDX-FileCopyrightText: 1996-1999 by Silicon Graphics.  All rights reserved.
+// SPDX-FileCopyrightText: 1999-2004 Hewlett-Packard Development Company, L.P.
+// SPDX-FileCopyrightText: 2009-2015 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2010 Paul E. McKenney, IBM Corporation
+//
+// SPDX-License-Identifier: LicenseRef-Boehm-GC
+
 #ifndef _URCU_ARCH_UATOMIC_AARCH64_H
 #define _URCU_ARCH_UATOMIC_AARCH64_H
 
 /*
 #ifndef _URCU_ARCH_UATOMIC_AARCH64_H
 #define _URCU_ARCH_UATOMIC_AARCH64_H
 
 /*
- * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved.
- * Copyright (c) 1996-1999 by Silicon Graphics.  All rights reserved.
- * Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P.
- * Copyright (c) 2009-2015 Mathieu Desnoyers
- * Copyright (c) 2010      Paul E. McKenney, IBM Corporation
- *                        (Adapted from uatomic_arch_ppc.h)
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program
- * for any purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is granted,
- * provided the above notices are retained, and a notice that the code was
- * modified is included with the above copyright notice.
- *
  * Code inspired from libuatomic_ops-1.2, inherited in part from the
  * Boehm-Demers-Weiser conservative garbage collector.
  */
  * Code inspired from libuatomic_ops-1.2, inherited in part from the
  * Boehm-Demers-Weiser conservative garbage collector.
  */
index 5dceb9007733409781c67af74ea64d0cc4814bf8..afa7dff0268f12ed2b013f033dd3da63ab5466a3 100644 (file)
@@ -1,28 +1,12 @@
+// SPDX-FileCopyrightText: 2010 Paolo Bonzini <pbonzini@redhat.com>
+//
+// SPDX-License-Identifier: MIT
+
 #ifndef _URCU_UATOMIC_ARCH_ALPHA_H
 #define _URCU_UATOMIC_ARCH_ALPHA_H
 
 /*
  * Atomic exchange operations for the Alpha architecture. Let GCC do it.
 #ifndef _URCU_UATOMIC_ARCH_ALPHA_H
 #define _URCU_UATOMIC_ARCH_ALPHA_H
 
 /*
  * Atomic exchange operations for the Alpha architecture. Let GCC do it.
- *
- * Copyright (c) 2010 Paolo Bonzini <pbonzini@redhat.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
index 95f32f3d47b497c79373c7fcbf71bb65c8aa5dda..5124a71aa9d4dfda80c41e04500c6706a60c0638 100644 (file)
@@ -1,25 +1,17 @@
+// SPDX-FileCopyrightText: 1991-1994 by Xerox Corporation.  All rights reserved.
+// SPDX-FileCopyrightText: 1996-1999 by Silicon Graphics.  All rights reserved.
+// SPDX-FileCopyrightText: 1999-2004 Hewlett-Packard Development Company, L.P.
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2010 Paul E. McKenney, IBM Corporation
+//
+// SPDX-License-Identifier: LicenseRef-Boehm-GC
+
 #ifndef _URCU_ARCH_UATOMIC_ARM_H
 #define _URCU_ARCH_UATOMIC_ARM_H
 
 /*
  * Atomics for ARM.  This approach is usable on kernels back to 2.6.15.
  *
 #ifndef _URCU_ARCH_UATOMIC_ARM_H
 #define _URCU_ARCH_UATOMIC_ARM_H
 
 /*
  * Atomics for ARM.  This approach is usable on kernels back to 2.6.15.
  *
- * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved.
- * Copyright (c) 1996-1999 by Silicon Graphics.  All rights reserved.
- * Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P.
- * Copyright (c) 2009      Mathieu Desnoyers
- * Copyright (c) 2010      Paul E. McKenney, IBM Corporation
- *                        (Adapted from uatomic_arch_ppc.h)
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program
- * for any purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is granted,
- * provided the above notices are retained, and a notice that the code was
- * modified is included with the above copyright notice.
- *
  * Code inspired from libuatomic_ops-1.2, inherited in part from the
  * Boehm-Demers-Weiser conservative garbage collector.
  */
  * Code inspired from libuatomic_ops-1.2, inherited in part from the
  * Boehm-Demers-Weiser conservative garbage collector.
  */
diff --git a/include/urcu/uatomic/builtins-generic.h b/include/urcu/uatomic/builtins-generic.h
new file mode 100644 (file)
index 0000000..15c7f07
--- /dev/null
@@ -0,0 +1,162 @@
+// SPDX-FileCopyrightText: 2023 Olivier Dion <odion@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+/*
+ * urcu/uatomic/builtins-generic.h
+ */
+
+#ifndef _URCU_UATOMIC_BUILTINS_GENERIC_H
+#define _URCU_UATOMIC_BUILTINS_GENERIC_H
+
+#include <urcu/compiler.h>
+#include <urcu/system.h>
+
+#define uatomic_store(addr, v, mo)                             \
+       do {                                                    \
+               __atomic_store_n(cmm_cast_volatile(addr), v,    \
+                               cmm_to_c11(mo));                \
+               cmm_seq_cst_fence_after_atomic(mo);             \
+       } while (0)
+
+#define uatomic_set(addr, v)                           \
+       do {                                            \
+               uatomic_store(addr, v, CMM_RELAXED);    \
+       } while (0)
+
+#define uatomic_load(addr, mo)                                         \
+       __extension__                                                   \
+       ({                                                              \
+               __typeof__(*(addr)) _value =                            \
+                       __atomic_load_n(cmm_cast_volatile(addr),        \
+                                       cmm_to_c11(mo));                \
+               cmm_seq_cst_fence_after_atomic(mo);                     \
+                                                                       \
+               _value;                                                 \
+       })
+
+#define uatomic_read(addr)                     \
+       uatomic_load(addr, CMM_RELAXED)
+
+#define uatomic_cmpxchg_mo(addr, old, new, mos, mof)                   \
+       __extension__                                                   \
+       ({                                                              \
+               __typeof__(*(addr)) _old = (__typeof__(*(addr)))old;    \
+                                                                       \
+               if (__atomic_compare_exchange_n(cmm_cast_volatile(addr), \
+                                                       &_old, new, 0,  \
+                                                       cmm_to_c11(mos), \
+                                                       cmm_to_c11(mof))) { \
+                       cmm_seq_cst_fence_after_atomic(mos);            \
+               } else {                                                \
+                       cmm_seq_cst_fence_after_atomic(mof);            \
+               }                                                       \
+               _old;                                                   \
+       })
+
+#define uatomic_cmpxchg(addr, old, new)                                        \
+       uatomic_cmpxchg_mo(addr, old, new, CMM_SEQ_CST_FENCE, CMM_RELAXED)
+
+#define uatomic_xchg_mo(addr, v, mo)                                   \
+       __extension__                                                   \
+       ({                                                              \
+               __typeof__((*addr)) _old =                              \
+                       __atomic_exchange_n(cmm_cast_volatile(addr), v, \
+                                       cmm_to_c11(mo));                \
+               cmm_seq_cst_fence_after_atomic(mo);                     \
+               _old;                                                   \
+       })
+
+#define uatomic_xchg(addr, v)                          \
+       uatomic_xchg_mo(addr, v, CMM_SEQ_CST_FENCE)
+
+#define uatomic_add_return_mo(addr, v, mo)                             \
+       __extension__                                                   \
+       ({                                                              \
+               __typeof__(*(addr)) _old =                              \
+                       __atomic_add_fetch(cmm_cast_volatile(addr), v,  \
+                                       cmm_to_c11(mo));                \
+               cmm_seq_cst_fence_after_atomic(mo);                     \
+               _old;                                                   \
+       })
+
+#define uatomic_add_return(addr, v)                            \
+       uatomic_add_return_mo(addr, v, CMM_SEQ_CST_FENCE)
+
+#define uatomic_sub_return_mo(addr, v, mo)                             \
+       __extension__                                                   \
+       ({                                                              \
+               __typeof__(*(addr)) _old =                              \
+                       __atomic_sub_fetch(cmm_cast_volatile(addr), v,  \
+                                       cmm_to_c11(mo));                \
+               cmm_seq_cst_fence_after_atomic(mo);                     \
+               _old;                                                   \
+       })
+
+#define uatomic_sub_return(addr, v)                            \
+       uatomic_sub_return_mo(addr, v, CMM_SEQ_CST_FENCE)
+
+#define uatomic_and_mo(addr, mask, mo)                                 \
+       do {                                                            \
+               (void) __atomic_and_fetch(cmm_cast_volatile(addr), mask, \
+                                       cmm_to_c11(mo));                \
+               cmm_seq_cst_fence_after_atomic(mo);                     \
+       } while (0)
+
+#define uatomic_and(addr, mask)                        \
+       uatomic_and_mo(addr, mask, CMM_SEQ_CST)
+
+#define uatomic_or_mo(addr, mask, mo)                                  \
+       do {                                                            \
+               (void) __atomic_or_fetch(cmm_cast_volatile(addr), mask, \
+                                       cmm_to_c11(mo));                \
+               cmm_seq_cst_fence_after_atomic(mo);                     \
+       } while (0)
+
+
+#define uatomic_or(addr, mask)                 \
+       uatomic_or_mo(addr, mask, CMM_RELAXED)
+
+#define uatomic_add_mo(addr, v, mo)                    \
+       (void) uatomic_add_return_mo(addr, v, mo)
+
+#define uatomic_add(addr, v)                   \
+       uatomic_add_mo(addr, v, CMM_RELAXED)
+
+#define uatomic_sub_mo(addr, v, mo)                    \
+       (void) uatomic_sub_return_mo(addr, v, mo)
+
+#define uatomic_sub(addr, v)                   \
+       uatomic_sub_mo(addr, v, CMM_RELAXED)
+
+#define uatomic_inc_mo(addr, mo)               \
+       uatomic_add_mo(addr, 1, mo)
+
+#define uatomic_inc(addr)                      \
+       uatomic_inc_mo(addr, CMM_RELAXED)
+
+#define uatomic_dec_mo(addr, mo)               \
+       uatomic_sub_mo(addr, 1, mo)
+
+#define uatomic_dec(addr)                      \
+       uatomic_dec_mo(addr, CMM_RELAXED)
+
+#define cmm_smp_mb__before_uatomic_and() cmm_smp_mb()
+#define cmm_smp_mb__after_uatomic_and()  cmm_smp_mb()
+
+#define cmm_smp_mb__before_uatomic_or() cmm_smp_mb()
+#define cmm_smp_mb__after_uatomic_or()  cmm_smp_mb()
+
+#define cmm_smp_mb__before_uatomic_add() cmm_smp_mb()
+#define cmm_smp_mb__after_uatomic_add()  cmm_smp_mb()
+
+#define cmm_smp_mb__before_uatomic_sub() cmm_smp_mb()
+#define cmm_smp_mb__after_uatomic_sub()  cmm_smp_mb()
+
+#define cmm_smp_mb__before_uatomic_inc() cmm_smp_mb()
+#define cmm_smp_mb__after_uatomic_inc() cmm_smp_mb()
+
+#define cmm_smp_mb__before_uatomic_dec() cmm_smp_mb()
+#define cmm_smp_mb__after_uatomic_dec() cmm_smp_mb()
+
+#endif /* _URCU_UATOMIC_BUILTINS_X86_H */
diff --git a/include/urcu/uatomic/builtins.h b/include/urcu/uatomic/builtins.h
new file mode 100644 (file)
index 0000000..5b92700
--- /dev/null
@@ -0,0 +1,67 @@
+// SPDX-FileCopyrightText: 2023 Olivier Dion <odion@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+/*
+ * urcu/uatomic/builtins.h
+ */
+
+#ifndef _URCU_UATOMIC_BUILTINS_H
+#define _URCU_UATOMIC_BUILTINS_H
+
+#include <urcu/arch.h>
+
+#if defined(__has_builtin)
+# if !__has_builtin(__atomic_store_n)
+#  error "Toolchain does not support __atomic_store_n."
+# endif
+# if !__has_builtin(__atomic_load_n)
+#  error "Toolchain does not support __atomic_load_n."
+# endif
+# if !__has_builtin(__atomic_exchange_n)
+#  error "Toolchain does not support __atomic_exchange_n."
+# endif
+# if !__has_builtin(__atomic_compare_exchange_n)
+#  error "Toolchain does not support __atomic_compare_exchange_n."
+# endif
+# if !__has_builtin(__atomic_add_fetch)
+#  error "Toolchain does not support __atomic_add_fetch."
+# endif
+# if !__has_builtin(__atomic_sub_fetch)
+#  error "Toolchain does not support __atomic_sub_fetch."
+# endif
+# if !__has_builtin(__atomic_or_fetch)
+#  error "Toolchain does not support __atomic_or_fetch."
+# endif
+# if !__has_builtin(__atomic_thread_fence)
+#  error "Toolchain does not support __atomic_thread_fence."
+# endif
+# if !__has_builtin(__atomic_signal_fence)
+#  error "Toolchain does not support __atomic_signal_fence."
+# endif
+#elif defined(__GNUC__)
+# define GCC_VERSION (__GNUC__       * 10000 + \
+                      __GNUC_MINOR__ * 100   + \
+                      __GNUC_PATCHLEVEL__)
+# if  GCC_VERSION < 40700
+#  error "GCC version is too old. Version must be 4.7 or greater"
+# endif
+# undef  GCC_VERSION
+#else
+# error "Toolchain is not supported."
+#endif
+
+#if defined(__GNUC__)
+# define UATOMIC_HAS_ATOMIC_BYTE  __GCC_ATOMIC_CHAR_LOCK_FREE
+# define UATOMIC_HAS_ATOMIC_SHORT __GCC_ATOMIC_SHORT_LOCK_FREE
+#elif defined(__clang__)
+# define UATOMIC_HAS_ATOMIC_BYTE  __CLANG_ATOMIC_CHAR_LOCK_FREE
+# define UATOMIC_HAS_ATOMIC_SHORT __CLANG_ATOMIC_SHORT_LOCK_FREE
+#else
+/* #  define UATOMIC_HAS_ATOMIC_BYTE  */
+/* #  define UATOMIC_HAS_ATOMIC_SHORT */
+#endif
+
+#include <urcu/uatomic/builtins-generic.h>
+
+#endif /* _URCU_UATOMIC_BUILTINS_H */
index 438e039309db0513edda9f8de6bda462e67a9e9f..e0763afeffd9d055d08499900836194aa910cf0e 100644 (file)
@@ -1,23 +1,15 @@
+// SPDX-FileCopyrightText: 1991-1994 by Xerox Corporation.  All rights reserved.
+// SPDX-FileCopyrightText: 1996-1999 by Silicon Graphics.  All rights reserved.
+// SPDX-FileCopyrightText: 1999-2004 Hewlett-Packard Development Company, L.P.
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2010 Paul E. McKenney, IBM Corporation
+//
+// SPDX-License-Identifier: LicenseRef-Boehm-GC
+
 #ifndef _URCU_ARCH_UATOMIC_GCC_H
 #define _URCU_ARCH_UATOMIC_GCC_H
 
 /*
 #ifndef _URCU_ARCH_UATOMIC_GCC_H
 #define _URCU_ARCH_UATOMIC_GCC_H
 
 /*
- * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved.
- * Copyright (c) 1996-1999 by Silicon Graphics.  All rights reserved.
- * Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P.
- * Copyright (c) 2009      Mathieu Desnoyers
- * Copyright (c) 2010      Paul E. McKenney, IBM Corporation
- *                        (Adapted from uatomic_arch_ppc.h)
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program
- * for any purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is granted,
- * provided the above notices are retained, and a notice that the code was
- * modified is included with the above copyright notice.
- *
  * Code inspired from libuatomic_ops-1.2, inherited in part from the
  * Boehm-Demers-Weiser conservative garbage collector.
  */
  * Code inspired from libuatomic_ops-1.2, inherited in part from the
  * Boehm-Demers-Weiser conservative garbage collector.
  */
index 5bb0d4f983c3b96c920827b991b6798fadc5cbbd..ed655bb8def13a5120990d049eb12199ee47376a 100644 (file)
@@ -1,22 +1,15 @@
+// SPDX-FileCopyrightText: 1991-1994 by Xerox Corporation.  All rights reserved.
+// SPDX-FileCopyrightText: 1996-1999 by Silicon Graphics.  All rights reserved.
+// SPDX-FileCopyrightText: 1999-2004 Hewlett-Packard Development Company, L.P.
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2010 Paolo Bonzini
+//
+// SPDX-License-Identifier: LicenseRef-Boehm-GC
+
 #ifndef _URCU_UATOMIC_GENERIC_H
 #define _URCU_UATOMIC_GENERIC_H
 
 /*
 #ifndef _URCU_UATOMIC_GENERIC_H
 #define _URCU_UATOMIC_GENERIC_H
 
 /*
- * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved.
- * Copyright (c) 1996-1999 by Silicon Graphics.  All rights reserved.
- * Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P.
- * Copyright (c) 2009      Mathieu Desnoyers
- * Copyright (c) 2010      Paolo Bonzini
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program
- * for any purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is granted,
- * provided the above notices are retained, and a notice that the code was
- * modified is included with the above copyright notice.
- *
  * Code inspired from libuatomic_ops-1.2, inherited in part from the
  * Boehm-Demers-Weiser conservative garbage collector.
  */
  * Code inspired from libuatomic_ops-1.2, inherited in part from the
  * Boehm-Demers-Weiser conservative garbage collector.
  */
@@ -33,24 +26,125 @@ extern "C" {
 #define uatomic_set(addr, v)   ((void) CMM_STORE_SHARED(*(addr), (v)))
 #endif
 
 #define uatomic_set(addr, v)   ((void) CMM_STORE_SHARED(*(addr), (v)))
 #endif
 
+/*
+ * Can be defined for the architecture.
+ *
+ * What needs to be emitted _before_ the `operation' with memory ordering `mo'.
+ */
+#ifndef _cmm_compat_c11_smp_mb__before_mo
+# define _cmm_compat_c11_smp_mb__before_mo(operation, mo) cmm_smp_mb()
+#endif
+
+/*
+ * Can be defined for the architecture.
+ *
+ * What needs to be emitted _after_ the `operation' with memory ordering `mo'.
+ */
+#ifndef _cmm_compat_c11_smp_mb__after_mo
+# define _cmm_compat_c11_smp_mb__after_mo(operation, mo) cmm_smp_mb()
+#endif
+
+#define uatomic_load_store_return_op(op, addr, v, mo)          \
+       __extension__                                           \
+       ({                                                      \
+               _cmm_compat_c11_smp_mb__before_mo(op, mo);      \
+               __typeof__((*addr)) _value = op(addr, v);       \
+               _cmm_compat_c11_smp_mb__after_mo(op, mo);       \
+                                                               \
+               _value;                                         \
+       })
+
+#define uatomic_load_store_op(op, addr, v, mo)                 \
+       do {                                                    \
+               _cmm_compat_c11_smp_mb__before_mo(op, mo);      \
+               op(addr, v);                                    \
+               _cmm_compat_c11_smp_mb__after_mo(op, mo);       \
+       } while (0)
+
+#define uatomic_store(addr, v, mo)                                     \
+       do {                                                            \
+               _cmm_compat_c11_smp_mb__before_mo(uatomic_set, mo);     \
+               uatomic_set(addr, v);                                   \
+               _cmm_compat_c11_smp_mb__after_mo(uatomic_set, mo);      \
+       } while (0)
+
+#define uatomic_and_mo(addr, v, mo)                    \
+       uatomic_load_store_op(uatomic_and, addr, v, mo)
+
+#define uatomic_or_mo(addr, v, mo)                     \
+       uatomic_load_store_op(uatomic_or, addr, v, mo)
+
+#define uatomic_add_mo(addr, v, mo)                    \
+       uatomic_load_store_op(uatomic_add, addr, v, mo)
+
+#define uatomic_sub_mo(addr, v, mo)                    \
+       uatomic_load_store_op(uatomic_sub, addr, v, mo)
+
+#define uatomic_inc_mo(addr, mo)                       \
+       uatomic_load_store_op(uatomic_add, addr, 1, mo)
+
+#define uatomic_dec_mo(addr, mo)                               \
+       uatomic_load_store_op(uatomic_add, addr, -1, mo)
+/*
+ * NOTE: We can not just do switch (_value == (old) ? mos : mof) otherwise the
+ * compiler emit a -Wduplicated-cond warning.
+ */
+#define uatomic_cmpxchg_mo(addr, old, new, mos, mof)                   \
+       __extension__                                                   \
+       ({                                                              \
+               _cmm_compat_c11_smp_mb__before_mo(uatomic_cmpxchg, mos); \
+               __typeof__(*(addr)) _value = uatomic_cmpxchg(addr, old, \
+                                                       new);           \
+                                                                       \
+               if (_value == (old)) {                                  \
+                       _cmm_compat_c11_smp_mb__after_mo(uatomic_cmpxchg, mos); \
+               } else {                                                \
+                       _cmm_compat_c11_smp_mb__after_mo(uatomic_cmpxchg, mof); \
+               }                                                       \
+               _value;                                                 \
+       })
+
+#define uatomic_xchg_mo(addr, v, mo)                           \
+       uatomic_load_store_return_op(uatomic_xchg, addr, v, mo)
+
+#define uatomic_add_return_mo(addr, v, mo)                             \
+       uatomic_load_store_return_op(uatomic_add_return, addr, v)
+
+#define uatomic_sub_return_mo(addr, v, mo)                             \
+       uatomic_load_store_return_op(uatomic_sub_return, addr, v)
+
 #ifndef uatomic_read
 #define uatomic_read(addr)     CMM_LOAD_SHARED(*(addr))
 #endif
 
 #ifndef uatomic_read
 #define uatomic_read(addr)     CMM_LOAD_SHARED(*(addr))
 #endif
 
+#define uatomic_load(addr, mo)                                         \
+       __extension__                                                   \
+       ({                                                              \
+               _cmm_compat_c11_smp_mb__before_mo(uatomic_read, mo);    \
+               __typeof__(*(addr)) _rcu_value = uatomic_read(addr);    \
+               _cmm_compat_c11_smp_mb__after_mo(uatomic_read, mo);     \
+                                                                       \
+               _rcu_value;                                             \
+       })
+
 #if !defined __OPTIMIZE__  || defined UATOMIC_NO_LINK_ERROR
 #if !defined __OPTIMIZE__  || defined UATOMIC_NO_LINK_ERROR
+#ifdef ILLEGAL_INSTR
 static inline __attribute__((always_inline))
 void _uatomic_link_error(void)
 {
 static inline __attribute__((always_inline))
 void _uatomic_link_error(void)
 {
-#ifdef ILLEGAL_INSTR
        /*
         * generate an illegal instruction. Cannot catch this with
         * linker tricks when optimizations are disabled.
         */
        __asm__ __volatile__(ILLEGAL_INSTR);
        /*
         * generate an illegal instruction. Cannot catch this with
         * linker tricks when optimizations are disabled.
         */
        __asm__ __volatile__(ILLEGAL_INSTR);
+}
 #else
 #else
+static inline __attribute__((always_inline, __noreturn__))
+void _uatomic_link_error(void)
+{
        __builtin_trap();
        __builtin_trap();
-#endif
 }
 }
+#endif
 
 #else /* #if !defined __OPTIMIZE__  || defined UATOMIC_NO_LINK_ERROR */
 extern void _uatomic_link_error(void);
 
 #else /* #if !defined __OPTIMIZE__  || defined UATOMIC_NO_LINK_ERROR */
 extern void _uatomic_link_error(void);
index 21021537c9076b8aec2bcae0fc8689463d88491a..82864615e4a3492fdd0608bded10893f0608f2ea 100644 (file)
@@ -1,3 +1,7 @@
+// SPDX-FileCopyrightText: 2014 Helge Deller <deller@gmx.de>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_ARCH_UATOMIC_HPPA_H
 #define _URCU_ARCH_UATOMIC_HPPA_H
 
 #ifndef _URCU_ARCH_UATOMIC_HPPA_H
 #define _URCU_ARCH_UATOMIC_HPPA_H
 
index b5db8cc2e1d8cad1ce2f2fa1444b95db58399804..381594c0c40d40cbbde497bdeaa2e2f7dd4a48e9 100644 (file)
@@ -1,23 +1,15 @@
+// SPDX-FileCopyrightText: 1991-1994 by Xerox Corporation.  All rights reserved.
+// SPDX-FileCopyrightText: 1996-1999 by Silicon Graphics.  All rights reserved.
+// SPDX-FileCopyrightText: 1999-2004 Hewlett-Packard Development Company, L.P.
+// SPDX-FileCopyrightText: 2009-2015 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2010 Paul E. McKenney, IBM Corporation
+//
+// SPDX-License-Identifier: LicenseRef-Boehm-GC
+
 #ifndef _URCU_ARCH_UATOMIC_IA64_H
 #define _URCU_ARCH_UATOMIC_IA64_H
 
 /*
 #ifndef _URCU_ARCH_UATOMIC_IA64_H
 #define _URCU_ARCH_UATOMIC_IA64_H
 
 /*
- * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved.
- * Copyright (c) 1996-1999 by Silicon Graphics.  All rights reserved.
- * Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P.
- * Copyright (c) 2009-2015 Mathieu Desnoyers
- * Copyright (c) 2010      Paul E. McKenney, IBM Corporation
- *                        (Adapted from uatomic_arch_ppc.h)
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program
- * for any purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is granted,
- * provided the above notices are retained, and a notice that the code was
- * modified is included with the above copyright notice.
- *
  * Code inspired from libuatomic_ops-1.2, inherited in part from the
  * Boehm-Demers-Weiser conservative garbage collector.
  */
  * Code inspired from libuatomic_ops-1.2, inherited in part from the
  * Boehm-Demers-Weiser conservative garbage collector.
  */
diff --git a/include/urcu/uatomic/loongarch.h b/include/urcu/uatomic/loongarch.h
new file mode 100644 (file)
index 0000000..3454d41
--- /dev/null
@@ -0,0 +1,33 @@
+// SPDX-FileCopyrightText: 2021 Wang Jing <wangjing@loongson.cn>
+//
+// SPDX-License-Identifier: MIT
+
+#ifndef _URCU_UATOMIC_ARCH_LOONGARCH_H
+#define _URCU_UATOMIC_ARCH_LOONGARCH_H
+
+/*
+ * Atomic exchange operations for the LoongArch architecture. Let GCC do it.
+ */
+
+#include <urcu/compiler.h>
+#include <urcu/system.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * LoongArch implements byte and short atomics with LL/SC instructions,
+ * which retry if the cache line is modified concurrently between LL and
+ * SC.
+ */
+#define UATOMIC_HAS_ATOMIC_BYTE
+#define UATOMIC_HAS_ATOMIC_SHORT
+
+#ifdef __cplusplus
+}
+#endif
+
+#include <urcu/uatomic/generic.h>
+
+#endif /* _URCU_UATOMIC_ARCH_LOONGARCH_H */
index 60b01c776a28fb910ddc548ca750a8ec7e060283..9a28e7c223e9a2760f3d7ac4acafc2a870575d81 100644 (file)
@@ -1,25 +1,9 @@
+// SPDX-FileCopyrightText: 2017 Michael Jeanson <mjeanson@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
  * Atomic exchange operations for the m68k architecture. Let GCC do it.
 /*
  * Atomic exchange operations for the m68k architecture. Let GCC do it.
- *
- * Copyright (c) 2017 Michael Jeanson <mjeanson@efficios.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
  */
 
 #ifndef _URCU_ARCH_UATOMIC_M68K_H
  */
 
 #ifndef _URCU_ARCH_UATOMIC_M68K_H
index bd7ca7f776118761aaeb9b10bdbe782865fafd84..265401db95891c936eed0a207bd1b4267d4f9854 100644 (file)
@@ -1,28 +1,12 @@
+// SPDX-FileCopyrightText: 2010 Paolo Bonzini <pbonzini@redhat.com>
+//
+// SPDX-License-Identifier: MIT
+
 #ifndef _URCU_UATOMIC_ARCH_MIPS_H
 #define _URCU_UATOMIC_ARCH_MIPS_H
 
 /*
  * Atomic exchange operations for the MIPS architecture. Let GCC do it.
 #ifndef _URCU_UATOMIC_ARCH_MIPS_H
 #define _URCU_UATOMIC_ARCH_MIPS_H
 
 /*
  * Atomic exchange operations for the MIPS architecture. Let GCC do it.
- *
- * Copyright (c) 2010 Paolo Bonzini <pbonzini@redhat.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
index 5b3c3033ab43607161d86385ed4add65f419e70d..0eca72729f516f35503ac62626d84f6091ac31d7 100644 (file)
@@ -1,28 +1,12 @@
+// SPDX-FileCopyrightText: 2016 Marek Vasut <marex@denx.de>
+//
+// SPDX-License-Identifier: MIT
+
 #ifndef _URCU_UATOMIC_ARCH_NIOS2_H
 #define _URCU_UATOMIC_ARCH_NIOS2_H
 
 /*
  * Atomic exchange operations for the NIOS2 architecture. Let GCC do it.
 #ifndef _URCU_UATOMIC_ARCH_NIOS2_H
 #define _URCU_UATOMIC_ARCH_NIOS2_H
 
 /*
  * Atomic exchange operations for the NIOS2 architecture. Let GCC do it.
- *
- * Copyright (c) 2016 Marek Vasut <marex@denx.de>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
index 0e672f57260529679b7c15d31304f57767328bb9..dc59518c8e0a7472560d5fe5fc4e55b8389bf1ee 100644 (file)
@@ -1,21 +1,14 @@
+// SPDX-FileCopyrightText: 1991-1994 by Xerox Corporation.  All rights reserved.
+// SPDX-FileCopyrightText: 1996-1999 by Silicon Graphics.  All rights reserved.
+// SPDX-FileCopyrightText: 1999-2004 Hewlett-Packard Development Company, L.P.
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LicenseRef-Boehm-GC
+
 #ifndef _URCU_ARCH_UATOMIC_PPC_H
 #define _URCU_ARCH_UATOMIC_PPC_H
 
 /*
 #ifndef _URCU_ARCH_UATOMIC_PPC_H
 #define _URCU_ARCH_UATOMIC_PPC_H
 
 /*
- * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved.
- * Copyright (c) 1996-1999 by Silicon Graphics.  All rights reserved.
- * Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P.
- * Copyright (c) 2009      Mathieu Desnoyers
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program
- * for any purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is granted,
- * provided the above notices are retained, and a notice that the code was
- * modified is included with the above copyright notice.
- *
  * Code inspired from libuatomic_ops-1.2, inherited in part from the
  * Boehm-Demers-Weiser conservative garbage collector.
  */
  * Code inspired from libuatomic_ops-1.2, inherited in part from the
  * Boehm-Demers-Weiser conservative garbage collector.
  */
@@ -34,7 +27,7 @@ extern "C" {
  * instructions for cmpxchg and add_return family of atomic primitives.
  *
  * This is achieved with:
  * instructions for cmpxchg and add_return family of atomic primitives.
  *
  * This is achieved with:
- *   lwsync (prior loads can be reordered after following load)
+ *   lwsync (prior stores can be reordered after following loads)
  *   lwarx
  *   stwcx.
  *   test if success (retry)
  *   lwarx
  *   stwcx.
  *   test if success (retry)
index a6700e17e2429567fbe1e4e95117bf0c69c7c0f0..c1ba29e2dd1f711236c8ace982f3c75a49961c6d 100644 (file)
@@ -1,25 +1,11 @@
+// SPDX-FileCopyrightText: 2018 Michael Jeanson <mjeanson@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 /*
 /*
- * Atomic exchange operations for the RISC-V architecture. Let GCC do it.
- *
- * Copyright (c) 2018 Michael Jeanson <mjeanson@efficios.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
+ * Atomic exchange operations for the RISC-V architecture.
  *
  *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
+ * Let the compiler do it.
  */
 
 #ifndef _URCU_ARCH_UATOMIC_RISCV_H
  */
 
 #ifndef _URCU_ARCH_UATOMIC_RISCV_H
 #include <urcu/compiler.h>
 #include <urcu/system.h>
 
 #include <urcu/compiler.h>
 #include <urcu/system.h>
 
+/*
+ * See <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104831> for details.
+ *
+ * Until the following patches are backported, Userspace RCU is broken for the
+ * RISC-V architecture when compiled with GCC.
+ *
+ *  - <https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=4990cf84c460f064d6281d0813f20b0ef20c7448>
+ *  - <https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=4990cf84c460f064d6281d0813f20b0ef20c7448>
+ *  - <https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=d199d2e56da2379004e7e0457150409c0c99d3e6>
+ */
+#ifdef URCU_GCC_VERSION
+# error "Implementations of some atomic operations of GCC for RISC-V are insufficient for sequential consistency. For this reason Userspace RCU is currently marked as 'broken' for RISC-V with GCC. However, it is still possible to use other toolchains."
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 #ifdef __cplusplus
 extern "C" {
 #endif
index 62561e000224ccb4c71e244a239eab5ac730f70b..25626961dc320a01c25a2b56f4f5e0928cc3a4e2 100644 (file)
@@ -1,3 +1,8 @@
+// SPDX-FileCopyrightText: 2009 Novell, Inc.
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: MIT
+
 #ifndef _URCU_UATOMIC_ARCH_S390_H
 #define _URCU_UATOMIC_ARCH_S390_H
 
 #ifndef _URCU_UATOMIC_ARCH_S390_H
 #define _URCU_UATOMIC_ARCH_S390_H
 
@@ -6,27 +11,7 @@
  * taken from the Principles of Operation Appendix A "Conditional Swapping
  * Instructions (CS, CDS)".
  *
  * taken from the Principles of Operation Appendix A "Conditional Swapping
  * Instructions (CS, CDS)".
  *
- * Copyright (c) 2009 Novell, Inc.
  * Author: Jan Blunck <jblunck@suse.de>
  * Author: Jan Blunck <jblunck@suse.de>
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
  */
 
 #include <urcu/compiler.h>
  */
 
 #include <urcu/compiler.h>
@@ -61,10 +46,19 @@ extern "C" {
 
 #endif /* !COMPILER_HAVE_SHORT_MEM_OPERAND */
 
 
 #endif /* !COMPILER_HAVE_SHORT_MEM_OPERAND */
 
-struct __uatomic_dummy {
-       unsigned long v[10];
-};
-#define __hp(x)        ((struct __uatomic_dummy *)(x))
+/*
+ * The __hp() macro casts the void pointer @x to a pointer to a structure
+ * containing an array of char of the specified size. This allows passing the
+ * @addr arguments of the following inline functions as "m" and "+m" operands
+ * to the assembly. The @size parameter should be a constant to support
+ * compilers such as clang which do not support VLA. Create typedefs because
+ * C++ does not allow types be defined in casts.
+ */
+
+typedef struct { char v[4]; } __hp_4;
+typedef struct { char v[8]; } __hp_8;
+
+#define __hp(size, x)  ((__hp_##size *)(x))
 
 /* xchg */
 
 
 /* xchg */
 
@@ -79,8 +73,8 @@ unsigned long _uatomic_exchange(volatile void *addr, unsigned long val, int len)
                __asm__ __volatile__(
                        "0:     cs %0,%2," MEMOP_REF(%3) "\n"
                        "       brc 4,0b\n"
                __asm__ __volatile__(
                        "0:     cs %0,%2," MEMOP_REF(%3) "\n"
                        "       brc 4,0b\n"
-                       : "=&r" (old_val), MEMOP_OUT (__hp(addr))
-                       : "r" (val), MEMOP_IN (__hp(addr))
+                       : "=&r" (old_val), MEMOP_OUT (__hp(4, addr))
+                       : "r" (val), MEMOP_IN (__hp(4, addr))
                        : "memory", "cc");
                return old_val;
        }
                        : "memory", "cc");
                return old_val;
        }
@@ -92,8 +86,8 @@ unsigned long _uatomic_exchange(volatile void *addr, unsigned long val, int len)
                __asm__ __volatile__(
                        "0:     csg %0,%2," MEMOP_REF(%3) "\n"
                        "       brc 4,0b\n"
                __asm__ __volatile__(
                        "0:     csg %0,%2," MEMOP_REF(%3) "\n"
                        "       brc 4,0b\n"
-                       : "=&r" (old_val), MEMOP_OUT (__hp(addr))
-                       : "r" (val), MEMOP_IN (__hp(addr))
+                       : "=&r" (old_val), MEMOP_OUT (__hp(8, addr))
+                       : "r" (val), MEMOP_IN (__hp(8, addr))
                        : "memory", "cc");
                return old_val;
        }
                        : "memory", "cc");
                return old_val;
        }
@@ -123,8 +117,8 @@ unsigned long _uatomic_cmpxchg(void *addr, unsigned long old,
 
                __asm__ __volatile__(
                        "       cs %0,%2," MEMOP_REF(%3) "\n"
 
                __asm__ __volatile__(
                        "       cs %0,%2," MEMOP_REF(%3) "\n"
-                       : "+r" (old_val), MEMOP_OUT (__hp(addr))
-                       : "r" (_new), MEMOP_IN (__hp(addr))
+                       : "+r" (old_val), MEMOP_OUT (__hp(4, addr))
+                       : "r" (_new), MEMOP_IN (__hp(4, addr))
                        : "memory", "cc");
                return old_val;
        }
                        : "memory", "cc");
                return old_val;
        }
@@ -133,8 +127,8 @@ unsigned long _uatomic_cmpxchg(void *addr, unsigned long old,
        {
                __asm__ __volatile__(
                        "       csg %0,%2," MEMOP_REF(%3) "\n"
        {
                __asm__ __volatile__(
                        "       csg %0,%2," MEMOP_REF(%3) "\n"
-                       : "+r" (old), MEMOP_OUT (__hp(addr))
-                       : "r" (_new), MEMOP_IN (__hp(addr))
+                       : "+r" (old), MEMOP_OUT (__hp(8, addr))
+                       : "r" (_new), MEMOP_IN (__hp(8, addr))
                        : "memory", "cc");
                return old;
        }
                        : "memory", "cc");
                return old;
        }
index a9f27954657cdf6b0b8ad1a9c1a720b695a8b248..97ecb466d083b21dad6f56420d6b3bf48732a085 100644 (file)
@@ -1,21 +1,14 @@
+// SPDX-FileCopyrightText: 1991-1994 by Xerox Corporation.  All rights reserved.
+// SPDX-FileCopyrightText: 1996-1999 by Silicon Graphics.  All rights reserved.
+// SPDX-FileCopyrightText: 1999-2003 Hewlett-Packard Development Company, L.P.
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LicenseRef-Boehm-GC
+
 #ifndef _URCU_ARCH_UATOMIC_SPARC64_H
 #define _URCU_ARCH_UATOMIC_SPARC64_H
 
 /*
 #ifndef _URCU_ARCH_UATOMIC_SPARC64_H
 #define _URCU_ARCH_UATOMIC_SPARC64_H
 
 /*
- * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved.
- * Copyright (c) 1996-1999 by Silicon Graphics.  All rights reserved.
- * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved.
- * Copyright (c) 2009      Mathieu Desnoyers
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program
- * for any purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is granted,
- * provided the above notices are retained, and a notice that the code was
- * modified is included with the above copyright notice.
- *
  * Code inspired from libuatomic_ops-1.2, inherited in part from the
  * Boehm-Demers-Weiser conservative garbage collector.
  */
  * Code inspired from libuatomic_ops-1.2, inherited in part from the
  * Boehm-Demers-Weiser conservative garbage collector.
  */
index 830f26054e70cf19ac74e0a88456725c062ac2fb..412c9ed8992a8a4957e5cf0808f12d7d80003a9b 100644 (file)
@@ -1,23 +1,15 @@
+// SPDX-FileCopyrightText: 1991-1994 by Xerox Corporation.  All rights reserved.
+// SPDX-FileCopyrightText: 1996-1999 by Silicon Graphics.  All rights reserved.
+// SPDX-FileCopyrightText: 1999-2004 Hewlett-Packard Development Company, L.P.
+// SPDX-FileCopyrightText: 2009-2015 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2010 Paul E. McKenney, IBM Corporation
+//
+// SPDX-License-Identifier: LicenseRef-Boehm-GC
+
 #ifndef _URCU_ARCH_UATOMIC_TILE_H
 #define _URCU_ARCH_UATOMIC_TILE_H
 
 /*
 #ifndef _URCU_ARCH_UATOMIC_TILE_H
 #define _URCU_ARCH_UATOMIC_TILE_H
 
 /*
- * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved.
- * Copyright (c) 1996-1999 by Silicon Graphics.  All rights reserved.
- * Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P.
- * Copyright (c) 2009-2015 Mathieu Desnoyers
- * Copyright (c) 2010      Paul E. McKenney, IBM Corporation
- *                        (Adapted from uatomic_arch_ppc.h)
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program
- * for any purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is granted,
- * provided the above notices are retained, and a notice that the code was
- * modified is included with the above copyright notice.
- *
  * Code inspired from libuatomic_ops-1.2, inherited in part from the
  * Boehm-Demers-Weiser conservative garbage collector.
  */
  * Code inspired from libuatomic_ops-1.2, inherited in part from the
  * Boehm-Demers-Weiser conservative garbage collector.
  */
diff --git a/include/urcu/uatomic/unknown.h b/include/urcu/uatomic/unknown.h
deleted file mode 100644 (file)
index eb18526..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef _URCU_ARCH_UATOMIC_UNKNOWN_H
-#define _URCU_ARCH_UATOMIC_UNKNOWN_H
-
-/*
- * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved.
- * Copyright (c) 1996-1999 by Silicon Graphics.  All rights reserved.
- * Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P.
- * Copyright (c) 2009      Mathieu Desnoyers
- * Copyright (c) 2010      Paul E. McKenney, IBM Corporation
- *                        (Adapted from uatomic_arch_ppc.h)
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program
- * for any purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is granted,
- * provided the above notices are retained, and a notice that the code was
- * modified is included with the above copyright notice.
- */
-
-/* See configure.ac for the list of recognized architectures.  */
-#error "Cannot build: unrecognized architecture detected."
-
-#endif /* _URCU_ARCH_UATOMIC_UNKNOWN_H */
index 129a2f5670385880870912235a14a63a6d0ea99e..616eee9be3ca60b4be62c8a10cadb0aff2d1ea8d 100644 (file)
@@ -1,25 +1,22 @@
+// SPDX-FileCopyrightText: 1991-1994 by Xerox Corporation.  All rights reserved.
+// SPDX-FileCopyrightText: 1996-1999 by Silicon Graphics.  All rights reserved.
+// SPDX-FileCopyrightText: 1999-2004 Hewlett-Packard Development Company, L.P.
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LicenseRef-Boehm-GC
+
 #ifndef _URCU_ARCH_UATOMIC_X86_H
 #define _URCU_ARCH_UATOMIC_X86_H
 
 #ifndef _URCU_ARCH_UATOMIC_X86_H
 #define _URCU_ARCH_UATOMIC_X86_H
 
+#include <stdlib.h>            /* For abort(3). */
+
 /*
 /*
- * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved.
- * Copyright (c) 1996-1999 by Silicon Graphics.  All rights reserved.
- * Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P.
- * Copyright (c) 2009      Mathieu Desnoyers
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program
- * for any purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is granted,
- * provided the above notices are retained, and a notice that the code was
- * modified is included with the above copyright notice.
- *
  * Code inspired from libuatomic_ops-1.2, inherited in part from the
  * Boehm-Demers-Weiser conservative garbage collector.
  */
 
  * Code inspired from libuatomic_ops-1.2, inherited in part from the
  * Boehm-Demers-Weiser conservative garbage collector.
  */
 
+#include <urcu/arch.h>
+#include <urcu/config.h>
 #include <urcu/compiler.h>
 #include <urcu/system.h>
 
 #include <urcu/compiler.h>
 #include <urcu/system.h>
 
@@ -34,10 +31,21 @@ extern "C" {
  * Derived from AO_compare_and_swap() and AO_test_and_set_full().
  */
 
  * Derived from AO_compare_and_swap() and AO_test_and_set_full().
  */
 
-struct __uatomic_dummy {
-       unsigned long v[10];
-};
-#define __hp(x)        ((struct __uatomic_dummy *)(x))
+/*
+ * The __hp() macro casts the void pointer @x to a pointer to a structure
+ * containing an array of char of the specified size. This allows passing the
+ * @addr arguments of the following inline functions as "m" and "+m" operands
+ * to the assembly. The @size parameter should be a constant to support
+ * compilers such as clang which do not support VLA. Create typedefs because
+ * C++ does not allow types be defined in casts.
+ */
+
+typedef struct { char v[1]; } __hp_1;
+typedef struct { char v[2]; } __hp_2;
+typedef struct { char v[4]; } __hp_4;
+typedef struct { char v[8]; } __hp_8;
+
+#define __hp(size, x)  ((__hp_##size *)(x))
 
 #define _uatomic_set(addr, v)  ((void) CMM_STORE_SHARED(*(addr), (v)))
 
 
 #define _uatomic_set(addr, v)  ((void) CMM_STORE_SHARED(*(addr), (v)))
 
@@ -54,7 +62,7 @@ unsigned long __uatomic_cmpxchg(void *addr, unsigned long old,
 
                __asm__ __volatile__(
                "lock; cmpxchgb %2, %1"
 
                __asm__ __volatile__(
                "lock; cmpxchgb %2, %1"
-                       : "+a"(result), "+m"(*__hp(addr))
+                       : "+a"(result), "+m"(*__hp(1, addr))
                        : "q"((unsigned char)_new)
                        : "memory");
                return result;
                        : "q"((unsigned char)_new)
                        : "memory");
                return result;
@@ -65,7 +73,7 @@ unsigned long __uatomic_cmpxchg(void *addr, unsigned long old,
 
                __asm__ __volatile__(
                "lock; cmpxchgw %2, %1"
 
                __asm__ __volatile__(
                "lock; cmpxchgw %2, %1"
-                       : "+a"(result), "+m"(*__hp(addr))
+                       : "+a"(result), "+m"(*__hp(2, addr))
                        : "r"((unsigned short)_new)
                        : "memory");
                return result;
                        : "r"((unsigned short)_new)
                        : "memory");
                return result;
@@ -76,7 +84,7 @@ unsigned long __uatomic_cmpxchg(void *addr, unsigned long old,
 
                __asm__ __volatile__(
                "lock; cmpxchgl %2, %1"
 
                __asm__ __volatile__(
                "lock; cmpxchgl %2, %1"
-                       : "+a"(result), "+m"(*__hp(addr))
+                       : "+a"(result), "+m"(*__hp(4, addr))
                        : "r"((unsigned int)_new)
                        : "memory");
                return result;
                        : "r"((unsigned int)_new)
                        : "memory");
                return result;
@@ -88,7 +96,7 @@ unsigned long __uatomic_cmpxchg(void *addr, unsigned long old,
 
                __asm__ __volatile__(
                "lock; cmpxchgq %2, %1"
 
                __asm__ __volatile__(
                "lock; cmpxchgq %2, %1"
-                       : "+a"(result), "+m"(*__hp(addr))
+                       : "+a"(result), "+m"(*__hp(8, addr))
                        : "r"((unsigned long)_new)
                        : "memory");
                return result;
                        : "r"((unsigned long)_new)
                        : "memory");
                return result;
@@ -121,7 +129,7 @@ unsigned long __uatomic_exchange(void *addr, unsigned long val, int len)
                unsigned char result;
                __asm__ __volatile__(
                "xchgb %0, %1"
                unsigned char result;
                __asm__ __volatile__(
                "xchgb %0, %1"
-                       : "=q"(result), "+m"(*__hp(addr))
+                       : "=q"(result), "+m"(*__hp(1, addr))
                        : "0" ((unsigned char)val)
                        : "memory");
                return result;
                        : "0" ((unsigned char)val)
                        : "memory");
                return result;
@@ -131,7 +139,7 @@ unsigned long __uatomic_exchange(void *addr, unsigned long val, int len)
                unsigned short result;
                __asm__ __volatile__(
                "xchgw %0, %1"
                unsigned short result;
                __asm__ __volatile__(
                "xchgw %0, %1"
-                       : "=r"(result), "+m"(*__hp(addr))
+                       : "=r"(result), "+m"(*__hp(2, addr))
                        : "0" ((unsigned short)val)
                        : "memory");
                return result;
                        : "0" ((unsigned short)val)
                        : "memory");
                return result;
@@ -141,7 +149,7 @@ unsigned long __uatomic_exchange(void *addr, unsigned long val, int len)
                unsigned int result;
                __asm__ __volatile__(
                "xchgl %0, %1"
                unsigned int result;
                __asm__ __volatile__(
                "xchgl %0, %1"
-                       : "=r"(result), "+m"(*__hp(addr))
+                       : "=r"(result), "+m"(*__hp(4, addr))
                        : "0" ((unsigned int)val)
                        : "memory");
                return result;
                        : "0" ((unsigned int)val)
                        : "memory");
                return result;
@@ -152,7 +160,7 @@ unsigned long __uatomic_exchange(void *addr, unsigned long val, int len)
                unsigned long result;
                __asm__ __volatile__(
                "xchgq %0, %1"
                unsigned long result;
                __asm__ __volatile__(
                "xchgq %0, %1"
-                       : "=r"(result), "+m"(*__hp(addr))
+                       : "=r"(result), "+m"(*__hp(8, addr))
                        : "0" ((unsigned long)val)
                        : "memory");
                return result;
                        : "0" ((unsigned long)val)
                        : "memory");
                return result;
@@ -185,7 +193,7 @@ unsigned long __uatomic_add_return(void *addr, unsigned long val,
 
                __asm__ __volatile__(
                "lock; xaddb %1, %0"
 
                __asm__ __volatile__(
                "lock; xaddb %1, %0"
-                       : "+m"(*__hp(addr)), "+q" (result)
+                       : "+m"(*__hp(1, addr)), "+q" (result)
                        :
                        : "memory");
                return result + (unsigned char)val;
                        :
                        : "memory");
                return result + (unsigned char)val;
@@ -196,7 +204,7 @@ unsigned long __uatomic_add_return(void *addr, unsigned long val,
 
                __asm__ __volatile__(
                "lock; xaddw %1, %0"
 
                __asm__ __volatile__(
                "lock; xaddw %1, %0"
-                       : "+m"(*__hp(addr)), "+r" (result)
+                       : "+m"(*__hp(2, addr)), "+r" (result)
                        :
                        : "memory");
                return result + (unsigned short)val;
                        :
                        : "memory");
                return result + (unsigned short)val;
@@ -207,7 +215,7 @@ unsigned long __uatomic_add_return(void *addr, unsigned long val,
 
                __asm__ __volatile__(
                "lock; xaddl %1, %0"
 
                __asm__ __volatile__(
                "lock; xaddl %1, %0"
-                       : "+m"(*__hp(addr)), "+r" (result)
+                       : "+m"(*__hp(4, addr)), "+r" (result)
                        :
                        : "memory");
                return result + (unsigned int)val;
                        :
                        : "memory");
                return result + (unsigned int)val;
@@ -219,7 +227,7 @@ unsigned long __uatomic_add_return(void *addr, unsigned long val,
 
                __asm__ __volatile__(
                "lock; xaddq %1, %0"
 
                __asm__ __volatile__(
                "lock; xaddq %1, %0"
-                       : "+m"(*__hp(addr)), "+r" (result)
+                       : "+m"(*__hp(8, addr)), "+r" (result)
                        :
                        : "memory");
                return result + (unsigned long)val;
                        :
                        : "memory");
                return result + (unsigned long)val;
@@ -249,7 +257,7 @@ void __uatomic_and(void *addr, unsigned long val, int len)
        {
                __asm__ __volatile__(
                "lock; andb %1, %0"
        {
                __asm__ __volatile__(
                "lock; andb %1, %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(1, addr))
                        : "iq" ((unsigned char)val)
                        : "memory");
                return;
                        : "iq" ((unsigned char)val)
                        : "memory");
                return;
@@ -258,7 +266,7 @@ void __uatomic_and(void *addr, unsigned long val, int len)
        {
                __asm__ __volatile__(
                "lock; andw %1, %0"
        {
                __asm__ __volatile__(
                "lock; andw %1, %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(2, addr))
                        : "ir" ((unsigned short)val)
                        : "memory");
                return;
                        : "ir" ((unsigned short)val)
                        : "memory");
                return;
@@ -267,7 +275,7 @@ void __uatomic_and(void *addr, unsigned long val, int len)
        {
                __asm__ __volatile__(
                "lock; andl %1, %0"
        {
                __asm__ __volatile__(
                "lock; andl %1, %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(4, addr))
                        : "ir" ((unsigned int)val)
                        : "memory");
                return;
                        : "ir" ((unsigned int)val)
                        : "memory");
                return;
@@ -277,7 +285,7 @@ void __uatomic_and(void *addr, unsigned long val, int len)
        {
                __asm__ __volatile__(
                "lock; andq %1, %0"
        {
                __asm__ __volatile__(
                "lock; andq %1, %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(8, addr))
                        : "er" ((unsigned long)val)
                        : "memory");
                return;
                        : "er" ((unsigned long)val)
                        : "memory");
                return;
@@ -305,7 +313,7 @@ void __uatomic_or(void *addr, unsigned long val, int len)
        {
                __asm__ __volatile__(
                "lock; orb %1, %0"
        {
                __asm__ __volatile__(
                "lock; orb %1, %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(1, addr))
                        : "iq" ((unsigned char)val)
                        : "memory");
                return;
                        : "iq" ((unsigned char)val)
                        : "memory");
                return;
@@ -314,7 +322,7 @@ void __uatomic_or(void *addr, unsigned long val, int len)
        {
                __asm__ __volatile__(
                "lock; orw %1, %0"
        {
                __asm__ __volatile__(
                "lock; orw %1, %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(2, addr))
                        : "ir" ((unsigned short)val)
                        : "memory");
                return;
                        : "ir" ((unsigned short)val)
                        : "memory");
                return;
@@ -323,7 +331,7 @@ void __uatomic_or(void *addr, unsigned long val, int len)
        {
                __asm__ __volatile__(
                "lock; orl %1, %0"
        {
                __asm__ __volatile__(
                "lock; orl %1, %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(4, addr))
                        : "ir" ((unsigned int)val)
                        : "memory");
                return;
                        : "ir" ((unsigned int)val)
                        : "memory");
                return;
@@ -333,7 +341,7 @@ void __uatomic_or(void *addr, unsigned long val, int len)
        {
                __asm__ __volatile__(
                "lock; orq %1, %0"
        {
                __asm__ __volatile__(
                "lock; orq %1, %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(8, addr))
                        : "er" ((unsigned long)val)
                        : "memory");
                return;
                        : "er" ((unsigned long)val)
                        : "memory");
                return;
@@ -361,7 +369,7 @@ void __uatomic_add(void *addr, unsigned long val, int len)
        {
                __asm__ __volatile__(
                "lock; addb %1, %0"
        {
                __asm__ __volatile__(
                "lock; addb %1, %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(1, addr))
                        : "iq" ((unsigned char)val)
                        : "memory");
                return;
                        : "iq" ((unsigned char)val)
                        : "memory");
                return;
@@ -370,7 +378,7 @@ void __uatomic_add(void *addr, unsigned long val, int len)
        {
                __asm__ __volatile__(
                "lock; addw %1, %0"
        {
                __asm__ __volatile__(
                "lock; addw %1, %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(2, addr))
                        : "ir" ((unsigned short)val)
                        : "memory");
                return;
                        : "ir" ((unsigned short)val)
                        : "memory");
                return;
@@ -379,7 +387,7 @@ void __uatomic_add(void *addr, unsigned long val, int len)
        {
                __asm__ __volatile__(
                "lock; addl %1, %0"
        {
                __asm__ __volatile__(
                "lock; addl %1, %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(4, addr))
                        : "ir" ((unsigned int)val)
                        : "memory");
                return;
                        : "ir" ((unsigned int)val)
                        : "memory");
                return;
@@ -389,7 +397,7 @@ void __uatomic_add(void *addr, unsigned long val, int len)
        {
                __asm__ __volatile__(
                "lock; addq %1, %0"
        {
                __asm__ __volatile__(
                "lock; addq %1, %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(8, addr))
                        : "er" ((unsigned long)val)
                        : "memory");
                return;
                        : "er" ((unsigned long)val)
                        : "memory");
                return;
@@ -418,7 +426,7 @@ void __uatomic_inc(void *addr, int len)
        {
                __asm__ __volatile__(
                "lock; incb %0"
        {
                __asm__ __volatile__(
                "lock; incb %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(1, addr))
                        :
                        : "memory");
                return;
                        :
                        : "memory");
                return;
@@ -427,7 +435,7 @@ void __uatomic_inc(void *addr, int len)
        {
                __asm__ __volatile__(
                "lock; incw %0"
        {
                __asm__ __volatile__(
                "lock; incw %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(2, addr))
                        :
                        : "memory");
                return;
                        :
                        : "memory");
                return;
@@ -436,7 +444,7 @@ void __uatomic_inc(void *addr, int len)
        {
                __asm__ __volatile__(
                "lock; incl %0"
        {
                __asm__ __volatile__(
                "lock; incl %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(4, addr))
                        :
                        : "memory");
                return;
                        :
                        : "memory");
                return;
@@ -446,7 +454,7 @@ void __uatomic_inc(void *addr, int len)
        {
                __asm__ __volatile__(
                "lock; incq %0"
        {
                __asm__ __volatile__(
                "lock; incq %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(8, addr))
                        :
                        : "memory");
                return;
                        :
                        : "memory");
                return;
@@ -471,7 +479,7 @@ void __uatomic_dec(void *addr, int len)
        {
                __asm__ __volatile__(
                "lock; decb %0"
        {
                __asm__ __volatile__(
                "lock; decb %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(1, addr))
                        :
                        : "memory");
                return;
                        :
                        : "memory");
                return;
@@ -480,7 +488,7 @@ void __uatomic_dec(void *addr, int len)
        {
                __asm__ __volatile__(
                "lock; decw %0"
        {
                __asm__ __volatile__(
                "lock; decw %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(2, addr))
                        :
                        : "memory");
                return;
                        :
                        : "memory");
                return;
@@ -489,7 +497,7 @@ void __uatomic_dec(void *addr, int len)
        {
                __asm__ __volatile__(
                "lock; decl %0"
        {
                __asm__ __volatile__(
                "lock; decl %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(4, addr))
                        :
                        : "memory");
                return;
                        :
                        : "memory");
                return;
@@ -499,7 +507,7 @@ void __uatomic_dec(void *addr, int len)
        {
                __asm__ __volatile__(
                "lock; decq %0"
        {
                __asm__ __volatile__(
                "lock; decq %0"
-                       : "=m"(*__hp(addr))
+                       : "=m"(*__hp(8, addr))
                        :
                        : "memory");
                return;
                        :
                        : "memory");
                return;
@@ -516,7 +524,11 @@ void __uatomic_dec(void *addr, int len)
 
 #define _uatomic_dec(addr)     (__uatomic_dec((addr), sizeof(*(addr))))
 
 
 #define _uatomic_dec(addr)     (__uatomic_dec((addr), sizeof(*(addr))))
 
-#if ((CAA_BITS_PER_LONG != 64) && defined(CONFIG_RCU_COMPAT_ARCH))
+#ifdef URCU_ARCH_X86_NO_CAS
+
+/* For backwards compat */
+#define CONFIG_RCU_COMPAT_ARCH 1
+
 extern int __rcu_cas_avail;
 extern int __rcu_cas_init(void);
 
 extern int __rcu_cas_avail;
 extern int __rcu_cas_init(void);
 
@@ -620,6 +632,474 @@ extern unsigned long _compat_uatomic_add_return(void *addr,
 #define cmm_smp_mb__before_uatomic_dec()       cmm_barrier()
 #define cmm_smp_mb__after_uatomic_dec()                cmm_barrier()
 
 #define cmm_smp_mb__before_uatomic_dec()       cmm_barrier()
 #define cmm_smp_mb__after_uatomic_dec()                cmm_barrier()
 
+static inline void _cmm_compat_c11_smp_mb__before_uatomic_read_mo(enum cmm_memorder mo)
+{
+       /*
+        * A SMP barrier is not necessary for CMM_SEQ_CST because, only a
+        * previous store can be reordered with the load.  However, emitting the
+        * memory barrier after the store is sufficient to prevent reordering
+        * between the two.  This follows toolchains decision of emitting the
+        * memory fence on the stores instead of the loads.
+        *
+        * A compiler barrier is necessary because the underlying operation does
+        * not clobber the registers.
+        */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               cmm_barrier();
+               break;
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       default:
+               abort();
+               break;
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__after_uatomic_read_mo(enum cmm_memorder mo)
+{
+       /*
+        * A SMP barrier is not necessary for CMM_SEQ_CST because following
+        * loads and stores cannot be reordered with the load.
+        *
+        * A SMP barrier is however necessary for CMM_SEQ_CST_FENCE to respect
+        * the memory model, since the underlying operation does not have a lock
+        * prefix.
+        *
+        * A compiler barrier is necessary because the underlying operation does
+        * not clobber the registers.
+        */
+       switch (mo) {
+       case CMM_SEQ_CST_FENCE:
+               cmm_smp_mb();
+               break;
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_SEQ_CST:
+               cmm_barrier();
+               break;
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       default:
+               abort();
+               break;
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__before_uatomic_set_mo(enum cmm_memorder mo)
+{
+       /*
+        * A SMP barrier is not necessary for CMM_SEQ_CST because the store can
+        * only be reodered with later loads
+        *
+        * A compiler barrier is necessary because the underlying operation does
+        * not clobber the registers.
+        */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               cmm_barrier();
+               break;
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       default:
+               abort();
+               break;
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__after_uatomic_set_mo(enum cmm_memorder mo)
+{
+       /*
+        * A SMP barrier is necessary for CMM_SEQ_CST because the store can be
+        * reorded with later loads.  Since no memory barrier is being emitted
+        * before loads, one has to be emitted after the store.  This follows
+        * toolchains decision of emitting the memory fence on the stores instead
+        * of the loads.
+        *
+        * A SMP barrier is necessary for CMM_SEQ_CST_FENCE to respect the
+        * memory model, since the underlying store does not have a lock prefix.
+        *
+        * A compiler barrier is necessary because the underlying operation does
+        * not clobber the registers.
+        */
+       switch (mo) {
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               cmm_smp_mb();
+               break;
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_RELEASE:
+               cmm_barrier();
+               break;
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       default:
+               abort();
+               break;
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__before_uatomic_xchg_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_xchg has implicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__after_uatomic_xchg_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_xchg has implicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__before_uatomic_cmpxchg_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_cmpxchg has implicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__after_uatomic_cmpxchg_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_cmpxchg has implicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__before_uatomic_and_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_and has explicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__after_uatomic_and_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_and has explicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__before_uatomic_or_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_or has explicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__after_uatomic_or_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_or has explicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__before_uatomic_add_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_add has explicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__after_uatomic_add_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_add has explicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__before_uatomic_sub_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_sub has explicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__after_uatomic_sub_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_sub has explicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__before_uatomic_inc_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_inc has explicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__after_uatomic_inc_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_inc has explicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__before_uatomic_dec_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_dec has explicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__after_uatomic_dec_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_dec has explicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__before_uatomic_add_return_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_add_return has explicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__after_uatomic_add_return_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_add_return has explicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__before_uatomic_sub_return_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_sub_return has explicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+static inline void _cmm_compat_c11_smp_mb__after_uatomic_sub_return_mo(enum cmm_memorder mo)
+{
+       /* NOP. uatomic_sub_return has explicit lock prefix. */
+       switch (mo) {
+       case CMM_RELAXED:       /* Fall-through */
+       case CMM_ACQUIRE:       /* Fall-through */
+       case CMM_CONSUME:       /* Fall-through */
+       case CMM_RELEASE:       /* Fall-through */
+       case CMM_ACQ_REL:       /* Fall-through */
+       case CMM_SEQ_CST:       /* Fall-through */
+       case CMM_SEQ_CST_FENCE:
+               break;
+       default:
+               abort();
+       }
+}
+
+#define _cmm_compat_c11_smp_mb__before_mo(operation, mo)                       \
+       do {                                                    \
+               _cmm_compat_c11_smp_mb__before_ ## operation ## _mo (mo);       \
+       } while (0)
+
+#define _cmm_compat_c11_smp_mb__after_mo(operation, mo)                        \
+       do {                                                    \
+               _cmm_compat_c11_smp_mb__after_ ## operation ## _mo (mo);        \
+       } while (0)
+
+
 #ifdef __cplusplus
 }
 #endif
 #ifdef __cplusplus
 }
 #endif
index baaa7a7f67c58125adaf0decca0a50bf990842a9..5c3510fe8219861ff0fba097b14797a13aa1400f 100644 (file)
@@ -1,2 +1,6 @@
+// SPDX-FileCopyrightText: 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #warning "urcu/uatomic_arch.h is deprecated. Please include urcu/uatomic.h instead."
 #include <urcu/uatomic.h>
 #warning "urcu/uatomic_arch.h is deprecated. Please include urcu/uatomic.h instead."
 #include <urcu/uatomic.h>
index d3d122d0f71df610a0276af0e3e5043a6adf4ee7..152c53665ddf64bafdba1c507cdd5d093d3a2f2a 100644 (file)
@@ -1,45 +1,28 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_BP_H
 #define _URCU_BP_H
 
 /*
 #ifndef _URCU_BP_H
 #define _URCU_BP_H
 
 /*
- * urcu-bp.h
- *
  * Userspace RCU header, "bulletproof" version.
  *
  * Slower RCU read-side adapted for tracing library. Does not require thread
  * registration nor unregistration. Also signal-safe.
  *
  * Userspace RCU header, "bulletproof" version.
  *
  * Slower RCU read-side adapted for tracing library. Does not require thread
  * registration nor unregistration. Also signal-safe.
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
  * LGPL-compatible code should include this header with :
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
  * LGPL-compatible code should include this header with :
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 #include <stdlib.h>
 #include <pthread.h>
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 #include <stdlib.h>
 #include <pthread.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
+#include <stdbool.h>
 
 #include <urcu/map/urcu-bp.h>
 
 
 #include <urcu/map/urcu-bp.h>
 
@@ -56,6 +39,11 @@ extern "C" {
  * publication headers.
  */
 #include <urcu/pointer.h>
  * publication headers.
  */
 #include <urcu/pointer.h>
+#include <urcu/urcu-poll.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
 
 #ifdef _LGPL_SOURCE
 
 
 #ifdef _LGPL_SOURCE
 
@@ -140,6 +128,12 @@ extern void *urcu_bp_set_pointer_sym(void **p, void *v);
 
 extern void urcu_bp_synchronize_rcu(void);
 
 
 extern void urcu_bp_synchronize_rcu(void);
 
+/*
+ * RCU grace period polling API.
+ */
+extern struct urcu_gp_poll_state urcu_bp_start_poll_synchronize_rcu(void);
+extern bool urcu_bp_poll_state_synchronize_rcu(struct urcu_gp_poll_state state);
+
 /*
  * urcu_bp_before_fork, urcu_bp_after_fork_parent and urcu_bp_after_fork_child
  * should be called around fork() system calls when the child process is not
 /*
  * urcu_bp_before_fork, urcu_bp_after_fork_parent and urcu_bp_after_fork_child
  * should be called around fork() system calls when the child process is not
@@ -151,12 +145,14 @@ extern void urcu_bp_after_fork_parent(void);
 extern void urcu_bp_after_fork_child(void);
 
 /*
 extern void urcu_bp_after_fork_child(void);
 
 /*
- * In the bulletproof version, the following functions are no-ops.
+ * In the bulletproof version, thread registration is performed lazily,
+ * but it can be forced by issuing an explicit urcu_bp_register_thread().
  */
  */
-static inline void urcu_bp_register_thread(void)
-{
-}
+extern void urcu_bp_register_thread(void);
 
 
+/*
+ * In the bulletproof version, the following functions are no-ops.
+ */
 static inline void urcu_bp_unregister_thread(void)
 {
 }
 static inline void urcu_bp_unregister_thread(void)
 {
 }
index a1abffb85a1fa8ee8575b5474aa6547e54e0c923..65c2a6b8efc54c32edac581783f8f604df42a7b9 100644 (file)
@@ -1,2 +1,6 @@
+// SPDX-FileCopyrightText: 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #warning "urcu/urcu-futex.h is deprecated. Please include urcu/futex.h instead."
 #include <urcu/futex.h>
 #warning "urcu/urcu-futex.h is deprecated. Please include urcu/futex.h instead."
 #include <urcu/futex.h>
index ab485f112f6177c37fa9d1bebe3bc5ef15f4c470..acd02d09750413919d9350135c5432d7c1d8be33 100644 (file)
@@ -1,44 +1,32 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_MB_H
 #define _URCU_MB_H
 
 /*
 #ifndef _URCU_MB_H
 #define _URCU_MB_H
 
 /*
- * urcu-mb.h
- *
  * Userspace RCU header
  *
  * Userspace RCU header
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
  * LGPL-compatible code should include this header with :
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
  * LGPL-compatible code should include this header with :
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 #include <stdlib.h>
 #include <pthread.h>
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 #include <stdlib.h>
 #include <pthread.h>
+#include <stdbool.h>
 
 /*
  * See urcu/pointer.h and urcu/static/pointer.h for pointer
  * publication headers.
  */
 #include <urcu/pointer.h>
 
 /*
  * See urcu/pointer.h and urcu/static/pointer.h for pointer
  * publication headers.
  */
 #include <urcu/pointer.h>
+#include <urcu/urcu-poll.h>
 
 #ifdef __cplusplus
 extern "C" {
 
 #ifdef __cplusplus
 extern "C" {
@@ -90,6 +78,12 @@ extern int urcu_mb_read_ongoing(void);
 
 extern void urcu_mb_synchronize_rcu(void);
 
 
 extern void urcu_mb_synchronize_rcu(void);
 
+/*
+ * RCU grace period polling API.
+ */
+extern struct urcu_gp_poll_state urcu_mb_start_poll_synchronize_rcu(void);
+extern bool urcu_mb_poll_state_synchronize_rcu(struct urcu_gp_poll_state state);
+
 /*
  * Reader thread registration.
  */
 /*
  * Reader thread registration.
  */
index c11c93e850fcb065e4dc07ce982701364a8c97b7..c89b4c0d6f3fb001a8996e414b4f9c4f8f0c8526 100644 (file)
@@ -1,44 +1,32 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_MEMB_H
 #define _URCU_MEMB_H
 
 /*
 #ifndef _URCU_MEMB_H
 #define _URCU_MEMB_H
 
 /*
- * urcu-memb.h
- *
  * Userspace RCU header
  *
  * Userspace RCU header
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
  * LGPL-compatible code should include this header with :
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
  * LGPL-compatible code should include this header with :
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 #include <stdlib.h>
 #include <pthread.h>
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 #include <stdlib.h>
 #include <pthread.h>
+#include <stdbool.h>
 
 /*
  * See urcu/pointer.h and urcu/static/pointer.h for pointer
  * publication headers.
  */
 #include <urcu/pointer.h>
 
 /*
  * See urcu/pointer.h and urcu/static/pointer.h for pointer
  * publication headers.
  */
 #include <urcu/pointer.h>
+#include <urcu/urcu-poll.h>
 
 #ifdef __cplusplus
 extern "C" {
 
 #ifdef __cplusplus
 extern "C" {
@@ -90,6 +78,12 @@ extern int urcu_memb_read_ongoing(void);
 
 extern void urcu_memb_synchronize_rcu(void);
 
 
 extern void urcu_memb_synchronize_rcu(void);
 
+/*
+ * RCU grace period polling API.
+ */
+extern struct urcu_gp_poll_state urcu_memb_start_poll_synchronize_rcu(void);
+extern bool urcu_memb_poll_state_synchronize_rcu(struct urcu_gp_poll_state state);
+
 /*
  * Reader thread registration.
  */
 /*
  * Reader thread registration.
  */
diff --git a/include/urcu/urcu-poll.h b/include/urcu/urcu-poll.h
new file mode 100644 (file)
index 0000000..c52d695
--- /dev/null
@@ -0,0 +1,16 @@
+// SPDX-FileCopyrightText: 2023 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+#ifndef _URCU_POLL_H
+#define _URCU_POLL_H
+
+/*
+ * Userspace RCU polling header
+ */
+
+struct urcu_gp_poll_state {
+       unsigned long grace_period_id;
+};
+
+#endif /* _URCU_POLL_H */
index 28e60655d47d8a8300aace24b8c1b54ba911ff7f..c2a3e1929a64dd07db011674824e981ea700bd8f 100644 (file)
@@ -1,9 +1,12 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_QSBR_H
 #define _URCU_QSBR_H
 
 /*
 #ifndef _URCU_QSBR_H
 #define _URCU_QSBR_H
 
 /*
- * urcu-qsbr.h
- *
  * Userspace RCU QSBR header.
  *
  * LGPL-compatible code should include this header with :
  * Userspace RCU QSBR header.
  *
  * LGPL-compatible code should include this header with :
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 #include <stdlib.h>
 #include <pthread.h>
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 #include <stdlib.h>
 #include <pthread.h>
+#include <stdbool.h>
+
+#include <urcu/config.h>
 
 /*
  * See urcu/pointer.h and urcu/static/pointer.h for pointer
  * publication headers.
  */
 #include <urcu/pointer.h>
 
 /*
  * See urcu/pointer.h and urcu/static/pointer.h for pointer
  * publication headers.
  */
 #include <urcu/pointer.h>
+#include <urcu/urcu-poll.h>
 
 #ifdef __cplusplus
 extern "C" {
 
 #ifdef __cplusplus
 extern "C" {
@@ -123,6 +116,12 @@ extern void urcu_qsbr_thread_online(void);
 
 extern void urcu_qsbr_synchronize_rcu(void);
 
 
 extern void urcu_qsbr_synchronize_rcu(void);
 
+/*
+ * RCU grace period polling API.
+ */
+extern struct urcu_gp_poll_state urcu_qsbr_start_poll_synchronize_rcu(void);
+extern bool urcu_qsbr_poll_state_synchronize_rcu(struct urcu_gp_poll_state state);
+
 /*
  * Reader thread registration.
  */
 /*
  * Reader thread registration.
  */
diff --git a/include/urcu/urcu-signal.h b/include/urcu/urcu-signal.h
deleted file mode 100644 (file)
index 59c5d01..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-#ifndef _URCU_SIGNAL_H
-#define _URCU_SIGNAL_H
-
-/*
- * urcu-signal.h
- *
- * Userspace RCU header
- *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * LGPL-compatible code should include this header with :
- *
- * #define _LGPL_SOURCE
- * #include <urcu.h>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * IBM's contributions to this file may be relicensed under LGPLv2 or later.
- */
-
-#include <stdlib.h>
-#include <pthread.h>
-
-/*
- * See urcu/pointer.h and urcu/static/pointer.h for pointer
- * publication headers.
- */
-#include <urcu/pointer.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <urcu/map/urcu-signal.h>
-
-/*
- * Important !
- *
- * Each thread containing read-side critical sections must be registered
- * with rcu_register_thread_mb() before calling rcu_read_lock_mb().
- * rcu_unregister_thread_mb() should be called before the thread exits.
- */
-
-#ifdef _LGPL_SOURCE
-
-#include <urcu/static/urcu-signal.h>
-
-/*
- * Mappings for static use of the userspace RCU library.
- * Should only be used in LGPL-compatible code.
- */
-
-/*
- * rcu_read_lock()
- * rcu_read_unlock()
- *
- * Mark the beginning and end of a read-side critical section.
- * DON'T FORGET TO USE RCU_REGISTER/UNREGISTER_THREAD() FOR EACH THREAD WITH
- * READ-SIDE CRITICAL SECTION.
- */
-#define urcu_signal_read_lock          _urcu_signal_read_lock
-#define urcu_signal_read_unlock                _urcu_signal_read_unlock
-#define urcu_signal_read_ongoing       _urcu_signal_read_ongoing
-
-#else /* !_LGPL_SOURCE */
-
-/*
- * library wrappers to be used by non-LGPL compatible source code.
- * See LGPL-only urcu/static/pointer.h for documentation.
- */
-
-extern void urcu_signal_read_lock(void);
-extern void urcu_signal_read_unlock(void);
-extern int urcu_signal_read_ongoing(void);
-
-#endif /* !_LGPL_SOURCE */
-
-extern void urcu_signal_synchronize_rcu(void);
-
-/*
- * Reader thread registration.
- */
-extern void urcu_signal_register_thread(void);
-extern void urcu_signal_unregister_thread(void);
-
-/*
- * Explicit rcu initialization, for "early" use within library constructors.
- */
-extern void urcu_signal_init(void);
-
-/*
- * Q.S. reporting are no-ops for these URCU flavors.
- */
-static inline void urcu_signal_quiescent_state(void)
-{
-}
-
-static inline void urcu_signal_thread_offline(void)
-{
-}
-
-static inline void urcu_signal_thread_online(void)
-{
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#include <urcu/call-rcu.h>
-#include <urcu/defer.h>
-#include <urcu/flavor.h>
-
-#ifndef URCU_API_MAP
-#include <urcu/map/clear.h>
-#endif
-
-#endif /* _URCU_SIGNAL_H */
index 79cf590f61da2022dfc8b56468b0bf45eec6c3bc..4df48e4ba3cd13f443e1d7d19bcd0b7db55b6ab6 100644 (file)
@@ -1,44 +1,28 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_H
 #define _URCU_H
 
 /*
 #ifndef _URCU_H
 #define _URCU_H
 
 /*
- * urcu.h
- *
  * Userspace RCU header
  *
  * Userspace RCU header
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
  * LGPL-compatible code should include this header with :
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
  * LGPL-compatible code should include this header with :
  *
  * #define _LGPL_SOURCE
  * #include <urcu.h>
  *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
-#if !defined(RCU_MEMBARRIER) && !defined(RCU_SIGNAL) && !defined(RCU_MB)
+#if !defined(RCU_MEMBARRIER) && !defined(RCU_MB)
 #define RCU_MEMBARRIER
 #endif
 
 #ifdef RCU_MEMBARRIER
 #include <urcu/urcu-memb.h>
 #define RCU_MEMBARRIER
 #endif
 
 #ifdef RCU_MEMBARRIER
 #include <urcu/urcu-memb.h>
-#elif defined(RCU_SIGNAL)
-#include <urcu/urcu-signal.h>
 #elif defined(RCU_MB)
 #include <urcu/urcu-mb.h>
 #else
 #elif defined(RCU_MB)
 #include <urcu/urcu-mb.h>
 #else
index 5579ca6c93caed06b69c6f35d31138d2e32fe650..916a9df317dc76e649ccecd6781d6d8d8528b3ac 100644 (file)
@@ -1,2 +1,6 @@
+// SPDX-FileCopyrightText: 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #warning "urcu/urcu_ref.h is deprecated. Please include urcu/ref.h instead."
 #include <urcu/ref.h>
 #warning "urcu/urcu_ref.h is deprecated. Please include urcu/ref.h instead."
 #include <urcu/ref.h>
index 6c6ebba9e4453257da70484cecc6840bbdab0364..bba5c558d96cef1015c2a3197c5fe43797356e9d 100644 (file)
@@ -1,31 +1,16 @@
+// SPDX-FileCopyrightText: 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2011-2012 Lai Jiangshan <laijs@cn.fujitsu.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_WFCQUEUE_H
 #define _URCU_WFCQUEUE_H
 
 /*
 #ifndef _URCU_WFCQUEUE_H
 #define _URCU_WFCQUEUE_H
 
 /*
- * urcu/wfcqueue.h
- *
  * Userspace RCU library - Concurrent Queue with Wait-Free Enqueue/Blocking Dequeue
  * Userspace RCU library - Concurrent Queue with Wait-Free Enqueue/Blocking Dequeue
- *
- * Copyright 2010-2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright 2011-2012 - Lai Jiangshan <laijs@cn.fujitsu.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <pthread.h>
  */
 
 #include <pthread.h>
-#include <assert.h>
 #include <stdbool.h>
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
 #include <stdbool.h>
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
@@ -74,17 +59,30 @@ struct cds_wfcq_head {
        pthread_mutex_t lock;
 };
 
        pthread_mutex_t lock;
 };
 
-#ifndef __cplusplus
 /*
 /*
- * The transparent union allows calling functions that work on both
+ * In C, the transparent union allows calling functions that work on both
  * struct cds_wfcq_head and struct __cds_wfcq_head on any of those two
  * types.
  * struct cds_wfcq_head and struct __cds_wfcq_head on any of those two
  * types.
+ *
+ * In C++, implement static inline wrappers using function overloading
+ * to obtain an API similar to C.
+ *
+ * Avoid complaints from clang++ not knowing the transparent union
+ * attribute.
  */
  */
+#if defined(__clang__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wignored-attributes"
+#endif
 typedef union {
        struct __cds_wfcq_head *_h;
        struct cds_wfcq_head *h;
 } __attribute__((__transparent_union__)) cds_wfcq_head_ptr_t;
 typedef union {
        struct __cds_wfcq_head *_h;
        struct cds_wfcq_head *h;
 } __attribute__((__transparent_union__)) cds_wfcq_head_ptr_t;
+#if defined(__clang__)
+#pragma clang diagnostic pop
+#endif
 
 
+#ifndef __cplusplus
 /*
  * This static inline is only present for compatibility with C++. It is
  * effect-less in C.
 /*
  * This static inline is only present for compatibility with C++. It is
  * effect-less in C.
@@ -104,19 +102,20 @@ static inline struct cds_wfcq_head *cds_wfcq_head_cast(struct cds_wfcq_head *hea
 }
 #else /* #ifndef __cplusplus */
 
 }
 #else /* #ifndef __cplusplus */
 
-/* C++ ignores transparent union. */
-typedef union {
-       struct __cds_wfcq_head *_h;
-       struct cds_wfcq_head *h;
-} cds_wfcq_head_ptr_t;
-
-/* C++ ignores transparent union. Requires an explicit conversion. */
+/*
+ * This static inline is used by internally in the static inline
+ * implementation of the API.
+ */
 static inline cds_wfcq_head_ptr_t __cds_wfcq_head_cast(struct __cds_wfcq_head *head)
 {
        cds_wfcq_head_ptr_t ret = { ._h = head };
        return ret;
 }
 static inline cds_wfcq_head_ptr_t __cds_wfcq_head_cast(struct __cds_wfcq_head *head)
 {
        cds_wfcq_head_ptr_t ret = { ._h = head };
        return ret;
 }
-/* C++ ignores transparent union. Requires an explicit conversion. */
+
+/*
+ * This static inline is used by internally in the static inline
+ * implementation of the API.
+ */
 static inline cds_wfcq_head_ptr_t cds_wfcq_head_cast(struct cds_wfcq_head *head)
 {
        cds_wfcq_head_ptr_t ret = { .h = head };
 static inline cds_wfcq_head_ptr_t cds_wfcq_head_cast(struct cds_wfcq_head *head)
 {
        cds_wfcq_head_ptr_t ret = { .h = head };
@@ -483,6 +482,115 @@ extern struct cds_wfcq_node *__cds_wfcq_next_nonblocking(
 
 #ifdef __cplusplus
 }
 
 #ifdef __cplusplus
 }
+
+/*
+ * In C++, implement static inline wrappers using function overloading
+ * to obtain an API similar to C.
+ */
+
+static inline cds_wfcq_head_ptr_t cds_wfcq_head_cast_cpp(struct __cds_wfcq_head *head)
+{
+       cds_wfcq_head_ptr_t ret = { ._h = head };
+       return ret;
+}
+
+static inline cds_wfcq_head_ptr_t cds_wfcq_head_cast_cpp(struct cds_wfcq_head *head)
+{
+       cds_wfcq_head_ptr_t ret = { .h = head };
+       return ret;
+}
+
+template<typename T> static inline bool cds_wfcq_empty(T head,
+               struct cds_wfcq_tail *tail)
+{
+       return cds_wfcq_empty(cds_wfcq_head_cast_cpp(head), tail);
+}
+
+template<typename T> static inline bool cds_wfcq_enqueue(T head,
+               struct cds_wfcq_tail *tail,
+               struct cds_wfcq_node *node)
+{
+       return cds_wfcq_enqueue(cds_wfcq_head_cast_cpp(head), tail, node);
+}
+
+template<typename T> static inline struct cds_wfcq_node *__cds_wfcq_dequeue_blocking(
+               T head, struct cds_wfcq_tail *tail)
+{
+       return __cds_wfcq_dequeue_blocking(cds_wfcq_head_cast_cpp(head), tail);
+}
+
+template<typename T> static inline struct cds_wfcq_node *__cds_wfcq_dequeue_with_state_blocking(
+               T head, struct cds_wfcq_tail *tail, int *state)
+{
+       return __cds_wfcq_dequeue_with_state_blocking(cds_wfcq_head_cast_cpp(head),
+                       tail, state);
+}
+
+template<typename T> static inline struct cds_wfcq_node *__cds_wfcq_dequeue_nonblocking(
+               T head, struct cds_wfcq_tail *tail)
+{
+       return __cds_wfcq_dequeue_nonblocking(cds_wfcq_head_cast_cpp(head), tail);
+}
+
+template<typename T> static inline struct cds_wfcq_node *__cds_wfcq_dequeue_with_state_nonblocking(
+               T head, struct cds_wfcq_tail *tail, int *state)
+{
+       return __cds_wfcq_dequeue_with_state_nonblocking(cds_wfcq_head_cast_cpp(head),
+                       tail, state);
+}
+
+template<typename T, typename U> static inline enum cds_wfcq_ret __cds_wfcq_splice_blocking(
+               T dest_q_head,
+               struct cds_wfcq_tail *dest_q_tail,
+               U src_q_head,
+               struct cds_wfcq_tail *src_q_tail)
+{
+       return __cds_wfcq_splice_blocking(cds_wfcq_head_cast_cpp(dest_q_head),
+                       dest_q_tail,
+                       cds_wfcq_head_cast_cpp(src_q_head),
+                       src_q_tail);
+}
+
+template<typename T, typename U> static inline enum cds_wfcq_ret __cds_wfcq_splice_nonblocking(
+               T dest_q_head,
+               struct cds_wfcq_tail *dest_q_tail,
+               U *src_q_head,
+               struct cds_wfcq_tail *src_q_tail)
+{
+       return __cds_wfcq_splice_nonblocking(cds_wfcq_head_cast_cpp(dest_q_head),
+                       dest_q_tail,
+                       cds_wfcq_head_cast_cpp(src_q_head),
+                       src_q_tail);
+}
+
+template<typename T> static inline struct cds_wfcq_node *__cds_wfcq_first_blocking(
+               T head, struct cds_wfcq_tail *tail)
+{
+       return __cds_wfcq_first_blocking(cds_wfcq_head_cast_cpp(head), tail);
+}
+
+template<typename T> static inline struct cds_wfcq_node *__cds_wfcq_first_nonblocking(
+               T head, struct cds_wfcq_tail *tail)
+{
+       return __cds_wfcq_first_nonblocking(cds_wfcq_head_cast_cpp(head), tail);
+}
+
+template<typename T> static inline struct cds_wfcq_node *__cds_wfcq_next_blocking(
+               T head,
+               struct cds_wfcq_tail *tail,
+               struct cds_wfcq_node *node)
+{
+       return __cds_wfcq_next_blocking(cds_wfcq_head_cast_cpp(head), tail, node);
+}
+
+template<typename T> static inline struct cds_wfcq_node *__cds_wfcq_next_nonblocking(
+               T head,
+               struct cds_wfcq_tail *tail,
+               struct cds_wfcq_node *node)
+{
+       return __cds_wfcq_next_nonblocking(cds_wfcq_head_cast_cpp(head), tail, node);
+}
+
 #endif
 
 #endif /* _URCU_WFCQUEUE_H */
 #endif
 
 #endif /* _URCU_WFCQUEUE_H */
index 2ba86248aa7095c4ca83e94b13769c073507a58c..45506ea21cf49065295795e3bcc7df7df615cdad 100644 (file)
@@ -1,30 +1,15 @@
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_WFQUEUE_H
 #define _URCU_WFQUEUE_H
 
 /*
 #ifndef _URCU_WFQUEUE_H
 #define _URCU_WFQUEUE_H
 
 /*
- * wfqueue.h
- *
  * Userspace RCU library - Queue with Wait-Free Enqueue/Blocking Dequeue
  * Userspace RCU library - Queue with Wait-Free Enqueue/Blocking Dequeue
- *
- * Copyright 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <pthread.h>
  */
 
 #include <pthread.h>
-#include <assert.h>
 #include <urcu/compiler.h>
 
 #ifdef __cplusplus
 #include <urcu/compiler.h>
 
 #ifdef __cplusplus
index 9d693053117ceb93e69034e433f2196a22c3070d..38e5b6b2dcb3099dec87f8a6b3fb4f5750e93fb1 100644 (file)
@@ -1,30 +1,15 @@
+// SPDX-FileCopyrightText: 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_WFSTACK_H
 #define _URCU_WFSTACK_H
 
 /*
 #ifndef _URCU_WFSTACK_H
 #define _URCU_WFSTACK_H
 
 /*
- * urcu/wfstack.h
- *
  * Userspace RCU library - Stack with wait-free push, blocking traversal.
  * Userspace RCU library - Stack with wait-free push, blocking traversal.
- *
- * Copyright 2010-2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <pthread.h>
  */
 
 #include <pthread.h>
-#include <assert.h>
 #include <stdbool.h>
 #include <urcu/compiler.h>
 
 #include <stdbool.h>
 #include <urcu/compiler.h>
 
@@ -58,7 +43,7 @@ extern "C" {
  * synchronization.
  */
 
  * synchronization.
  */
 
-#define CDS_WFS_WOULDBLOCK     ((void *) -1UL)
+#define CDS_WFS_WOULDBLOCK     ((struct cds_wfs_node *) -1UL)
 
 enum cds_wfs_state {
        CDS_WFS_STATE_LAST =            (1U << 0),
 
 enum cds_wfs_state {
        CDS_WFS_STATE_LAST =            (1U << 0),
@@ -93,14 +78,27 @@ struct cds_wfs_stack {
 };
 
 /*
 };
 
 /*
- * The transparent union allows calling functions that work on both
+ * In C, the transparent union allows calling functions that work on both
  * struct cds_wfs_stack and struct __cds_wfs_stack on any of those two
  * types.
  * struct cds_wfs_stack and struct __cds_wfs_stack on any of those two
  * types.
+ *
+ * In C++, implement static inline wrappers using function overloading
+ * to obtain an API similar to C.
+ *
+ * Avoid complaints from clang++ not knowing the transparent union
+ * attribute.
  */
  */
+#if defined(__clang__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wignored-attributes"
+#endif
 typedef union {
        struct __cds_wfs_stack *_s;
        struct cds_wfs_stack *s;
 } __attribute__((__transparent_union__)) cds_wfs_stack_ptr_t;
 typedef union {
        struct __cds_wfs_stack *_s;
        struct cds_wfs_stack *s;
 } __attribute__((__transparent_union__)) cds_wfs_stack_ptr_t;
+#if defined(__clang__)
+#pragma clang diagnostic pop
+#endif
 
 #ifdef _LGPL_SOURCE
 
 
 #ifdef _LGPL_SOURCE
 
@@ -319,10 +317,6 @@ extern struct cds_wfs_head *__cds_wfs_pop_all(cds_wfs_stack_ptr_t u_stack);
 
 #endif /* !_LGPL_SOURCE */
 
 
 #endif /* !_LGPL_SOURCE */
 
-#ifdef __cplusplus
-}
-#endif
-
 /*
  * cds_wfs_for_each_blocking: Iterate over all nodes returned by
  * __cds_wfs_pop_all().
 /*
  * cds_wfs_for_each_blocking: Iterate over all nodes returned by
  * __cds_wfs_pop_all().
@@ -354,4 +348,68 @@ extern struct cds_wfs_head *__cds_wfs_pop_all(cds_wfs_stack_ptr_t u_stack);
                node != NULL;                                              \
                node = n, n = (node ? cds_wfs_next_blocking(node) : NULL))
 
                node != NULL;                                              \
                node = n, n = (node ? cds_wfs_next_blocking(node) : NULL))
 
+#ifdef __cplusplus
+}
+
+/*
+ * In C++, implement static inline wrappers using function overloading
+ * to obtain an API similar to C.
+ */
+
+static inline cds_wfs_stack_ptr_t cds_wfs_stack_cast(struct __cds_wfs_stack *s)
+{
+       cds_wfs_stack_ptr_t ret = {
+               ._s = s,
+       };
+       return ret;
+}
+
+static inline cds_wfs_stack_ptr_t cds_wfs_stack_cast(struct cds_wfs_stack *s)
+{
+       cds_wfs_stack_ptr_t ret = {
+               .s = s,
+       };
+       return ret;
+}
+
+template<typename T> static inline bool cds_wfs_empty(T s)
+{
+       return cds_wfs_empty(cds_wfs_stack_cast(s));
+}
+
+template<typename T> static inline int cds_wfs_push(T s, struct cds_wfs_node *node)
+{
+       return cds_wfs_push(cds_wfs_stack_cast(s), node);
+}
+
+template<typename T> static inline struct cds_wfs_node *__cds_wfs_pop_blocking(T s)
+{
+       return __cds_wfs_pop_blocking(cds_wfs_stack_cast(s));
+}
+
+template<typename T> static inline struct cds_wfs_node *
+       __cds_wfs_pop_with_state_blocking(T s, int *state)
+{
+       return __cds_wfs_pop_with_state_blocking(cds_wfs_stack_cast(s), state);
+}
+
+template<typename T> static inline struct cds_wfs_node *__cds_wfs_pop_nonblocking(T s)
+
+{
+       return __cds_wfs_pop_nonblocking(cds_wfs_stack_cast(s));
+}
+
+template<typename T> static inline struct cds_wfs_node *
+       __cds_wfs_pop_with_state_nonblocking(T s, int *state)
+{
+       return __cds_wfs_pop_with_state_nonblocking(cds_wfs_stack_cast(s), state);
+}
+
+template<typename T> static inline struct cds_wfs_head *__cds_wfs_pop_all(T s)
+{
+       return __cds_wfs_pop_all(cds_wfs_stack_cast(s));
+}
+
+#endif
+
 #endif /* _URCU_WFSTACK_H */
 #endif /* _URCU_WFSTACK_H */
diff --git a/lgpl-2.1.txt b/lgpl-2.1.txt
deleted file mode 100644 (file)
index 602bfc9..0000000
+++ /dev/null
@@ -1,504 +0,0 @@
-                 GNU LESSER GENERAL PUBLIC LICENSE
-                      Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-                           Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-\f
-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-\f
-                 GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-\f
-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-\f
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-\f
-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-\f
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-\f
-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-\f
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-                           NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-                    END OF TERMS AND CONDITIONS
-\f
-           How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library 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
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/lgpl-relicensing.md b/lgpl-relicensing.md
new file mode 100644 (file)
index 0000000..10e7832
--- /dev/null
@@ -0,0 +1,37 @@
+<!--
+SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+
+SPDX-License-Identifier: CC-BY-4.0
+-->
+
+# Userspace-RCU LGPL 2.1+ re-licensing
+
+Mathieu Desnoyers
+May 13th, 2009
+
+IBM Corporation allowed LGPLv2.1+ licensing of their contribution to the
+userspace RCU library in a patch submitted on May 8, 2009 from Paul E.
+McKenney and reviewed by Steven L. Bennett:
+
+    https://lists.lttng.org/pipermail/lttng-dev/2009-May/012835.html
+
+I (Mathieu Desnoyers) re-implemented ACCESS_ONCE(), likely(), unlikely() and
+barrier() from scratch without reference to the original code.
+
+    commit id : 2dc5fa0f7cfbfb0a64a7a67b39626650e863f16a
+
+Bert Wesarg <bert.wesarg@googlemail.com> approved LGPL re-licensing of his
+patch in an email dated May 13, 2009 :
+
+    http://lkml.org/lkml/2009/5/13/16
+
+xchg() primitives has been rewritten from a MIT-licensed cmpxchg for Intel
+and powerpc. They are MIT-licensed and therefore usable in LGPL code.
+This cmpxchg code was obtained from the atomic_ops project:
+
+    http://www.hpl.hp.com/research/linux/atomic_ops/
+
+I (Mathieu Desnoyers) wrote the remainder of the code.
+
+The license for the library files in this project was therefore changed to
+LGPLv2.1 on May 13, 2009, as detailed in LICENSE.
diff --git a/lgpl-relicensing.txt b/lgpl-relicensing.txt
deleted file mode 100644 (file)
index 3e47d3f..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-Mathieu Desnoyers
-May 13th, 2009
-
-IBM Corporation allowed LGPLv2.1+ licensing of their contribution to the
-userspace RCU library in a patch submitted on May 8, 2009 from Paul E.
-McKenney and reviewed by Steven L. Bennett:
-
-   https://lists.lttng.org/pipermail/lttng-dev/2009-May/012835.html
-
-I (Mathieu Desnoyers) re-implemented ACCESS_ONCE(), likely(), unlikely() and
-barrier() from scratch without reference to the original code.
-
-   commit id : 2dc5fa0f7cfbfb0a64a7a67b39626650e863f16a
-
-Bert Wesarg <bert.wesarg@googlemail.com> approved LGPL relicensing of his
-patch in an email dated May 13, 2009 :
-
-   http://lkml.org/lkml/2009/5/13/16
-
-xchg() primitives has been rewritten from a MIT-licensed cmpxchg for Intel
-and powerpc. They are MIT-licensed and therefore usable in LGPL code.
-This cmpxchg code was obtained from the atomic_ops project:
-
-       http://www.hpl.hp.com/research/linux/atomic_ops/
-
-I (Mathieu Desnoyers) wrote the remainder of the code.
-
-The license for the library files in this project was therefore changed to
-LGPLv2.1 on May 13, 2009, as detailed in LICENSE.
diff --git a/m4/ae_cc_atomic_builtins.m4 b/m4/ae_cc_atomic_builtins.m4
new file mode 100644 (file)
index 0000000..0bdb8d0
--- /dev/null
@@ -0,0 +1,52 @@
+# SPDX-License-Identifier: GPL-2.0-or-later WITH LicenseRef-Autoconf-exception-macro
+# SPDX-FileCopyrightText: 2023 Michael Jeanson <mjeanson@efficios.com>
+#
+# SYNOPSIS
+#
+#   AE_CC_ATOMIC_BUILTINS([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+#
+
+#serial 1
+
+AC_DEFUN([AE_CC_ATOMIC_BUILTINS], [
+AC_REQUIRE([AC_PROG_CC])
+AC_LANG_PUSH([C])
+
+AC_CACHE_CHECK(
+  [whether $CC supports atomic builtins],
+  [ae_cv_cc_atomic_builtins],
+  [
+    AC_LINK_IFELSE([
+      AC_LANG_PROGRAM([
+        int x, y;
+      ],[
+        __atomic_store_n(&x, 0, __ATOMIC_RELAXED);
+        __atomic_load_n(&x, __ATOMIC_RELAXED);
+        y = __atomic_exchange_n(&x, 1, __ATOMIC_RELAXED);
+        __atomic_compare_exchange_n(&x, &y, 0, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
+        __atomic_add_fetch(&x, 1, __ATOMIC_RELAXED);
+        __atomic_sub_fetch(&x, 1, __ATOMIC_RELAXED);
+        __atomic_and_fetch(&x, 0x01, __ATOMIC_RELAXED);
+        __atomic_or_fetch(&x, 0x01, __ATOMIC_RELAXED);
+        __atomic_thread_fence(__ATOMIC_RELAXED);
+        __atomic_signal_fence(__ATOMIC_RELAXED);
+      ])
+    ],[
+      ae_cv_cc_atomic_builtins=yes
+    ],[
+      ae_cv_cc_atomic_builtins=no
+    ])
+  ]
+)
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test "x$ae_cv_cc_atomic_builtins" = "xyes"; then
+  $1
+  :
+else
+  $2
+  :
+fi
+
+AC_LANG_POP
+])dnl AE_CC_ATOMIC_BUILTINS
diff --git a/m4/ae_config_feature.m4 b/m4/ae_config_feature.m4
new file mode 100644 (file)
index 0000000..d34f5b5
--- /dev/null
@@ -0,0 +1,231 @@
+# SPDX-FileCopyrightText: 2020 Michael Jeanson <mjeanson@efficios.com>
+# SPDX-FileCopyrightText: 2008 Francesco Salvestrini <salvestrini@users.sourceforge.net>
+#
+# SPDX-License-Identifier: GPL-2.0-or-later WITH LicenseRef-Autoconf-exception-macro
+#
+# SYNOPSIS
+#
+#   AE_FEATURE(FEATURE-NAME, FEATURE-DESCRIPTION,
+#              ACTION-IF-GIVEN?, ACTION-IF-NOT-GIVEN?,
+#              ACTION-IF-ENABLED?, ACTION-IF-NOT-ENABLED?)
+#
+# DESCRIPTION
+#
+#   AE_FEATURE is a simple wrapper for AC_ARG_ENABLE.
+#
+#   FEATURE-NAME should consist only of alphanumeric characters, dashes,
+#   plus signs, and dots.
+#
+#   FEATURE-DESCRIPTION will be formatted with AS_HELP_STRING.
+#
+#   If the user gave configure the option --enable-FEATURE or --disable-FEATURE,
+#   run shell commands ACTION-IF-GIVEN. If neither option was given, run shell
+#   commands ACTION-IF-NOT-GIVEN. The name feature indicates an optional
+#
+#   If the feature is enabled, run shell commands ACTION-IF-ENABLED, if it is
+#   disabled, run shell commands ACTION-IF-NOT-ENABLED.
+#
+#   A FEATURE has 3 different states, enabled, disabled and undefined. The first
+#   two are self explanatory, the third state means it's disabled by default
+#   and it was not explicitly enabled or disabled by the user or by the
+#   AE_FEATURE_ENABLE and AE_FEATURE_DISABLE macros.
+#
+#   A feature is disabled by default, in order to change this behaviour use the
+#   AE_FEATURE_DEFAULT_ENABLE and AE_FEATURE_DEFAULT_DISABLE
+#   macros.
+#
+#   A simple example:
+#
+#     AE_FEATURE_DEFAULT_ENABLE
+#     AE_FEATURE(feature_xxxxx, [turns on/off XXXXX support])
+#
+#     ...
+#
+#     AE_FEATURE_DEFAULT_DISABLE
+#     AE_FEATURE(feature_yyyyy, [turns on/off YYYYY support])
+#     AM_CONDITIONAL(YYYYY, AE_IS_FEATURE_ENABLED([feature_yyyyy]))
+#
+#     AE_FEATURE_DEFAULT_ENABLE
+#     AE_FEATURE(...)
+#
+#     ...
+#
+#   Use AE_FEATURE_ENABLE or AE_FEATURE_DISABLE in order to
+#   enable or disable a specific feature.
+#
+#   Another simple example:
+#
+#     AS_IF([some_test_here],[AE_FEATURE_ENABLE(feature_xxxxx)],[])
+#
+#     AE_FEATURE(feature_xxxxx, [turns on/off XXXXX support],
+#                       HAVE_XXXXX, [Define if you want XXXXX support])
+#     AE_FEATURE(feature_yyyyy, [turns on/off YYYYY support],
+#                       HAVE_YYYYY, [Define if you want YYYYY support])
+#
+#     ...
+#
+#   NOTE: AE_FEATURE_ENABLE/DISABLE() must be placed first of the relative
+#   AE_FEATURE() macro if you want the the proper ACTION-IF-ENABLED and
+#   ACTION-IF-NOT-ENABLED to run.
+
+#serial 3
+
+
+# AE_FEATURE_DEFAULT_ENABLE: The next feature defined with AE_FEATURE will
+# default to enable.
+AC_DEFUN([AE_FEATURE_DEFAULT_ENABLE], [
+  m4_define([ae_feature_default_arg], [yes])
+  m4_define([ae_feature_default_switch], [disable])
+])
+
+
+# AE_FEATURE_DEFAULT_DISABLE: The next feature defined with AE_FEATURE will
+# default to disable.
+#
+AC_DEFUN([AE_FEATURE_DEFAULT_DISABLE], [
+  m4_define([ae_feature_default_arg], [no])
+  m4_define([ae_feature_default_switch], [enable])
+])
+
+
+# AE_FEATURE_ENABLE(FEATURE-NAME): Enable the FEATURE, this will override the
+# user's choice if it was made.
+#
+AC_DEFUN([AE_FEATURE_ENABLE],[ dnl
+  enable_[]patsubst([$1], -, _)[]=yes
+])
+
+
+# AE_FEATURE_DISABLE(FEATURE-NAME): Disable the FEATURE, this will override the
+# user's choice if it was made.
+#
+AC_DEFUN([AE_FEATURE_DISABLE],[ dnl
+  enable_[]patsubst([$1], -, _)[]=no
+])
+
+
+# AE_IF_FEATURE_ENABLED(FEATURE-NAME, ACTION-IF-ENABLED, ACTION-IF-NOT-ENABLED?):
+# Run shell code ACTION-IF-ENABLED if the FEATURE is enabled, otherwise run
+# shell code ACTION-IF-NOT-ENABLED.
+#
+AC_DEFUN([AE_IF_FEATURE_ENABLED],[ dnl
+m4_pushdef([FEATURE], patsubst([$1], -, _))dnl
+
+  AS_IF([test "$enable_[]FEATURE[]" = yes],[ dnl
+    $2
+  ],[: dnl
+    $3
+  ])
+])
+
+
+# AE_IF_FEATURE_NOT_ENABLED(FEATURE-NAME, ACTION-IF-NOT-ENABLED,
+#                           ACTION-IF-NOT-NOT-ENABLED?):
+# Run shell code ACTION-IF-NOT-ENABLED if the FEATURE is not explicitly
+# enabled, otherwise run shell code ACTION-IF-NOT-NOT-DISABLED.
+#
+# The distinction with AE_IF_FEATURE_DISABLED is that this will also
+# match a feature that is undefined.
+#
+# A feature is undefined when it's disabled by default and was not explicitly
+# enabled or disabled by the user or by AE_FEATURE_ENABLE/DISABLE.
+#
+AC_DEFUN([AE_IF_FEATURE_NOT_ENABLED],[ dnl
+m4_pushdef([FEATURE], patsubst([$1], -, _))dnl
+
+  AS_IF([test "$enable_[]FEATURE[]" != yes],[ dnl
+    $2
+  ],[: dnl
+    $3
+  ])
+])
+
+
+# AE_IF_FEATURE_DISABLED(FEATURE-NAME, ACTION-IF-DISABLED, ACTION-IF-NOT-DISABLED?):
+# Run shell code ACTION-IF-DISABLED if the FEATURE is disabled, otherwise run
+# shell code ACTION-IF-NOT-DISABLED.
+#
+AC_DEFUN([AE_IF_FEATURE_DISABLED],[ dnl
+m4_pushdef([FEATURE], patsubst([$1], -, _))dnl
+
+  AS_IF([test "$enable_[]FEATURE[]" = no],[ dnl
+    $2
+  ],[: dnl
+    $3
+  ])
+])
+
+
+# AE_IF_FEATURE_UNDEF(FEATURE-NAME, ACTION-IF-UNDEF, ACTION-IF-NOT-UNDEF?):
+# Run shell code ACTION-IF-UNDEF if the FEATURE is undefined, otherwise run
+# shell code ACTION-IF-NOT-UNDEF.
+#
+# A feature is undefined when it's disabled by default and was not explicitly
+# enabled or disabled by the user or by AE_FEATURE_ENABLE/DISABLE.
+#
+AC_DEFUN([AE_IF_FEATURE_UNDEF],[ dnl
+m4_pushdef([FEATURE], patsubst([$1], -, _))dnl
+
+  AS_IF([test "x$enable_[]FEATURE[]" = x],[ dnl
+    $2
+  ],[: dnl
+    $3
+  ])
+])
+
+
+# AE_IS_FEATURE_ENABLED(FEATURE-NAME): outputs a shell condition (suitable
+# for use in a shell if statement) that will return true if the FEATURE is
+# enabled.
+#
+AC_DEFUN([AE_IS_FEATURE_ENABLED],[dnl
+m4_pushdef([FEATURE], patsubst([$1], -, _))dnl
+ test "x$enable_[]FEATURE[]" = xyes dnl
+])
+
+
+dnl Disabled by default, unless already overridden
+m4_ifndef([ae_feature_default_arg],[AE_FEATURE_DEFAULT_DISABLE])
+
+
+# AE_FEATURE(FEATURE-NAME, FEATURE-DESCRIPTION,
+#            ACTION-IF-GIVEN?, ACTION-IF-NOT-GIVEN?,
+#            ACTION-IF-ENABLED?, ACTION-IF-NOT-ENABLED?):
+#
+#
+AC_DEFUN([AE_FEATURE],[ dnl
+m4_pushdef([FEATURE], patsubst([$1], -, _))dnl
+
+dnl If the option wasn't specified and the default is enabled, set enable_FEATURE to yes
+AS_IF([test "x$enable_[]FEATURE[]" = x && test "ae_feature_default_arg" = yes],[ dnl
+  enable_[]FEATURE[]="ae_feature_default_arg"
+])
+
+AC_ARG_ENABLE([$1],
+  AS_HELP_STRING([--ae_feature_default_switch-$1],dnl
+                 [$2]),[
+case "${enableval}" in
+   yes)
+     enable_[]FEATURE[]=yes
+     ;;
+   no)
+     enable_[]FEATURE[]=no
+     ;;
+   *)
+     AC_MSG_ERROR([bad value ${enableval} for feature --$1])
+     ;;
+esac
+
+$3
+],[: dnl
+$4
+])
+
+AS_IF([test "$enable_[]FEATURE[]" = yes],[: dnl
+  $5
+],[: dnl
+  $6
+])
+
+m4_popdef([FEATURE])dnl
+])
diff --git a/m4/ae_pprint.m4 b/m4/ae_pprint.m4
new file mode 100644 (file)
index 0000000..029ff99
--- /dev/null
@@ -0,0 +1,210 @@
+# SPDX-FileCopyrightText: 2016 Philippe Proulx <pproulx@efficios.com>
+#
+# SPDX-License-Identifier: GPL-2.0-or-later WITH Autoconf-exception-2.0
+
+#serial 2
+
+# AE_PPRINT_INIT(): initializes the pretty printing system.
+#
+# Use this macro before using any other AE_PPRINT_* macro.
+AC_DEFUN([AE_PPRINT_INIT], [
+  m4_define([AE_PPRINT_CONFIG_TS], [50])
+  m4_define([AE_PPRINT_CONFIG_INDENT], [2])
+  AE_PPRINT_YES_MSG=yes
+  AE_PPRINT_NO_MSG=no
+
+  # find tput, which tells us if colors are supported and gives us color codes
+  AC_PATH_PROG([ae_pprint_tput], [tput])
+
+  AS_IF([test -n "$ae_pprint_tput"], [
+    AS_IF([test -n "$PS1" && test `"$ae_pprint_tput" colors` -eq 256 && test -t 1], [
+      # interactive shell and colors supported and standard output
+      # file descriptor is opened on a terminal
+      AE_PPRINT_COLOR_TXTBLK="`"$ae_pprint_tput" setaf 0`"
+      AE_PPRINT_COLOR_TXTBLU="`"$ae_pprint_tput" setaf 4`"
+      AE_PPRINT_COLOR_TXTGRN="`"$ae_pprint_tput" setaf 2`"
+      AE_PPRINT_COLOR_TXTCYN="`"$ae_pprint_tput" setaf 6`"
+      AE_PPRINT_COLOR_TXTRED="`"$ae_pprint_tput" setaf 1`"
+      AE_PPRINT_COLOR_TXTPUR="`"$ae_pprint_tput" setaf 5`"
+      AE_PPRINT_COLOR_TXTYLW="`"$ae_pprint_tput" setaf 3`"
+      AE_PPRINT_COLOR_TXTWHT="`"$ae_pprint_tput" setaf 7`"
+      AE_PPRINT_COLOR_BLD=`"$ae_pprint_tput" bold`
+      AE_PPRINT_COLOR_BLDBLK="$AE_PPRINT_COLOR_BLD$AE_PPRINT_COLOR_TXTBLK"
+      AE_PPRINT_COLOR_BLDBLU="$AE_PPRINT_COLOR_BLD$AE_PPRINT_COLOR_TXTBLU"
+      AE_PPRINT_COLOR_BLDGRN="$AE_PPRINT_COLOR_BLD$AE_PPRINT_COLOR_TXTGRN"
+      AE_PPRINT_COLOR_BLDCYN="$AE_PPRINT_COLOR_BLD$AE_PPRINT_COLOR_TXTCYN"
+      AE_PPRINT_COLOR_BLDRED="$AE_PPRINT_COLOR_BLD$AE_PPRINT_COLOR_TXTRED"
+      AE_PPRINT_COLOR_BLDPUR="$AE_PPRINT_COLOR_BLD$AE_PPRINT_COLOR_TXTPUR"
+      AE_PPRINT_COLOR_BLDYLW="$AE_PPRINT_COLOR_BLD$AE_PPRINT_COLOR_TXTYLW"
+      AE_PPRINT_COLOR_BLDWHT="$AE_PPRINT_COLOR_BLD$AE_PPRINT_COLOR_TXTWHT"
+      AE_PPRINT_COLOR_RST="`"$ae_pprint_tput" sgr0`"
+
+      # colored yes and no
+      AE_PPRINT_YES_MSG="$AE_PPRINT_COLOR_BLDGRN$AE_PPRINT_YES_MSG$AE_PPRINT_COLOR_RST"
+      AE_PPRINT_NO_MSG="$AE_PPRINT_COLOR_BLDRED$AE_PPRINT_NO_MSG$AE_PPRINT_COLOR_RST"
+
+      # subtitle color
+      AE_PPRINT_COLOR_SUBTITLE="$AE_PPRINT_COLOR_BLDCYN"
+    ])
+  ])
+])
+
+# AE_PPRINT_SET_INDENT(indent): sets the current indentation.
+#
+# Use AE_PPRINT_INIT() before using this macro.
+AC_DEFUN([AE_PPRINT_SET_INDENT], [
+  m4_define([AE_PPRINT_CONFIG_INDENT], [$1])
+])
+
+# AE_PPRINT_SET_TS(ts): sets the current tab stop.
+#
+# Use AE_PPRINT_INIT() before using this macro.
+AC_DEFUN([AE_PPRINT_SET_TS], [
+  m4_define([AE_PPRINT_CONFIG_TS], [$1])
+])
+
+# AE_PPRINT_SUBTITLE(subtitle): pretty prints a subtitle.
+#
+# The subtitle is put as is in a double-quoted shell string so the user
+# needs to escape ".
+#
+# Use AE_PPRINT_INIT() before using this macro.
+AC_DEFUN([AE_PPRINT_SUBTITLE], [
+  AS_ECHO(["${AE_PPRINT_COLOR_SUBTITLE}$1$AE_PPRINT_COLOR_RST"])
+])
+
+AC_DEFUN([_AE_PPRINT_INDENT], [
+  m4_if(AE_PPRINT_CONFIG_INDENT, 0, [
+  ], [
+    m4_for([ae_pprint_i], [0], m4_eval(AE_PPRINT_CONFIG_INDENT * 2 - 1), [1], [
+      AS_ECHO_N([" "])
+    ])
+  ])
+])
+
+# AE_PPRINT_PROP_STRING(title, value, title_color?): pretty prints a
+# string property.
+#
+# The title is put as is in a double-quoted shell string so the user
+# needs to escape ".
+#
+# The $AE_PPRINT_CONFIG_INDENT variable must be set to the desired indentation
+# level.
+#
+# Use AE_PPRINT_INIT() before using this macro.
+AC_DEFUN([AE_PPRINT_PROP_STRING], [
+  m4_pushdef([ae_pprint_title], [$1])
+  m4_pushdef([ae_pprint_value], [$2])
+  m4_pushdef([ae_pprint_title_color], m4_default([$3], []))
+  m4_pushdef([ae_pprint_title_len], m4_len(ae_pprint_title))
+  m4_pushdef([ae_pprint_spaces_cnt], m4_eval(AE_PPRINT_CONFIG_TS - ae_pprint_title_len - (AE_PPRINT_CONFIG_INDENT * 2) - 1))
+
+  m4_if(m4_eval(ae_pprint_spaces_cnt <= 0), [1], [
+    m4_define([ae_pprint_spaces_cnt], [1])
+  ])
+
+  m4_pushdef([ae_pprint_spaces], [])
+
+  m4_for([ae_pprint_i], 0, m4_eval(ae_pprint_spaces_cnt - 1), [1], [
+    m4_append([ae_pprint_spaces], [ ])
+  ])
+
+  _AE_PPRINT_INDENT
+
+  AS_ECHO_N(["ae_pprint_title_color""ae_pprint_title$AE_PPRINT_COLOR_RST:ae_pprint_spaces"])
+  AS_ECHO(["${AE_PPRINT_COLOR_BLD}ae_pprint_value$AE_PPRINT_COLOR_RST"])
+
+  m4_popdef([ae_pprint_spaces])
+  m4_popdef([ae_pprint_spaces_cnt])
+  m4_popdef([ae_pprint_title_len])
+  m4_popdef([ae_pprint_title_color])
+  m4_popdef([ae_pprint_value])
+  m4_popdef([ae_pprint_title])
+])
+
+# AE_PPRINT_PROP_BOOL(title, value, title_color?): pretty prints a boolean
+# property.
+#
+# The title is put as is in a double-quoted shell string so the user
+# needs to escape ".
+#
+# The value is evaluated at shell runtime. Its evaluation must be
+# 0 (false) or 1 (true).
+#
+# Uses the AE_PPRINT_PROP_STRING() with the "yes" or "no" string.
+#
+# Use AE_PPRINT_INIT() before using this macro.
+AC_DEFUN([AE_PPRINT_PROP_BOOL], [
+  m4_pushdef([ae_pprint_title], [$1])
+  m4_pushdef([ae_pprint_value], [$2])
+
+  test ae_pprint_value -eq 0 && ae_pprint_msg="$AE_PPRINT_NO_MSG" || ae_pprint_msg="$AE_PPRINT_YES_MSG"
+
+  m4_if([$#], [3], [
+    AE_PPRINT_PROP_STRING(ae_pprint_title, [$ae_pprint_msg], $3)
+  ], [
+    AE_PPRINT_PROP_STRING(ae_pprint_title, [$ae_pprint_msg])
+  ])
+
+  m4_popdef([ae_pprint_value])
+  m4_popdef([ae_pprint_title])
+])
+
+# AE_PPRINT_PROP_BOOL_CUSTOM(title, value, no_msg, title_color?): pretty prints a boolean
+# property.
+#
+# The title is put as is in a double-quoted shell string so the user
+# needs to escape ".
+#
+# The value is evaluated at shell runtime. Its evaluation must be
+# 0 (false) or 1 (true).
+#
+# Uses the AE_PPRINT_PROP_STRING() with the "yes" or "no" string.
+#
+# Use AE_PPRINT_INIT() before using this macro.
+AC_DEFUN([AE_PPRINT_PROP_BOOL_CUSTOM], [
+  m4_pushdef([ae_pprint_title], [$1])
+  m4_pushdef([ae_pprint_value], [$2])
+  m4_pushdef([ae_pprint_value_no_msg], [$3])
+
+  test ae_pprint_value -eq 0 && ae_pprint_msg="$AE_PPRINT_NO_MSG (ae_pprint_value_no_msg)" || ae_pprint_msg="$AE_PPRINT_YES_MSG"
+
+  m4_if([$#], [4], [
+    AE_PPRINT_PROP_STRING(ae_pprint_title, [$ae_pprint_msg], $4)
+  ], [
+    AE_PPRINT_PROP_STRING(ae_pprint_title, [$ae_pprint_msg])
+  ])
+
+  m4_popdef([ae_pprint_value_no_msg])
+  m4_popdef([ae_pprint_value])
+  m4_popdef([ae_pprint_title])
+])
+
+# AE_PPRINT_WARN(msg): pretty prints a warning message.
+#
+# The message is put as is in a double-quoted shell string so the user
+# needs to escape ".
+#
+# Use AE_PPRINT_INIT() before using this macro.
+AC_DEFUN([AE_PPRINT_WARN], [
+  m4_pushdef([ae_pprint_msg], [$1])
+
+  _AE_PPRINT_INDENT
+  AS_ECHO(["${AE_PPRINT_COLOR_TXTYLW}WARNING:$AE_PPRINT_COLOR_RST ${AE_PPRINT_COLOR_BLDYLW}ae_pprint_msg$AE_PPRINT_COLOR_RST"])
+
+  m4_popdef([ae_pprint_msg])
+])
+
+# AE_PPRINT_ERROR(msg): pretty prints an error message and exits.
+#
+# The message is put as is in a double-quoted shell string so the user
+# needs to escape ".
+#
+# Use AE_PPRINT_INIT() before using this macro.
+AC_DEFUN([AE_PPRINT_ERROR], [
+  m4_pushdef([ae_pprint_msg], [$1])
+
+  AC_MSG_ERROR([${AE_PPRINT_COLOR_BLDRED}ae_pprint_msg$AE_PPRINT_COLOR_RST])
+
+  m4_popdef([ae_pprint_msg])
+])
diff --git a/m4/ax_append_compile_flags.m4 b/m4/ax_append_compile_flags.m4
new file mode 100644 (file)
index 0000000..29d86e0
--- /dev/null
@@ -0,0 +1,47 @@
+# SPDX-License-Identifier: FSFAP
+# ============================================================================
+#  https://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html
+# ============================================================================
+#
+# SYNOPSIS
+#
+#   AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS], [INPUT])
+#
+# DESCRIPTION
+#
+#   For every FLAG1, FLAG2 it is checked whether the compiler works with the
+#   flag.  If it does, the flag is added FLAGS-VARIABLE
+#
+#   If FLAGS-VARIABLE is not specified, the current language's flags (e.g.
+#   CFLAGS) is used.  During the check the flag is always added to the
+#   current language's flags.
+#
+#   If EXTRA-FLAGS is defined, it is added to the current language's default
+#   flags (e.g. CFLAGS) when the check is done.  The check is thus made with
+#   the flags: "CFLAGS EXTRA-FLAGS FLAG".  This can for example be used to
+#   force the compiler to issue an error when a bad flag is given.
+#
+#   INPUT gives an alternative input source to AC_COMPILE_IFELSE.
+#
+#   NOTE: This macro depends on the AX_APPEND_FLAG and
+#   AX_CHECK_COMPILE_FLAG. Please keep this macro in sync with
+#   AX_APPEND_LINK_FLAGS.
+#
+# LICENSE
+#
+#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved.  This file is offered as-is, without any
+#   warranty.
+
+#serial 7
+
+AC_DEFUN([AX_APPEND_COMPILE_FLAGS],
+[AX_REQUIRE_DEFINED([AX_CHECK_COMPILE_FLAG])
+AX_REQUIRE_DEFINED([AX_APPEND_FLAG])
+for flag in $1; do
+  AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3], [$4])
+done
+])dnl AX_APPEND_COMPILE_FLAGS
diff --git a/m4/ax_append_flag.m4 b/m4/ax_append_flag.m4
new file mode 100644 (file)
index 0000000..e1ea0fc
--- /dev/null
@@ -0,0 +1,51 @@
+# SPDX-License-Identifier: FSFAP
+# ===========================================================================
+#      https://www.gnu.org/software/autoconf-archive/ax_append_flag.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE])
+#
+# DESCRIPTION
+#
+#   FLAG is appended to the FLAGS-VARIABLE shell variable, with a space
+#   added in between.
+#
+#   If FLAGS-VARIABLE is not specified, the current language's flags (e.g.
+#   CFLAGS) is used.  FLAGS-VARIABLE is not changed if it already contains
+#   FLAG.  If FLAGS-VARIABLE is unset in the shell, it is set to exactly
+#   FLAG.
+#
+#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved.  This file is offered as-is, without any
+#   warranty.
+
+#serial 8
+
+AC_DEFUN([AX_APPEND_FLAG],
+[dnl
+AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF
+AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])
+AS_VAR_SET_IF(FLAGS,[
+  AS_CASE([" AS_VAR_GET(FLAGS) "],
+    [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])],
+    [
+     AS_VAR_APPEND(FLAGS,[" $1"])
+     AC_RUN_LOG([: FLAGS="$FLAGS"])
+    ])
+  ],
+  [
+  AS_VAR_SET(FLAGS,[$1])
+  AC_RUN_LOG([: FLAGS="$FLAGS"])
+  ])
+AS_VAR_POPDEF([FLAGS])dnl
+])dnl AX_APPEND_FLAG
index 6a1ede15e6315876712dc0007100ea298028b593..98999e11f63d90d671631316db9e47bde4bb7738 100644 (file)
@@ -1,3 +1,4 @@
+# SPDX-License-Identifier: GPL-2.0-or-later WITH LicenseRef-Autoconf-exception-macro
 # ===========================================================================
 #    https://www.gnu.org/software/autoconf-archive/ax_c___attribute__.html
 # ===========================================================================
 # ===========================================================================
 #    https://www.gnu.org/software/autoconf-archive/ax_c___attribute__.html
 # ===========================================================================
diff --git a/m4/ax_check_compile_flag.m4 b/m4/ax_check_compile_flag.m4
new file mode 100644 (file)
index 0000000..8f62565
--- /dev/null
@@ -0,0 +1,54 @@
+# SPDX-License-Identifier: FSFAP
+# ===========================================================================
+#  https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
+#
+# DESCRIPTION
+#
+#   Check whether the given FLAG works with the current language's compiler
+#   or gives an error.  (Warnings, however, are ignored)
+#
+#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
+#   success/failure.
+#
+#   If EXTRA-FLAGS is defined, it is added to the current language's default
+#   flags (e.g. CFLAGS) when the check is done.  The check is thus made with
+#   the flags: "CFLAGS EXTRA-FLAGS FLAG".  This can for example be used to
+#   force the compiler to issue an error when a bad flag is given.
+#
+#   INPUT gives an alternative input source to AC_COMPILE_IFELSE.
+#
+#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
+#   macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved.  This file is offered as-is, without any
+#   warranty.
+
+#serial 6
+
+AC_DEFUN([AX_CHECK_COMPILE_FLAG],
+[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
+AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
+AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
+  ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
+  _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
+  AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
+    [AS_VAR_SET(CACHEVAR,[yes])],
+    [AS_VAR_SET(CACHEVAR,[no])])
+  _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
+AS_VAR_IF(CACHEVAR,yes,
+  [m4_default([$2], :)],
+  [m4_default([$3], :)])
+AS_VAR_POPDEF([CACHEVAR])dnl
+])dnl AX_CHECK_COMPILE_FLAGS
diff --git a/m4/ax_cxx_compile_stdcxx.m4 b/m4/ax_cxx_compile_stdcxx.m4
new file mode 100644 (file)
index 0000000..c081ffa
--- /dev/null
@@ -0,0 +1,1019 @@
+# SPDX-License-Identifier: FSFAP
+# ===========================================================================
+#  https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
+#
+# DESCRIPTION
+#
+#   Check for baseline language coverage in the compiler for the specified
+#   version of the C++ standard.  If necessary, add switches to CXX and
+#   CXXCPP to enable support.  VERSION may be '11', '14', '17', or '20' for
+#   the respective C++ standard version.
+#
+#   The second argument, if specified, indicates whether you insist on an
+#   extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
+#   -std=c++11).  If neither is specified, you get whatever works, with
+#   preference for no added switch, and then for an extended mode.
+#
+#   The third argument, if specified 'mandatory' or if left unspecified,
+#   indicates that baseline support for the specified C++ standard is
+#   required and that the macro should error out if no mode with that
+#   support is found.  If specified 'optional', then configuration proceeds
+#   regardless, after defining HAVE_CXX${VERSION} if and only if a
+#   supporting mode is found.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
+#   Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
+#   Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
+#   Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
+#   Copyright (c) 2015 Paul Norman <penorman@mac.com>
+#   Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
+#   Copyright (c) 2016, 2018 Krzesimir Nowak <qdlacz@gmail.com>
+#   Copyright (c) 2019 Enji Cooper <yaneurabeya@gmail.com>
+#   Copyright (c) 2020 Jason Merrill <jason@redhat.com>
+#   Copyright (c) 2021 Jörn Heusipp <osmanx@problemloesungsmaschine.de>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved.  This file is offered as-is, without any
+#   warranty.
+
+#serial 18
+
+dnl  This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
+dnl  (serial version number 13).
+
+AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
+  m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"],
+        [$1], [14], [ax_cxx_compile_alternatives="14 1y"],
+        [$1], [17], [ax_cxx_compile_alternatives="17 1z"],
+        [$1], [20], [ax_cxx_compile_alternatives="20"],
+        [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
+  m4_if([$2], [], [],
+        [$2], [ext], [],
+        [$2], [noext], [],
+        [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
+  m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
+        [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
+        [$3], [optional], [ax_cxx_compile_cxx$1_required=false],
+        [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
+  AC_LANG_PUSH([C++])dnl
+  ac_success=no
+
+  m4_if([$2], [], [dnl
+    AC_CACHE_CHECK(whether $CXX supports C++$1 features by default,
+                  ax_cv_cxx_compile_cxx$1,
+      [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
+        [ax_cv_cxx_compile_cxx$1=yes],
+        [ax_cv_cxx_compile_cxx$1=no])])
+    if test x$ax_cv_cxx_compile_cxx$1 = xyes; then
+      ac_success=yes
+    fi])
+
+  m4_if([$2], [noext], [], [dnl
+  if test x$ac_success = xno; then
+    for alternative in ${ax_cxx_compile_alternatives}; do
+      switch="-std=gnu++${alternative}"
+      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
+      AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
+                     $cachevar,
+        [ac_save_CXX="$CXX"
+         CXX="$CXX $switch"
+         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
+          [eval $cachevar=yes],
+          [eval $cachevar=no])
+         CXX="$ac_save_CXX"])
+      if eval test x\$$cachevar = xyes; then
+        CXX="$CXX $switch"
+        if test -n "$CXXCPP" ; then
+          CXXCPP="$CXXCPP $switch"
+        fi
+        ac_success=yes
+        break
+      fi
+    done
+  fi])
+
+  m4_if([$2], [ext], [], [dnl
+  if test x$ac_success = xno; then
+    dnl HP's aCC needs +std=c++11 according to:
+    dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
+    dnl Cray's crayCC needs "-h std=c++11"
+    dnl MSVC needs -std:c++NN for C++17 and later (default is C++14)
+    for alternative in ${ax_cxx_compile_alternatives}; do
+      for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}" MSVC; do
+        if test x"$switch" = xMSVC; then
+          dnl AS_TR_SH maps both `:` and `=` to `_` so -std:c++17 would collide
+          dnl with -std=c++17.  We suffix the cache variable name with _MSVC to
+          dnl avoid this.
+          switch=-std:c++${alternative}
+          cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_${switch}_MSVC])
+        else
+          cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
+        fi
+        AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
+                       $cachevar,
+          [ac_save_CXX="$CXX"
+           CXX="$CXX $switch"
+           AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
+            [eval $cachevar=yes],
+            [eval $cachevar=no])
+           CXX="$ac_save_CXX"])
+        if eval test x\$$cachevar = xyes; then
+          CXX="$CXX $switch"
+          if test -n "$CXXCPP" ; then
+            CXXCPP="$CXXCPP $switch"
+          fi
+          ac_success=yes
+          break
+        fi
+      done
+      if test x$ac_success = xyes; then
+        break
+      fi
+    done
+  fi])
+  AC_LANG_POP([C++])
+  if test x$ax_cxx_compile_cxx$1_required = xtrue; then
+    if test x$ac_success = xno; then
+      AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
+    fi
+  fi
+  if test x$ac_success = xno; then
+    HAVE_CXX$1=0
+    AC_MSG_NOTICE([No compiler with C++$1 support was found])
+  else
+    HAVE_CXX$1=1
+    AC_DEFINE(HAVE_CXX$1,1,
+              [define if the compiler supports basic C++$1 syntax])
+  fi
+  AC_SUBST(HAVE_CXX$1)
+])
+
+
+dnl  Test body for checking C++11 support
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
+  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
+)
+
+dnl  Test body for checking C++14 support
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
+  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
+  _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
+)
+
+dnl  Test body for checking C++17 support
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17],
+  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
+  _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
+  _AX_CXX_COMPILE_STDCXX_testbody_new_in_17
+)
+
+dnl  Test body for checking C++20 support
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_20],
+  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
+  _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
+  _AX_CXX_COMPILE_STDCXX_testbody_new_in_17
+  _AX_CXX_COMPILE_STDCXX_testbody_new_in_20
+)
+
+
+dnl  Tests for new features in C++11
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
+
+// If the compiler admits that it is not ready for C++11, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+// MSVC always sets __cplusplus to 199711L in older versions; newer versions
+// only set it correctly if /Zc:__cplusplus is specified as well as a
+// /std:c++NN switch:
+// https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
+#elif __cplusplus < 201103L && !defined _MSC_VER
+
+#error "This is not a C++11 compiler"
+
+#else
+
+namespace cxx11
+{
+
+  namespace test_static_assert
+  {
+
+    template <typename T>
+    struct check
+    {
+      static_assert(sizeof(int) <= sizeof(T), "not big enough");
+    };
+
+  }
+
+  namespace test_final_override
+  {
+
+    struct Base
+    {
+      virtual ~Base() {}
+      virtual void f() {}
+    };
+
+    struct Derived : public Base
+    {
+      virtual ~Derived() override {}
+      virtual void f() override {}
+    };
+
+  }
+
+  namespace test_double_right_angle_brackets
+  {
+
+    template < typename T >
+    struct check {};
+
+    typedef check<void> single_type;
+    typedef check<check<void>> double_type;
+    typedef check<check<check<void>>> triple_type;
+    typedef check<check<check<check<void>>>> quadruple_type;
+
+  }
+
+  namespace test_decltype
+  {
+
+    int
+    f()
+    {
+      int a = 1;
+      decltype(a) b = 2;
+      return a + b;
+    }
+
+  }
+
+  namespace test_type_deduction
+  {
+
+    template < typename T1, typename T2 >
+    struct is_same
+    {
+      static const bool value = false;
+    };
+
+    template < typename T >
+    struct is_same<T, T>
+    {
+      static const bool value = true;
+    };
+
+    template < typename T1, typename T2 >
+    auto
+    add(T1 a1, T2 a2) -> decltype(a1 + a2)
+    {
+      return a1 + a2;
+    }
+
+    int
+    test(const int c, volatile int v)
+    {
+      static_assert(is_same<int, decltype(0)>::value == true, "");
+      static_assert(is_same<int, decltype(c)>::value == false, "");
+      static_assert(is_same<int, decltype(v)>::value == false, "");
+      auto ac = c;
+      auto av = v;
+      auto sumi = ac + av + 'x';
+      auto sumf = ac + av + 1.0;
+      static_assert(is_same<int, decltype(ac)>::value == true, "");
+      static_assert(is_same<int, decltype(av)>::value == true, "");
+      static_assert(is_same<int, decltype(sumi)>::value == true, "");
+      static_assert(is_same<int, decltype(sumf)>::value == false, "");
+      static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
+      return (sumf > 0.0) ? sumi : add(c, v);
+    }
+
+  }
+
+  namespace test_noexcept
+  {
+
+    int f() { return 0; }
+    int g() noexcept { return 0; }
+
+    static_assert(noexcept(f()) == false, "");
+    static_assert(noexcept(g()) == true, "");
+
+  }
+
+  namespace test_constexpr
+  {
+
+    template < typename CharT >
+    unsigned long constexpr
+    strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
+    {
+      return *s ? strlen_c_r(s + 1, acc + 1) : acc;
+    }
+
+    template < typename CharT >
+    unsigned long constexpr
+    strlen_c(const CharT *const s) noexcept
+    {
+      return strlen_c_r(s, 0UL);
+    }
+
+    static_assert(strlen_c("") == 0UL, "");
+    static_assert(strlen_c("1") == 1UL, "");
+    static_assert(strlen_c("example") == 7UL, "");
+    static_assert(strlen_c("another\0example") == 7UL, "");
+
+  }
+
+  namespace test_rvalue_references
+  {
+
+    template < int N >
+    struct answer
+    {
+      static constexpr int value = N;
+    };
+
+    answer<1> f(int&)       { return answer<1>(); }
+    answer<2> f(const int&) { return answer<2>(); }
+    answer<3> f(int&&)      { return answer<3>(); }
+
+    void
+    test()
+    {
+      int i = 0;
+      const int c = 0;
+      static_assert(decltype(f(i))::value == 1, "");
+      static_assert(decltype(f(c))::value == 2, "");
+      static_assert(decltype(f(0))::value == 3, "");
+    }
+
+  }
+
+  namespace test_uniform_initialization
+  {
+
+    struct test
+    {
+      static const int zero {};
+      static const int one {1};
+    };
+
+    static_assert(test::zero == 0, "");
+    static_assert(test::one == 1, "");
+
+  }
+
+  namespace test_lambdas
+  {
+
+    void
+    test1()
+    {
+      auto lambda1 = [](){};
+      auto lambda2 = lambda1;
+      lambda1();
+      lambda2();
+    }
+
+    int
+    test2()
+    {
+      auto a = [](int i, int j){ return i + j; }(1, 2);
+      auto b = []() -> int { return '0'; }();
+      auto c = [=](){ return a + b; }();
+      auto d = [&](){ return c; }();
+      auto e = [a, &b](int x) mutable {
+        const auto identity = [](int y){ return y; };
+        for (auto i = 0; i < a; ++i)
+          a += b--;
+        return x + identity(a + b);
+      }(0);
+      return a + b + c + d + e;
+    }
+
+    int
+    test3()
+    {
+      const auto nullary = [](){ return 0; };
+      const auto unary = [](int x){ return x; };
+      using nullary_t = decltype(nullary);
+      using unary_t = decltype(unary);
+      const auto higher1st = [](nullary_t f){ return f(); };
+      const auto higher2nd = [unary](nullary_t f1){
+        return [unary, f1](unary_t f2){ return f2(unary(f1())); };
+      };
+      return higher1st(nullary) + higher2nd(nullary)(unary);
+    }
+
+  }
+
+  namespace test_variadic_templates
+  {
+
+    template <int...>
+    struct sum;
+
+    template <int N0, int... N1toN>
+    struct sum<N0, N1toN...>
+    {
+      static constexpr auto value = N0 + sum<N1toN...>::value;
+    };
+
+    template <>
+    struct sum<>
+    {
+      static constexpr auto value = 0;
+    };
+
+    static_assert(sum<>::value == 0, "");
+    static_assert(sum<1>::value == 1, "");
+    static_assert(sum<23>::value == 23, "");
+    static_assert(sum<1, 2>::value == 3, "");
+    static_assert(sum<5, 5, 11>::value == 21, "");
+    static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
+
+  }
+
+  // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
+  // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
+  // because of this.
+  namespace test_template_alias_sfinae
+  {
+
+    struct foo {};
+
+    template<typename T>
+    using member = typename T::member_type;
+
+    template<typename T>
+    void func(...) {}
+
+    template<typename T>
+    void func(member<T>*) {}
+
+    void test();
+
+    void test() { func<foo>(0); }
+
+  }
+
+}  // namespace cxx11
+
+#endif  // __cplusplus >= 201103L
+
+]])
+
+
+dnl  Tests for new features in C++14
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
+
+// If the compiler admits that it is not ready for C++14, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201402L && !defined _MSC_VER
+
+#error "This is not a C++14 compiler"
+
+#else
+
+namespace cxx14
+{
+
+  namespace test_polymorphic_lambdas
+  {
+
+    int
+    test()
+    {
+      const auto lambda = [](auto&&... args){
+        const auto istiny = [](auto x){
+          return (sizeof(x) == 1UL) ? 1 : 0;
+        };
+        const int aretiny[] = { istiny(args)... };
+        return aretiny[0];
+      };
+      return lambda(1, 1L, 1.0f, '1');
+    }
+
+  }
+
+  namespace test_binary_literals
+  {
+
+    constexpr auto ivii = 0b0000000000101010;
+    static_assert(ivii == 42, "wrong value");
+
+  }
+
+  namespace test_generalized_constexpr
+  {
+
+    template < typename CharT >
+    constexpr unsigned long
+    strlen_c(const CharT *const s) noexcept
+    {
+      auto length = 0UL;
+      for (auto p = s; *p; ++p)
+        ++length;
+      return length;
+    }
+
+    static_assert(strlen_c("") == 0UL, "");
+    static_assert(strlen_c("x") == 1UL, "");
+    static_assert(strlen_c("test") == 4UL, "");
+    static_assert(strlen_c("another\0test") == 7UL, "");
+
+  }
+
+  namespace test_lambda_init_capture
+  {
+
+    int
+    test()
+    {
+      auto x = 0;
+      const auto lambda1 = [a = x](int b){ return a + b; };
+      const auto lambda2 = [a = lambda1(x)](){ return a; };
+      return lambda2();
+    }
+
+  }
+
+  namespace test_digit_separators
+  {
+
+    constexpr auto ten_million = 100'000'000;
+    static_assert(ten_million == 100000000, "");
+
+  }
+
+  namespace test_return_type_deduction
+  {
+
+    auto f(int& x) { return x; }
+    decltype(auto) g(int& x) { return x; }
+
+    template < typename T1, typename T2 >
+    struct is_same
+    {
+      static constexpr auto value = false;
+    };
+
+    template < typename T >
+    struct is_same<T, T>
+    {
+      static constexpr auto value = true;
+    };
+
+    int
+    test()
+    {
+      auto x = 0;
+      static_assert(is_same<int, decltype(f(x))>::value, "");
+      static_assert(is_same<int&, decltype(g(x))>::value, "");
+      return x;
+    }
+
+  }
+
+}  // namespace cxx14
+
+#endif  // __cplusplus >= 201402L
+
+]])
+
+
+dnl  Tests for new features in C++17
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[
+
+// If the compiler admits that it is not ready for C++17, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201703L && !defined _MSC_VER
+
+#error "This is not a C++17 compiler"
+
+#else
+
+#include <initializer_list>
+#include <utility>
+#include <type_traits>
+
+namespace cxx17
+{
+
+  namespace test_constexpr_lambdas
+  {
+
+    constexpr int foo = [](){return 42;}();
+
+  }
+
+  namespace test::nested_namespace::definitions
+  {
+
+  }
+
+  namespace test_fold_expression
+  {
+
+    template<typename... Args>
+    int multiply(Args... args)
+    {
+      return (args * ... * 1);
+    }
+
+    template<typename... Args>
+    bool all(Args... args)
+    {
+      return (args && ...);
+    }
+
+  }
+
+  namespace test_extended_static_assert
+  {
+
+    static_assert (true);
+
+  }
+
+  namespace test_auto_brace_init_list
+  {
+
+    auto foo = {5};
+    auto bar {5};
+
+    static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value);
+    static_assert(std::is_same<int, decltype(bar)>::value);
+  }
+
+  namespace test_typename_in_template_template_parameter
+  {
+
+    template<template<typename> typename X> struct D;
+
+  }
+
+  namespace test_fallthrough_nodiscard_maybe_unused_attributes
+  {
+
+    int f1()
+    {
+      return 42;
+    }
+
+    [[nodiscard]] int f2()
+    {
+      [[maybe_unused]] auto unused = f1();
+
+      switch (f1())
+      {
+      case 17:
+        f1();
+        [[fallthrough]];
+      case 42:
+        f1();
+      }
+      return f1();
+    }
+
+  }
+
+  namespace test_extended_aggregate_initialization
+  {
+
+    struct base1
+    {
+      int b1, b2 = 42;
+    };
+
+    struct base2
+    {
+      base2() {
+        b3 = 42;
+      }
+      int b3;
+    };
+
+    struct derived : base1, base2
+    {
+        int d;
+    };
+
+    derived d1 {{1, 2}, {}, 4};  // full initialization
+    derived d2 {{}, {}, 4};      // value-initialized bases
+
+  }
+
+  namespace test_general_range_based_for_loop
+  {
+
+    struct iter
+    {
+      int i;
+
+      int& operator* ()
+      {
+        return i;
+      }
+
+      const int& operator* () const
+      {
+        return i;
+      }
+
+      iter& operator++()
+      {
+        ++i;
+        return *this;
+      }
+    };
+
+    struct sentinel
+    {
+      int i;
+    };
+
+    bool operator== (const iter& i, const sentinel& s)
+    {
+      return i.i == s.i;
+    }
+
+    bool operator!= (const iter& i, const sentinel& s)
+    {
+      return !(i == s);
+    }
+
+    struct range
+    {
+      iter begin() const
+      {
+        return {0};
+      }
+
+      sentinel end() const
+      {
+        return {5};
+      }
+    };
+
+    void f()
+    {
+      range r {};
+
+      for (auto i : r)
+      {
+        [[maybe_unused]] auto v = i;
+      }
+    }
+
+  }
+
+  namespace test_lambda_capture_asterisk_this_by_value
+  {
+
+    struct t
+    {
+      int i;
+      int foo()
+      {
+        return [*this]()
+        {
+          return i;
+        }();
+      }
+    };
+
+  }
+
+  namespace test_enum_class_construction
+  {
+
+    enum class byte : unsigned char
+    {};
+
+    byte foo {42};
+
+  }
+
+  namespace test_constexpr_if
+  {
+
+    template <bool cond>
+    int f ()
+    {
+      if constexpr(cond)
+      {
+        return 13;
+      }
+      else
+      {
+        return 42;
+      }
+    }
+
+  }
+
+  namespace test_selection_statement_with_initializer
+  {
+
+    int f()
+    {
+      return 13;
+    }
+
+    int f2()
+    {
+      if (auto i = f(); i > 0)
+      {
+        return 3;
+      }
+
+      switch (auto i = f(); i + 4)
+      {
+      case 17:
+        return 2;
+
+      default:
+        return 1;
+      }
+    }
+
+  }
+
+  namespace test_template_argument_deduction_for_class_templates
+  {
+
+    template <typename T1, typename T2>
+    struct pair
+    {
+      pair (T1 p1, T2 p2)
+        : m1 {p1},
+          m2 {p2}
+      {}
+
+      T1 m1;
+      T2 m2;
+    };
+
+    void f()
+    {
+      [[maybe_unused]] auto p = pair{13, 42u};
+    }
+
+  }
+
+  namespace test_non_type_auto_template_parameters
+  {
+
+    template <auto n>
+    struct B
+    {};
+
+    B<5> b1;
+    B<'a'> b2;
+
+  }
+
+  namespace test_structured_bindings
+  {
+
+    int arr[2] = { 1, 2 };
+    std::pair<int, int> pr = { 1, 2 };
+
+    auto f1() -> int(&)[2]
+    {
+      return arr;
+    }
+
+    auto f2() -> std::pair<int, int>&
+    {
+      return pr;
+    }
+
+    struct S
+    {
+      int x1 : 2;
+      volatile double y1;
+    };
+
+    S f3()
+    {
+      return {};
+    }
+
+    auto [ x1, y1 ] = f1();
+    auto& [ xr1, yr1 ] = f1();
+    auto [ x2, y2 ] = f2();
+    auto& [ xr2, yr2 ] = f2();
+    const auto [ x3, y3 ] = f3();
+
+  }
+
+  namespace test_exception_spec_type_system
+  {
+
+    struct Good {};
+    struct Bad {};
+
+    void g1() noexcept;
+    void g2();
+
+    template<typename T>
+    Bad
+    f(T*, T*);
+
+    template<typename T1, typename T2>
+    Good
+    f(T1*, T2*);
+
+    static_assert (std::is_same_v<Good, decltype(f(g1, g2))>);
+
+  }
+
+  namespace test_inline_variables
+  {
+
+    template<class T> void f(T)
+    {}
+
+    template<class T> inline T g(T)
+    {
+      return T{};
+    }
+
+    template<> inline void f<>(int)
+    {}
+
+    template<> int g<>(int)
+    {
+      return 5;
+    }
+
+  }
+
+}  // namespace cxx17
+
+#endif  // __cplusplus < 201703L && !defined _MSC_VER
+
+]])
+
+
+dnl  Tests for new features in C++20
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_20], [[
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 202002L && !defined _MSC_VER
+
+#error "This is not a C++20 compiler"
+
+#else
+
+#include <version>
+
+namespace cxx20
+{
+
+// As C++20 supports feature test macros in the standard, there is no
+// immediate need to actually test for feature availability on the
+// Autoconf side.
+
+}  // namespace cxx20
+
+#endif  // __cplusplus < 202002L && !defined _MSC_VER
+
+]])
index 4920e073bf5a21e2a728576e138fa2f8181b05f2..db15ab983a1c3f32dd94a5d393ef001f8761d031 100644 (file)
@@ -1,3 +1,4 @@
+# SPDX-License-Identifier: GPL-2.0-or-later WITH LicenseRef-Autoconf-exception-macro
 # ===========================================================================
 #        https://www.gnu.org/software/autoconf-archive/ax_pthread.html
 # ===========================================================================
 # ===========================================================================
 #        https://www.gnu.org/software/autoconf-archive/ax_pthread.html
 # ===========================================================================
 #   flags that are needed. (The user can also force certain compiler
 #   flags/libs to be tested by setting these environment variables.)
 #
 #   flags that are needed. (The user can also force certain compiler
 #   flags/libs to be tested by setting these environment variables.)
 #
-#   Also sets PTHREAD_CC to any special C compiler that is needed for
-#   multi-threaded programs (defaults to the value of CC otherwise). (This
-#   is necessary on AIX to use the special cc_r compiler alias.)
+#   Also sets PTHREAD_CC and PTHREAD_CXX to any special C compiler that is
+#   needed for multi-threaded programs (defaults to the value of CC
+#   respectively CXX otherwise). (This is necessary on e.g. AIX to use the
+#   special cc_r/CC_r compiler alias.)
 #
 #   NOTE: You are assumed to not only compile your program with these flags,
 #   but also to link with them as well. For example, you might link with
 #   $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
 #
 #   NOTE: You are assumed to not only compile your program with these flags,
 #   but also to link with them as well. For example, you might link with
 #   $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
+#   $PTHREAD_CXX $CXXFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
 #
 #   If you are only building threaded programs, you may wish to use these
 #   variables in your default LIBS, CFLAGS, and CC:
 #
 #     LIBS="$PTHREAD_LIBS $LIBS"
 #     CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
 #
 #   If you are only building threaded programs, you may wish to use these
 #   variables in your default LIBS, CFLAGS, and CC:
 #
 #     LIBS="$PTHREAD_LIBS $LIBS"
 #     CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+#     CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS"
 #     CC="$PTHREAD_CC"
 #     CC="$PTHREAD_CC"
+#     CXX="$PTHREAD_CXX"
 #
 #   In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
 #   has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
 #
 #   In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
 #   has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
@@ -55,6 +60,7 @@
 #
 #   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
 #   Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
 #
 #   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
 #   Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
+#   Copyright (c) 2019 Marc Stevens <marc.stevens@cwi.nl>
 #
 #   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
 #
 #   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
@@ -82,7 +88,7 @@
 #   modified version of the Autoconf Macro, you may extend this special
 #   exception to the GPL to apply to your modified version as well.
 
 #   modified version of the Autoconf Macro, you may extend this special
 #   exception to the GPL to apply to your modified version as well.
 
-#serial 25
+#serial 31
 
 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
 AC_DEFUN([AX_PTHREAD], [
 
 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
 AC_DEFUN([AX_PTHREAD], [
@@ -104,6 +110,7 @@ if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
         ax_pthread_save_CFLAGS="$CFLAGS"
         ax_pthread_save_LIBS="$LIBS"
         AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"])
         ax_pthread_save_CFLAGS="$CFLAGS"
         ax_pthread_save_LIBS="$LIBS"
         AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"])
+        AS_IF([test "x$PTHREAD_CXX" != "x"], [CXX="$PTHREAD_CXX"])
         CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
         LIBS="$PTHREAD_LIBS $LIBS"
         AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS])
         CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
         LIBS="$PTHREAD_LIBS $LIBS"
         AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS])
@@ -123,10 +130,12 @@ fi
 # (e.g. DEC) have both -lpthread and -lpthreads, where one of the
 # libraries is broken (non-POSIX).
 
 # (e.g. DEC) have both -lpthread and -lpthreads, where one of the
 # libraries is broken (non-POSIX).
 
-# Create a list of thread flags to try.  Items starting with a "-" are
-# C compiler flags, and other items are library names, except for "none"
-# which indicates that we try without any flags at all, and "pthread-config"
-# which is a program returning the flags for the Pth emulation library.
+# Create a list of thread flags to try. Items with a "," contain both
+# C compiler flags (before ",") and linker flags (after ","). Other items
+# starting with a "-" are C compiler flags, and remaining items are
+# library names, except for "none" which indicates that we try without
+# any flags at all, and "pthread-config" which is a program returning
+# the flags for the Pth emulation library.
 
 ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
 
 
 ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
 
@@ -194,14 +203,47 @@ case $host_os in
         # that too in a future libc.)  So we'll check first for the
         # standard Solaris way of linking pthreads (-mt -lpthread).
 
         # that too in a future libc.)  So we'll check first for the
         # standard Solaris way of linking pthreads (-mt -lpthread).
 
-        ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags"
+        ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags"
         ;;
 esac
 
         ;;
 esac
 
+# Are we compiling with Clang?
+
+AC_CACHE_CHECK([whether $CC is Clang],
+    [ax_cv_PTHREAD_CLANG],
+    [ax_cv_PTHREAD_CLANG=no
+     # Note that Autoconf sets GCC=yes for Clang as well as GCC
+     if test "x$GCC" = "xyes"; then
+        AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
+            [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
+#            if defined(__clang__) && defined(__llvm__)
+             AX_PTHREAD_CC_IS_CLANG
+#            endif
+            ],
+            [ax_cv_PTHREAD_CLANG=yes])
+     fi
+    ])
+ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
+
+
 # GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
 
 # GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
 
+# Note that for GCC and Clang -pthread generally implies -lpthread,
+# except when -nostdlib is passed.
+# This is problematic using libtool to build C++ shared libraries with pthread:
+# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460
+# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333
+# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555
+# To solve this, first try -pthread together with -lpthread for GCC
+
 AS_IF([test "x$GCC" = "xyes"],
 AS_IF([test "x$GCC" = "xyes"],
-      [ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"])
+      [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"])
+
+# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first
+
+AS_IF([test "x$ax_pthread_clang" = "xyes"],
+      [ax_pthread_flags="-pthread,-lpthread -pthread"])
+
 
 # The presence of a feature test macro requesting re-entrant function
 # definitions is, on some systems, a strong hint that pthreads support is
 
 # The presence of a feature test macro requesting re-entrant function
 # definitions is, on some systems, a strong hint that pthreads support is
@@ -224,25 +266,86 @@ AS_IF([test "x$ax_pthread_check_macro" = "x--"],
       [ax_pthread_check_cond=0],
       [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"])
 
       [ax_pthread_check_cond=0],
       [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"])
 
-# Are we compiling with Clang?
 
 
-AC_CACHE_CHECK([whether $CC is Clang],
-    [ax_cv_PTHREAD_CLANG],
-    [ax_cv_PTHREAD_CLANG=no
-     # Note that Autoconf sets GCC=yes for Clang as well as GCC
-     if test "x$GCC" = "xyes"; then
-        AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
-            [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
-#            if defined(__clang__) && defined(__llvm__)
-             AX_PTHREAD_CC_IS_CLANG
-#            endif
-            ],
-            [ax_cv_PTHREAD_CLANG=yes])
-     fi
-    ])
-ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
+if test "x$ax_pthread_ok" = "xno"; then
+for ax_pthread_try_flag in $ax_pthread_flags; do
+
+        case $ax_pthread_try_flag in
+                none)
+                AC_MSG_CHECKING([whether pthreads work without any flags])
+                ;;
+
+                *,*)
+                PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"`
+                PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"`
+                AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"])
+                ;;
+
+                -*)
+                AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
+                PTHREAD_CFLAGS="$ax_pthread_try_flag"
+                ;;
+
+                pthread-config)
+                AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
+                AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
+                PTHREAD_CFLAGS="`pthread-config --cflags`"
+                PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+                ;;
+
+                *)
+                AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
+                PTHREAD_LIBS="-l$ax_pthread_try_flag"
+                ;;
+        esac
+
+        ax_pthread_save_CFLAGS="$CFLAGS"
+        ax_pthread_save_LIBS="$LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+
+        # Check for various functions.  We must include pthread.h,
+        # since some functions may be macros.  (On the Sequent, we
+        # need a special flag -Kthread to make this header compile.)
+        # We check for pthread_join because it is in -lpthread on IRIX
+        # while pthread_create is in libc.  We check for pthread_attr_init
+        # due to DEC craziness with -lpthreads.  We check for
+        # pthread_cleanup_push because it is one of the few pthread
+        # functions on Solaris that doesn't have a non-functional libc stub.
+        # We try pthread_create on general principles.
+
+        AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
+#                       if $ax_pthread_check_cond
+#                        error "$ax_pthread_check_macro must be defined"
+#                       endif
+                        static void *some_global = NULL;
+                        static void routine(void *a)
+                          {
+                             /* To avoid any unused-parameter or
+                                unused-but-set-parameter warning.  */
+                             some_global = a;
+                          }
+                        static void *start_routine(void *a) { return a; }],
+                       [pthread_t th; pthread_attr_t attr;
+                        pthread_create(&th, 0, start_routine, 0);
+                        pthread_join(th, 0);
+                        pthread_attr_init(&attr);
+                        pthread_cleanup_push(routine, 0);
+                        pthread_cleanup_pop(0) /* ; */])],
+            [ax_pthread_ok=yes],
+            [])
+
+        CFLAGS="$ax_pthread_save_CFLAGS"
+        LIBS="$ax_pthread_save_LIBS"
+
+        AC_MSG_RESULT([$ax_pthread_ok])
+        AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
+
+        PTHREAD_LIBS=""
+        PTHREAD_CFLAGS=""
+done
+fi
 
 
-ax_pthread_clang_warning=no
 
 # Clang needs special handling, because older versions handle the -pthread
 # option in a rather... idiosyncratic way
 
 # Clang needs special handling, because older versions handle the -pthread
 # option in a rather... idiosyncratic way
@@ -261,11 +364,6 @@ if test "x$ax_pthread_clang" = "xyes"; then
         # -pthread does define _REENTRANT, and while the Darwin headers
         # ignore this macro, third-party headers might not.)
 
         # -pthread does define _REENTRANT, and while the Darwin headers
         # ignore this macro, third-party headers might not.)
 
-        PTHREAD_CFLAGS="-pthread"
-        PTHREAD_LIBS=
-
-        ax_pthread_ok=yes
-
         # However, older versions of Clang make a point of warning the user
         # that, in an invocation where only linking and no compilation is
         # taking place, the -pthread option has no effect ("argument unused
         # However, older versions of Clang make a point of warning the user
         # that, in an invocation where only linking and no compilation is
         # taking place, the -pthread option has no effect ("argument unused
@@ -294,7 +392,7 @@ if test "x$ax_pthread_clang" = "xyes"; then
              # step
              ax_pthread_save_ac_link="$ac_link"
              ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
              # step
              ax_pthread_save_ac_link="$ac_link"
              ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
-             ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"`
+             ax_pthread_link_step=`AS_ECHO(["$ac_link"]) | sed "$ax_pthread_sed"`
              ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
              ax_pthread_save_CFLAGS="$CFLAGS"
              for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
              ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
              ax_pthread_save_CFLAGS="$CFLAGS"
              for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
@@ -320,78 +418,7 @@ if test "x$ax_pthread_clang" = "xyes"; then
 
 fi # $ax_pthread_clang = yes
 
 
 fi # $ax_pthread_clang = yes
 
-if test "x$ax_pthread_ok" = "xno"; then
-for ax_pthread_try_flag in $ax_pthread_flags; do
-
-        case $ax_pthread_try_flag in
-                none)
-                AC_MSG_CHECKING([whether pthreads work without any flags])
-                ;;
-
-                -mt,pthread)
-                AC_MSG_CHECKING([whether pthreads work with -mt -lpthread])
-                PTHREAD_CFLAGS="-mt"
-                PTHREAD_LIBS="-lpthread"
-                ;;
-
-                -*)
-                AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
-                PTHREAD_CFLAGS="$ax_pthread_try_flag"
-                ;;
 
 
-                pthread-config)
-                AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
-                AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
-                PTHREAD_CFLAGS="`pthread-config --cflags`"
-                PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
-                ;;
-
-                *)
-                AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
-                PTHREAD_LIBS="-l$ax_pthread_try_flag"
-                ;;
-        esac
-
-        ax_pthread_save_CFLAGS="$CFLAGS"
-        ax_pthread_save_LIBS="$LIBS"
-        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-        LIBS="$PTHREAD_LIBS $LIBS"
-
-        # Check for various functions.  We must include pthread.h,
-        # since some functions may be macros.  (On the Sequent, we
-        # need a special flag -Kthread to make this header compile.)
-        # We check for pthread_join because it is in -lpthread on IRIX
-        # while pthread_create is in libc.  We check for pthread_attr_init
-        # due to DEC craziness with -lpthreads.  We check for
-        # pthread_cleanup_push because it is one of the few pthread
-        # functions on Solaris that doesn't have a non-functional libc stub.
-        # We try pthread_create on general principles.
-
-        AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
-#                       if $ax_pthread_check_cond
-#                        error "$ax_pthread_check_macro must be defined"
-#                       endif
-                        static void routine(void *a) { a = 0; }
-                        static void *start_routine(void *a) { return a; }],
-                       [pthread_t th; pthread_attr_t attr;
-                        pthread_create(&th, 0, start_routine, 0);
-                        pthread_join(th, 0);
-                        pthread_attr_init(&attr);
-                        pthread_cleanup_push(routine, 0);
-                        pthread_cleanup_pop(0) /* ; */])],
-            [ax_pthread_ok=yes],
-            [])
-
-        CFLAGS="$ax_pthread_save_CFLAGS"
-        LIBS="$ax_pthread_save_LIBS"
-
-        AC_MSG_RESULT([$ax_pthread_ok])
-        AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
-
-        PTHREAD_LIBS=""
-        PTHREAD_CFLAGS=""
-done
-fi
 
 # Various other checks:
 if test "x$ax_pthread_ok" = "xyes"; then
 
 # Various other checks:
 if test "x$ax_pthread_ok" = "xyes"; then
@@ -461,18 +488,28 @@ if test "x$ax_pthread_ok" = "xyes"; then
                     [#handle absolute path differently from PATH based program lookup
                      AS_CASE(["x$CC"],
                          [x/*],
                     [#handle absolute path differently from PATH based program lookup
                      AS_CASE(["x$CC"],
                          [x/*],
-                         [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])],
-                         [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])
+                         [
+                          AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])
+                          AS_IF([test "x${CXX}" != "x"], [AS_IF([AS_EXECUTABLE_P([${CXX}_r])],[PTHREAD_CXX="${CXX}_r"])])
+                        ],
+                         [
+                          AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])
+                          AS_IF([test "x${CXX}" != "x"], [AC_CHECK_PROGS([PTHREAD_CXX],[${CXX}_r],[$CXX])])
+                        ]
+                     )
+                    ])
                 ;;
             esac
         fi
 fi
 
 test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
                 ;;
             esac
         fi
 fi
 
 test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
+test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX"
 
 AC_SUBST([PTHREAD_LIBS])
 AC_SUBST([PTHREAD_CFLAGS])
 AC_SUBST([PTHREAD_CC])
 
 AC_SUBST([PTHREAD_LIBS])
 AC_SUBST([PTHREAD_CFLAGS])
 AC_SUBST([PTHREAD_CC])
+AC_SUBST([PTHREAD_CXX])
 
 # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
 if test "x$ax_pthread_ok" = "xyes"; then
 
 # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
 if test "x$ax_pthread_ok" = "xyes"; then
diff --git a/m4/ax_require_defined.m4 b/m4/ax_require_defined.m4
new file mode 100644 (file)
index 0000000..6de1b2a
--- /dev/null
@@ -0,0 +1,38 @@
+# SPDX-License-Identifier: FSFAP
+# ===========================================================================
+#    https://www.gnu.org/software/autoconf-archive/ax_require_defined.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_REQUIRE_DEFINED(MACRO)
+#
+# DESCRIPTION
+#
+#   AX_REQUIRE_DEFINED is a simple helper for making sure other macros have
+#   been defined and thus are available for use.  This avoids random issues
+#   where a macro isn't expanded.  Instead the configure script emits a
+#   non-fatal:
+#
+#     ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found
+#
+#   It's like AC_REQUIRE except it doesn't expand the required macro.
+#
+#   Here's an example:
+#
+#     AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG])
+#
+# LICENSE
+#
+#   Copyright (c) 2014 Mike Frysinger <vapier@gentoo.org>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved. This file is offered as-is, without any
+#   warranty.
+
+#serial 2
+
+AC_DEFUN([AX_REQUIRE_DEFINED], [dnl
+  m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])])
+])dnl AX_REQUIRE_DEFINED
diff --git a/m4/ax_tls.m4 b/m4/ax_tls.m4
deleted file mode 100644 (file)
index 51edee8..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-# ===========================================================================
-#          https://www.gnu.org/software/autoconf-archive/ax_tls.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_TLS([action-if-found], [action-if-not-found])
-#
-# DESCRIPTION
-#
-#   Provides a test for the compiler support of thread local storage (TLS)
-#   extensions. Defines TLS if it is found. Currently knows about C++11,
-#   GCC/ICC, and MSVC. I think SunPro uses the same as GCC, and Borland
-#   apparently supports either.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Alan Woodland <ajw05@aber.ac.uk>
-#   Copyright (c) 2010 Diego Elio Petteno` <flameeyes@gmail.com>
-#
-#   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 3 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, see <https://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-#serial 14
-
-AC_DEFUN([AX_TLS], [
-  AC_MSG_CHECKING([for thread local storage (TLS) class])
-  AC_CACHE_VAL([ac_cv_tls],
-   [for ax_tls_keyword in thread_local _Thread_local __thread '__declspec(thread)' none; do
-       AS_CASE([$ax_tls_keyword],
-          [none], [ac_cv_tls=none ; break],
-          [AC_TRY_COMPILE(
-              [#include <stdlib.h>
-               static void
-               foo(void) {
-               static ] $ax_tls_keyword [ int bar;
-               exit(1);
-               }],
-               [],
-               [ac_cv_tls=$ax_tls_keyword ; break],
-               ac_cv_tls=none
-           )])
-    done
-  ])
-  AC_MSG_RESULT([$ac_cv_tls])
-
-  AS_IF([test "$ac_cv_tls" != "none"],
-    [AC_DEFINE_UNQUOTED([TLS],[$ac_cv_tls],[If the compiler supports a TLS storage class define it to that here])
-     m4_ifnblank([$1],[$1])],
-    [m4_ifnblank([$2],[$2])])
-])
diff --git a/m4/pprint.m4 b/m4/pprint.m4
deleted file mode 100644 (file)
index a7cfd94..0000000
+++ /dev/null
@@ -1,210 +0,0 @@
-# Pretty printing macros.
-#
-# Author: Philippe Proulx <pproulx@efficios.com>
-
-#serial 1
-
-# PPRINT_INIT(): initializes the pretty printing system.
-#
-# Use this macro before using any other PPRINT_* macro.
-AC_DEFUN([PPRINT_INIT], [
-  m4_define([PPRINT_CONFIG_TS], [50])
-  m4_define([PPRINT_CONFIG_INDENT], [2])
-  PPRINT_YES_MSG=yes
-  PPRINT_NO_MSG=no
-
-  # find tput, which tells us if colors are supported and gives us color codes
-  AC_PATH_PROG([pprint_tput], [tput])
-
-  AS_IF([test -n "$pprint_tput"], [
-    AS_IF([test -n "$PS1" && test `"$pprint_tput" colors` -eq 256 && test -t 1], [
-      # interactive shell and colors supported and standard output
-      # file descriptor is opened on a terminal
-      PPRINT_COLOR_TXTBLK="`"$pprint_tput" setaf 0`"
-      PPRINT_COLOR_TXTBLU="`"$pprint_tput" setaf 4`"
-      PPRINT_COLOR_TXTGRN="`"$pprint_tput" setaf 2`"
-      PPRINT_COLOR_TXTCYN="`"$pprint_tput" setaf 6`"
-      PPRINT_COLOR_TXTRED="`"$pprint_tput" setaf 1`"
-      PPRINT_COLOR_TXTPUR="`"$pprint_tput" setaf 5`"
-      PPRINT_COLOR_TXTYLW="`"$pprint_tput" setaf 3`"
-      PPRINT_COLOR_TXTWHT="`"$pprint_tput" setaf 7`"
-      PPRINT_COLOR_BLD=`"$pprint_tput" bold`
-      PPRINT_COLOR_BLDBLK="$PPRINT_COLOR_BLD$PPRINT_COLOR_TXTBLK"
-      PPRINT_COLOR_BLDBLU="$PPRINT_COLOR_BLD$PPRINT_COLOR_TXTBLU"
-      PPRINT_COLOR_BLDGRN="$PPRINT_COLOR_BLD$PPRINT_COLOR_TXTGRN"
-      PPRINT_COLOR_BLDCYN="$PPRINT_COLOR_BLD$PPRINT_COLOR_TXTCYN"
-      PPRINT_COLOR_BLDRED="$PPRINT_COLOR_BLD$PPRINT_COLOR_TXTRED"
-      PPRINT_COLOR_BLDPUR="$PPRINT_COLOR_BLD$PPRINT_COLOR_TXTPUR"
-      PPRINT_COLOR_BLDYLW="$PPRINT_COLOR_BLD$PPRINT_COLOR_TXTYLW"
-      PPRINT_COLOR_BLDWHT="$PPRINT_COLOR_BLD$PPRINT_COLOR_TXTWHT"
-      PPRINT_COLOR_RST="`"$pprint_tput" sgr0`"
-
-      # colored yes and no
-      PPRINT_YES_MSG="$PPRINT_COLOR_BLDGRN$PPRINT_YES_MSG$PPRINT_COLOR_RST"
-      PPRINT_NO_MSG="$PPRINT_COLOR_BLDRED$PPRINT_NO_MSG$PPRINT_COLOR_RST"
-
-      # subtitle color
-      PPRINT_COLOR_SUBTITLE="$PPRINT_COLOR_BLDCYN"
-    ])
-  ])
-])
-
-# PPRINT_SET_INDENT(indent): sets the current indentation.
-#
-# Use PPRINT_INIT() before using this macro.
-AC_DEFUN([PPRINT_SET_INDENT], [
-  m4_define([PPRINT_CONFIG_INDENT], [$1])
-])
-
-# PPRINT_SET_TS(ts): sets the current tab stop.
-#
-# Use PPRINT_INIT() before using this macro.
-AC_DEFUN([PPRINT_SET_TS], [
-  m4_define([PPRINT_CONFIG_TS], [$1])
-])
-
-# PPRINT_SUBTITLE(subtitle): pretty prints a subtitle.
-#
-# The subtitle is put as is in a double-quoted shell string so the user
-# needs to escape ".
-#
-# Use PPRINT_INIT() before using this macro.
-AC_DEFUN([PPRINT_SUBTITLE], [
-  AS_ECHO(["${PPRINT_COLOR_SUBTITLE}$1$PPRINT_COLOR_RST"])
-])
-
-AC_DEFUN([_PPRINT_INDENT], [
-  m4_if(PPRINT_CONFIG_INDENT, 0, [
-  ], [
-    m4_for([pprint_i], [0], m4_eval(PPRINT_CONFIG_INDENT * 2 - 1), [1], [
-      AS_ECHO_N([" "])
-    ])
-  ])
-])
-
-# PPRINT_PROP_STRING(title, value, title_color?): pretty prints a
-# string property.
-#
-# The title is put as is in a double-quoted shell string so the user
-# needs to escape ".
-#
-# The $PPRINT_CONFIG_INDENT variable must be set to the desired indentation
-# level.
-#
-# Use PPRINT_INIT() before using this macro.
-AC_DEFUN([PPRINT_PROP_STRING], [
-  m4_pushdef([pprint_title], [$1])
-  m4_pushdef([pprint_value], [$2])
-  m4_pushdef([pprint_title_color], m4_default([$3], []))
-  m4_pushdef([pprint_title_len], m4_len(pprint_title))
-  m4_pushdef([pprint_spaces_cnt], m4_eval(PPRINT_CONFIG_TS - pprint_title_len - (PPRINT_CONFIG_INDENT * 2) - 1))
-
-  m4_if(m4_eval(pprint_spaces_cnt <= 0), [1], [
-    m4_define([pprint_spaces_cnt], [1])
-  ])
-
-  m4_pushdef([pprint_spaces], [])
-
-  m4_for([pprint_i], 0, m4_eval(pprint_spaces_cnt - 1), [1], [
-    m4_append([pprint_spaces], [ ])
-  ])
-
-  _PPRINT_INDENT
-
-  AS_ECHO_N(["pprint_title_color""pprint_title$PPRINT_COLOR_RST:pprint_spaces"])
-  AS_ECHO(["${PPRINT_COLOR_BLD}pprint_value$PPRINT_COLOR_RST"])
-
-  m4_popdef([pprint_spaces])
-  m4_popdef([pprint_spaces_cnt])
-  m4_popdef([pprint_title_len])
-  m4_popdef([pprint_title_color])
-  m4_popdef([pprint_value])
-  m4_popdef([pprint_title])
-])
-
-# PPRINT_PROP_BOOL(title, value, title_color?): pretty prints a boolean
-# property.
-#
-# The title is put as is in a double-quoted shell string so the user
-# needs to escape ".
-#
-# The value is evaluated at shell runtime. Its evaluation must be
-# 0 (false) or 1 (true).
-#
-# Uses the PPRINT_PROP_STRING() with the "yes" or "no" string.
-#
-# Use PPRINT_INIT() before using this macro.
-AC_DEFUN([PPRINT_PROP_BOOL], [
-  m4_pushdef([pprint_title], [$1])
-  m4_pushdef([pprint_value], [$2])
-
-  test pprint_value -eq 0 && pprint_msg="$PPRINT_NO_MSG" || pprint_msg="$PPRINT_YES_MSG"
-
-  m4_if([$#], [3], [
-    PPRINT_PROP_STRING(pprint_title, [$pprint_msg], $3)
-  ], [
-    PPRINT_PROP_STRING(pprint_title, [$pprint_msg])
-  ])
-
-  m4_popdef([pprint_value])
-  m4_popdef([pprint_title])
-])
-
-# PPRINT_PROP_BOOL_CUSTOM(title, value, no_msg, title_color?): pretty prints a boolean
-# property.
-#
-# The title is put as is in a double-quoted shell string so the user
-# needs to escape ".
-#
-# The value is evaluated at shell runtime. Its evaluation must be
-# 0 (false) or 1 (true).
-#
-# Uses the PPRINT_PROP_STRING() with the "yes" or "no" string.
-#
-# Use PPRINT_INIT() before using this macro.
-AC_DEFUN([PPRINT_PROP_BOOL_CUSTOM], [
-  m4_pushdef([pprint_title], [$1])
-  m4_pushdef([pprint_value], [$2])
-  m4_pushdef([pprint_value_no_msg], [$3])
-
-  test pprint_value -eq 0 && pprint_msg="$PPRINT_NO_MSG (pprint_value_no_msg)" || pprint_msg="$PPRINT_YES_MSG"
-
-  m4_if([$#], [4], [
-    PPRINT_PROP_STRING(pprint_title, [$pprint_msg], $4)
-  ], [
-    PPRINT_PROP_STRING(pprint_title, [$pprint_msg])
-  ])
-
-  m4_popdef([pprint_value_no_msg])
-  m4_popdef([pprint_value])
-  m4_popdef([pprint_title])
-])
-
-# PPRINT_WARN(msg): pretty prints a warning message.
-#
-# The message is put as is in a double-quoted shell string so the user
-# needs to escape ".
-#
-# Use PPRINT_INIT() before using this macro.
-AC_DEFUN([PPRINT_WARN], [
-  m4_pushdef([pprint_msg], [$1])
-
-  _PPRINT_INDENT
-  AS_ECHO(["${PPRINT_COLOR_TXTYLW}WARNING:$PPRINT_COLOR_RST ${PPRINT_COLOR_BLDYLW}pprint_msg$PPRINT_COLOR_RST"])
-
-  m4_popdef([pprint_msg])
-])
-
-# PPRINT_ERROR(msg): pretty prints an error message and exits.
-#
-# The message is put as is in a double-quoted shell string so the user
-# needs to escape ".
-#
-# Use PPRINT_INIT() before using this macro.
-AC_DEFUN([PPRINT_ERROR], [
-  m4_pushdef([pprint_msg], [$1])
-
-  AC_MSG_ERROR([${PPRINT_COLOR_BLDRED}pprint_msg$PPRINT_COLOR_RST])
-
-  m4_popdef([pprint_msg])
-])
index 3d150486ffcbf4ba9622b3166067411d279ff968..3f065b4c71b9d1589f40b443429e53b9a5cd1ceb 100755 (executable)
@@ -1,25 +1,13 @@
 #!/bin/sh
 #!/bin/sh
+
+# SPDX-FileCopyrightText: 2013 IBM Corporation
 #
 #
+# SPDX-License-Identifier: GPL-2.0-or-later
+
 # Run in userspace-rcu git archive.  Prints out a list of API members
 # and the version in which they were introduced.  You need to list all
 # the API members immediately below. Depends on "cscope".
 # Run in userspace-rcu git archive.  Prints out a list of API members
 # and the version in which they were introduced.  You need to list all
 # the API members immediately below. Depends on "cscope".
-#
-# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# Copyright (C) IBM Corporation, 2013
-#
+
 # Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
 
 api="caa_container_of \
 # Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
 
 api="caa_container_of \
index 88ccc1f977ec6a2f42538389c3bd45897742291a..b555c8181f61b1bbe53e6573ff5fcd9fa38a919d 100644 (file)
@@ -1,29 +1,24 @@
-AM_CPPFLAGS += -I$(top_srcdir)/include -I$(top_builddir)/include -I$(top_srcdir)/src
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
+
+AM_CPPFLAGS += -I$(top_srcdir)/src
 
 #Add the -version-info directly here since we are only building
 # library that use the version-info
 
 #Add the -version-info directly here since we are only building
 # library that use the version-info
-AM_LDFLAGS=-version-info $(URCU_LIBRARY_VERSION)
-if USE_CYGWIN
-AM_LDFLAGS+=-no-undefined
-endif
+AM_LDFLAGS=-version-info $(URCU_LIBRARY_VERSION) $(LT_NO_UNDEFINED)
 
 dist_noinst_HEADERS = urcu-die.h urcu-wait.h compat-getcpu.h \
 
 dist_noinst_HEADERS = urcu-die.h urcu-wait.h compat-getcpu.h \
-       compat-rand.h urcu-utils.h
+       urcu-utils.h compat-smp.h
 
 
-if COMPAT_ARCH
-COMPAT=compat_arch_@ARCHTYPE@.c
-else
-COMPAT=
-endif
-
-COMPAT+=compat_futex.c
+COMPAT = compat_arch.c compat_futex.c
 
 RCULFHASH = rculfhash.c rculfhash-mm-order.c rculfhash-mm-chunk.c \
                rculfhash-mm-mmap.c
 
 lib_LTLIBRARIES = liburcu-common.la \
                liburcu.la liburcu-qsbr.la \
 
 RCULFHASH = rculfhash.c rculfhash-mm-order.c rculfhash-mm-chunk.c \
                rculfhash-mm-mmap.c
 
 lib_LTLIBRARIES = liburcu-common.la \
                liburcu.la liburcu-qsbr.la \
-               liburcu-mb.la liburcu-signal.la liburcu-bp.la \
+               liburcu-mb.la liburcu-bp.la \
                liburcu-memb.la liburcu-cds.la
 
 #
                liburcu-memb.la liburcu-cds.la
 
 #
@@ -48,10 +43,6 @@ liburcu_mb_la_SOURCES = urcu.c urcu-pointer.c $(COMPAT)
 liburcu_mb_la_CFLAGS = -DRCU_MB $(AM_CFLAGS)
 liburcu_mb_la_LIBADD = liburcu-common.la
 
 liburcu_mb_la_CFLAGS = -DRCU_MB $(AM_CFLAGS)
 liburcu_mb_la_LIBADD = liburcu-common.la
 
-liburcu_signal_la_SOURCES = urcu.c urcu-pointer.c $(COMPAT)
-liburcu_signal_la_CFLAGS = -DRCU_SIGNAL $(AM_CFLAGS)
-liburcu_signal_la_LIBADD = liburcu-common.la
-
 liburcu_bp_la_SOURCES = urcu-bp.c urcu-pointer.c $(COMPAT)
 liburcu_bp_la_LIBADD = liburcu-common.la
 
 liburcu_bp_la_SOURCES = urcu-bp.c urcu-pointer.c $(COMPAT)
 liburcu_bp_la_LIBADD = liburcu-common.la
 
@@ -61,9 +52,10 @@ liburcu_cds_la_LIBADD = liburcu-common.la
 
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = liburcu-cds.pc liburcu.pc liburcu-bp.pc liburcu-qsbr.pc \
 
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = liburcu-cds.pc liburcu.pc liburcu-bp.pc liburcu-qsbr.pc \
-       liburcu-signal.pc liburcu-mb.pc
+       liburcu-mb.pc liburcu-memb.pc
 
 
-EXTRA_DIST = compat_arch_x86.c \
+EXTRA_DIST = \
        urcu-call-rcu-impl.h \
        urcu-defer-impl.h \
        urcu-call-rcu-impl.h \
        urcu-defer-impl.h \
+       urcu-poll-impl.h \
        rculfhash-internal.h
        rculfhash-internal.h
index 3c1899b28d38f4876467e3e685136d2fa0fa217f..ad5ec117a324eb7d977b26e19e43a4848f47551e 100644 (file)
@@ -1,26 +1,10 @@
+// SPDX-FileCopyrightText: 2015 Michael Jeanson <mjeanson@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _COMPAT_GETCPU_H
 #define _COMPAT_GETCPU_H
 
 #ifndef _COMPAT_GETCPU_H
 #define _COMPAT_GETCPU_H
 
-/*
- * compat-getcpu.h
- *
- * Copyright (c) 2015 Michael Jeanson <mjeanson@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
 #if defined(HAVE_SCHED_GETCPU)
 #include <sched.h>
 
 #if defined(HAVE_SCHED_GETCPU)
 #include <sched.h>
 
diff --git a/src/compat-rand.h b/src/compat-rand.h
deleted file mode 100644 (file)
index 835d99b..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-#ifndef _COMPAT_RAND_H
-#define _COMPAT_RAND_H
-
-/*
- * compat-rand.h
- *
- * Userspace RCU library - rand/rand_r Compatibility Header
- *
- * Copyright 1996 - Ulrich Drepper <drepper@cygnus.com >
- * Copyright 2013 - Pierre-Luc St-Charles <pierre-luc.st-charles@polymtl.ca>
- *
- * Note: this file is only used to simplify the code required to
- * use the 'rand_r(...)' system function across multiple platforms,
- * which might not always be referenced the same way.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef HAVE_RAND_R
-/*
- * Reentrant random function from POSIX.1c.
- * Copyright (C) 1996, 1999 Free Software Foundation, Inc.
- * This file is part of the GNU C Library.
- * Contributed by Ulrich Drepper <drepper@cygnus.com <mailto:drepper@cygnus.com>>, 1996.
- */
-static inline int rand_r(unsigned int *seed)
-{
-       unsigned int next = *seed;
-       int result;
-
-       next *= 1103515245;
-       next += 12345;
-       result = (unsigned int) (next / 65536) % 2048;
-
-       next *= 1103515245;
-       next += 12345;
-       result <<= 10;
-       result ^= (unsigned int) (next / 65536) % 1024;
-
-       next *= 1103515245;
-       next += 12345;
-       result <<= 10;
-       result ^= (unsigned int) (next / 65536) % 1024;
-
-       *seed = next;
-
-       return result;
-}
-#endif /* HAVE_RAND_R */
-
-#endif /* _COMPAT_RAND_H */
diff --git a/src/compat-smp.h b/src/compat-smp.h
new file mode 100644 (file)
index 0000000..31fa979
--- /dev/null
@@ -0,0 +1,275 @@
+/*
+ * SPDX-License-Identifier: LGPL-2.1-only
+ *
+ * Copyright (C) 2011-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ * Copyright (C) 2019 Michael Jeanson <mjeanson@efficios.com>
+ */
+
+#include <assert.h>
+#include <ctype.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <urcu/compiler.h>
+
+#define URCU_CPUMASK_SIZE 4096
+
+#if defined(HAVE_SYSCONF)
+static inline int get_num_possible_cpus_sysconf(void)
+{
+       return sysconf(_SC_NPROCESSORS_CONF);
+}
+#else
+/*
+ * On platforms without sysconf(), always return -1.
+ */
+static inline int get_num_possible_cpus_sysconf(void)
+{
+       return -1;
+}
+#endif
+
+#ifdef __linux__
+/*
+ * Get the highest CPU id from sysfs.
+ *
+ * Iterate on all the folders in "/sys/devices/system/cpu" that start with
+ * "cpu" followed by an integer, keep the highest CPU id encountered during
+ * this iteration and add 1 to get a number of CPUs.
+ *
+ * Returns the highest CPU id, or -1 on error.
+ */
+static inline int _get_max_cpuid_from_sysfs(const char *path)
+{
+       long max_cpuid = -1;
+
+       DIR *cpudir;
+       struct dirent *entry;
+
+       assert(path);
+
+       cpudir = opendir(path);
+       if (cpudir == NULL)
+               goto end;
+
+       /*
+        * Iterate on all directories named "cpu" followed by an integer.
+        */
+       while ((entry = readdir(cpudir))) {
+               if (entry->d_type == DT_DIR &&
+                       strncmp(entry->d_name, "cpu", 3) == 0) {
+
+                       char *endptr;
+                       long cpu_id;
+
+                       cpu_id = strtol(entry->d_name + 3, &endptr, 10);
+                       if ((cpu_id < LONG_MAX) && (endptr != entry->d_name + 3)
+                                       && (*endptr == '\0')) {
+                               if (cpu_id > max_cpuid)
+                                       max_cpuid = cpu_id;
+                       }
+               }
+       }
+
+       if (closedir(cpudir))
+               perror("closedir");
+
+       /*
+        * If the max CPU id is out of bound, set it to -1 so it results in a
+        * CPU num of 0.
+        */
+       if (max_cpuid < 0 || max_cpuid > INT_MAX)
+               max_cpuid = -1;
+
+end:
+       return max_cpuid;
+}
+
+static inline int get_max_cpuid_from_sysfs(void)
+{
+       return _get_max_cpuid_from_sysfs("/sys/devices/system/cpu");
+}
+
+
+/*
+ * As a fallback to parsing the CPU mask in "/sys/devices/system/cpu/possible",
+ * iterate on all the folders in "/sys/devices/system/cpu" that start with
+ * "cpu" followed by an integer, keep the highest CPU id encountered during
+ * this iteration and add 1 to get a number of CPUs.
+ *
+ * Then get the value from sysconf(_SC_NPROCESSORS_CONF) as a fallback and
+ * return the highest one.
+ *
+ * On Linux, using the value from sysconf can be unreliable since the way it
+ * counts CPUs varies between C libraries and even between versions of the same
+ * library. If we used it directly, getcpu() could return a value greater than
+ * this sysconf, in which case the arrays indexed by processor would overflow.
+ *
+ * As another example, the MUSL libc implementation of the _SC_NPROCESSORS_CONF
+ * sysconf does not return the number of configured CPUs in the system but
+ * relies on the cpu affinity mask of the current task.
+ *
+ * Returns 0 or less on error.
+ */
+static inline int get_num_possible_cpus_fallback(void)
+{
+       /*
+        * Get the sysconf value as a last resort. Keep the highest number.
+        */
+       return caa_max(get_num_possible_cpus_sysconf(), get_max_cpuid_from_sysfs() + 1);
+}
+
+/*
+ * Get a CPU mask string from sysfs.
+ *
+ * buf: the buffer where the mask will be read.
+ * max_bytes: the maximum number of bytes to write in the buffer.
+ * path: file path to read the mask from.
+ *
+ * Returns the number of bytes read or -1 on error.
+ */
+static inline int get_cpu_mask_from_sysfs(char *buf, size_t max_bytes, const char *path)
+{
+       ssize_t bytes_read = 0;
+       size_t total_bytes_read = 0;
+       int fd = -1, ret = -1;
+
+       assert(path);
+
+       if (buf == NULL)
+               goto end;
+
+       fd = open(path, O_RDONLY);
+       if (fd < 0)
+               goto end;
+
+       do {
+               bytes_read = read(fd, buf + total_bytes_read,
+                               max_bytes - total_bytes_read);
+
+               if (bytes_read < 0) {
+                       if (errno == EINTR) {
+                               continue;       /* retry operation */
+                       } else {
+                               goto end;
+                       }
+               }
+
+               total_bytes_read += bytes_read;
+               assert(total_bytes_read <= max_bytes);
+       } while (max_bytes > total_bytes_read && bytes_read > 0);
+
+       /*
+        * Make sure the mask read is a null terminated string.
+        */
+       if (total_bytes_read < max_bytes)
+               buf[total_bytes_read] = '\0';
+       else
+               buf[max_bytes - 1] = '\0';
+
+       if (total_bytes_read > INT_MAX)
+               goto end;
+
+       ret = (int) total_bytes_read;
+
+end:
+       if (fd >= 0 && close(fd) < 0)
+               perror("close");
+
+       return ret;
+}
+
+/*
+ * Get the CPU possible mask string from sysfs.
+ *
+ * buf: the buffer where the mask will be read.
+ * max_bytes: the maximum number of bytes to write in the buffer.
+ *
+ * Returns the number of bytes read or -1 on error.
+ */
+static inline int get_possible_cpu_mask_from_sysfs(char *buf, size_t max_bytes)
+{
+       return get_cpu_mask_from_sysfs(buf, max_bytes,
+                       "/sys/devices/system/cpu/possible");
+}
+
+/*
+ * Get the highest CPU id from the possible CPU mask.
+ *
+ * pmask: the mask to parse.
+ * len: the len of the mask excluding '\0'.
+ *
+ * Returns the highest CPU id from the mask or -1 on error.
+ */
+static inline int get_max_cpuid_from_mask(const char *pmask, size_t len)
+{
+       ssize_t i;
+       unsigned long cpu_index;
+       char *endptr;
+
+       /* We need at least one char to read */
+       if (len < 1)
+               goto error;
+
+       /* Start from the end to read the last CPU index. */
+       for (i = len - 1; i > 0; i--) {
+               /* Break when we hit the first separator. */
+               if ((pmask[i] == ',') || (pmask[i] == '-')) {
+                       i++;
+                       break;
+               }
+       }
+
+       cpu_index = strtoul(&pmask[i], &endptr, 10);
+
+       if ((&pmask[i] != endptr) && (cpu_index < INT_MAX))
+               return (int) cpu_index;
+
+error:
+       return -1;
+}
+
+/*
+ * On Linux try sysfs first and fallback to sysconf.
+ */
+static inline int get_possible_cpus_array_len(void)
+{
+       int ret;
+       char buf[URCU_CPUMASK_SIZE];
+
+       /* Get the possible cpu mask from sysfs, fallback to sysconf. */
+       ret = get_possible_cpu_mask_from_sysfs((char *) &buf, URCU_CPUMASK_SIZE);
+       if (ret <= 0)
+               goto fallback;
+
+       /* Parse the possible cpu mask, on failure fallback to sysconf. */
+       ret = get_max_cpuid_from_mask((char *) &buf, ret);
+       if (ret >= 0) {
+               /* Add 1 to convert from max cpuid to an array len. */
+               ret++;
+               goto end;
+       }
+
+fallback:
+       /* Fallback to sysconf. */
+       ret = get_num_possible_cpus_fallback();
+
+end:
+       return ret;
+}
+#else
+/*
+ * On other platforms, only use sysconf.
+ */
+static inline int get_possible_cpus_array_len(void)
+{
+       return get_num_possible_cpus_sysconf();
+}
+#endif
diff --git a/src/compat_arch.c b/src/compat_arch.c
new file mode 100644 (file)
index 0000000..474a832
--- /dev/null
@@ -0,0 +1,294 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+/*
+ * Userspace RCU library - architecture compatibility checks
+ */
+
+#include <urcu/arch.h>
+
+#ifdef URCU_ARCH_X86_NO_CAS
+
+#include <stdio.h>
+#include <pthread.h>
+#include <signal.h>
+#include <urcu/assert.h>
+#include <urcu/uatomic.h>
+
+/*
+ * Using attribute "weak" for __rcu_cas_avail and
+ * __urcu_x86_compat_mutex. Those are globally visible by the entire
+ * program, even though many shared objects may have their own version.
+ * The first version that gets loaded will be used by the entire
+ * program (executable and all shared objects).
+ */
+
+/*
+ * It does not really matter if the constructor is called before using
+ * the library, as long as the caller checks if __rcu_cas_avail < 0 and calls
+ * compat_arch_init() explicitly if needed.
+ */
+int __attribute__((constructor)) __rcu_cas_init(void);
+
+/*
+ * -1: unknown
+ *  1: available
+ *  0: unavailable
+ */
+__attribute__((weak))
+int __rcu_cas_avail = -1;
+
+__attribute__((weak))
+pthread_mutex_t __urcu_x86_compat_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+/*
+ * get_eflags/set_eflags/compare_and_swap_is_available imported from glibc
+ * 2.3.5. linuxthreads/sysdeps/i386/pt-machine.h.
+ */
+
+static int get_eflags (void)
+{
+       int res;
+       __asm__ __volatile__ ("pushfl; popl %0" : "=r" (res) : );
+       return res;
+}
+
+static void set_eflags (int newflags)
+{
+       __asm__ __volatile__ ("pushl %0; popfl" : : "r" (newflags) : "cc");
+}
+
+static int compare_and_swap_is_available (void)
+{
+       int oldflags = get_eflags ();
+       int changed;
+       /* Flip AC bit in EFLAGS.  */
+       set_eflags (oldflags ^ 0x40000);
+       /* See if bit changed.  */
+       changed = (get_eflags () ^ oldflags) & 0x40000;
+       /* Restore EFLAGS.  */
+       set_eflags (oldflags);
+       /* If the AC flag did not change, it's a 386 and it lacks cmpxchg.
+       Otherwise, it's a 486 or above and it has cmpxchg.  */
+       return changed != 0;
+}
+
+static void mutex_lock_signal_save(pthread_mutex_t *mutex, sigset_t *oldmask)
+{
+       sigset_t newmask;
+       int ret;
+
+       /* Disable signals */
+       ret = sigfillset(&newmask);
+       urcu_posix_assert(!ret);
+       ret = pthread_sigmask(SIG_BLOCK, &newmask, oldmask);
+       urcu_posix_assert(!ret);
+       ret = pthread_mutex_lock(&__urcu_x86_compat_mutex);
+       urcu_posix_assert(!ret);
+}
+
+static void mutex_lock_signal_restore(pthread_mutex_t *mutex, sigset_t *oldmask)
+{
+       int ret;
+
+       ret = pthread_mutex_unlock(&__urcu_x86_compat_mutex);
+       urcu_posix_assert(!ret);
+       ret = pthread_sigmask(SIG_SETMASK, oldmask, NULL);
+       urcu_posix_assert(!ret);
+}
+
+unsigned long _compat_uatomic_set(void *addr, unsigned long _new, int len)
+{
+       sigset_t mask;
+       unsigned long result;
+
+       mutex_lock_signal_save(&__urcu_x86_compat_mutex, &mask);
+       switch (len) {
+       case 1:
+               *(unsigned char *)addr = (unsigned char)_new;
+               result = *(unsigned char *)addr;
+               break;
+       case 2:
+               *(unsigned short *)addr = (unsigned short)_new;
+               result = *(unsigned short *)addr;
+               break;
+       case 4:
+               *(unsigned int *)addr = (unsigned int)_new;
+               result = *(unsigned int *)addr;
+               break;
+       default:
+               /*
+                * generate an illegal instruction. Cannot catch this with
+                * linker tricks when optimizations are disabled.
+                */
+               result = 0;
+               __asm__ __volatile__("ud2");
+       }
+       mutex_lock_signal_restore(&__urcu_x86_compat_mutex, &mask);
+       return result;
+}
+
+unsigned long _compat_uatomic_xchg(void *addr, unsigned long _new, int len)
+{
+       sigset_t mask;
+       unsigned long retval;
+
+       mutex_lock_signal_save(&__urcu_x86_compat_mutex, &mask);
+       switch (len) {
+       case 1:
+               retval = *(unsigned char *)addr;
+               *(unsigned char *)addr = (unsigned char)_new;
+               break;
+       case 2:
+               retval = *(unsigned short *)addr;
+               *(unsigned short *)addr = (unsigned short)_new;
+               break;
+       case 4:
+               retval = *(unsigned int *)addr;
+               *(unsigned int *)addr = (unsigned int)_new;
+               break;
+       default:
+               /*
+                * generate an illegal instruction. Cannot catch this with
+                * linker tricks when optimizations are disabled.
+                */
+               retval = 0;     /* silence gcc warnings */
+               __asm__ __volatile__("ud2");
+       }
+       mutex_lock_signal_restore(&__urcu_x86_compat_mutex, &mask);
+       return retval;
+}
+
+unsigned long _compat_uatomic_cmpxchg(void *addr, unsigned long old,
+                                     unsigned long _new, int len)
+{
+       unsigned long retval;
+       sigset_t mask;
+
+       mutex_lock_signal_save(&__urcu_x86_compat_mutex, &mask);
+       switch (len) {
+       case 1:
+       {
+               unsigned char result = *(unsigned char *)addr;
+               if (result == (unsigned char)old)
+                       *(unsigned char *)addr = (unsigned char)_new;
+               retval = result;
+               break;
+       }
+       case 2:
+       {
+               unsigned short result = *(unsigned short *)addr;
+               if (result == (unsigned short)old)
+                       *(unsigned short *)addr = (unsigned short)_new;
+               retval = result;
+               break;
+       }
+       case 4:
+       {
+               unsigned int result = *(unsigned int *)addr;
+               if (result == (unsigned int)old)
+                       *(unsigned int *)addr = (unsigned int)_new;
+               retval = result;
+               break;
+       }
+       default:
+               /*
+                * generate an illegal instruction. Cannot catch this with
+                * linker tricks when optimizations are disabled.
+                */
+               retval = 0;     /* silence gcc warnings */
+               __asm__ __volatile__("ud2");
+       }
+       mutex_lock_signal_restore(&__urcu_x86_compat_mutex, &mask);
+       return retval;
+}
+
+void _compat_uatomic_or(void *addr, unsigned long v, int len)
+{
+       sigset_t mask;
+
+       mutex_lock_signal_save(&__urcu_x86_compat_mutex, &mask);
+       switch (len) {
+       case 1:
+               *(unsigned char *)addr |= (unsigned char)v;
+               break;
+       case 2:
+               *(unsigned short *)addr |= (unsigned short)v;
+               break;
+       case 4:
+               *(unsigned int *)addr |= (unsigned int)v;
+               break;
+       default:
+               /*
+                * generate an illegal instruction. Cannot catch this with
+                * linker tricks when optimizations are disabled.
+                */
+               __asm__ __volatile__("ud2");
+       }
+       mutex_lock_signal_restore(&__urcu_x86_compat_mutex, &mask);
+}
+
+void _compat_uatomic_and(void *addr, unsigned long v, int len)
+{
+       sigset_t mask;
+
+       mutex_lock_signal_save(&__urcu_x86_compat_mutex, &mask);
+       switch (len) {
+       case 1:
+               *(unsigned char *)addr &= (unsigned char)v;
+               break;
+       case 2:
+               *(unsigned short *)addr &= (unsigned short)v;
+               break;
+       case 4:
+               *(unsigned int *)addr &= (unsigned int)v;
+               break;
+       default:
+               /*
+                * generate an illegal instruction. Cannot catch this with
+                * linker tricks when optimizations are disabled.
+                */
+               __asm__ __volatile__("ud2");
+       }
+       mutex_lock_signal_restore(&__urcu_x86_compat_mutex, &mask);
+}
+
+unsigned long _compat_uatomic_add_return(void *addr, unsigned long v, int len)
+{
+       sigset_t mask;
+       unsigned long result;
+
+       mutex_lock_signal_save(&__urcu_x86_compat_mutex, &mask);
+       switch (len) {
+       case 1:
+               *(unsigned char *)addr += (unsigned char)v;
+               result = *(unsigned char *)addr;
+               break;
+       case 2:
+               *(unsigned short *)addr += (unsigned short)v;
+               result = *(unsigned short *)addr;
+               break;
+       case 4:
+               *(unsigned int *)addr += (unsigned int)v;
+               result = *(unsigned int *)addr;
+               break;
+       default:
+               /*
+                * generate an illegal instruction. Cannot catch this with
+                * linker tricks when optimizations are disabled.
+                */
+               result = 0;     /* silence gcc warnings */
+               __asm__ __volatile__("ud2");
+       }
+       mutex_lock_signal_restore(&__urcu_x86_compat_mutex, &mask);
+       return result;
+}
+
+int __rcu_cas_init(void)
+{
+       if (__rcu_cas_avail < 0)
+               __rcu_cas_avail = compare_and_swap_is_available();
+       return __rcu_cas_avail;
+}
+#endif
diff --git a/src/compat_arch_x86.c b/src/compat_arch_x86.c
deleted file mode 100644 (file)
index 3e73f9c..0000000
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- * compat_arch_x86.c
- *
- * Userspace RCU library - x86 compatibility checks
- *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <stdio.h>
-#include <pthread.h>
-#include <signal.h>
-#include <assert.h>
-#include <urcu/uatomic.h>
-
-/*
- * Using attribute "weak" for __rcu_cas_avail and
- * __urcu_x86_compat_mutex. Those are globally visible by the entire
- * program, even though many shared objects may have their own version.
- * The first version that gets loaded will be used by the entire
- * program (executable and all shared objects).
- */
-
-/*
- * It does not really matter if the constructor is called before using
- * the library, as long as the caller checks if __rcu_cas_avail < 0 and calls
- * compat_arch_init() explicitely if needed.
- */
-int __attribute__((constructor)) __rcu_cas_init(void);
-
-/*
- * -1: unknown
- *  1: available
- *  0: unavailable
- */
-__attribute__((weak))
-int __rcu_cas_avail = -1;
-
-__attribute__((weak))
-pthread_mutex_t __urcu_x86_compat_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-/*
- * get_eflags/set_eflags/compare_and_swap_is_available imported from glibc
- * 2.3.5. linuxthreads/sysdeps/i386/pt-machine.h.
- */
-
-static int get_eflags (void)
-{
-       int res;
-       __asm__ __volatile__ ("pushfl; popl %0" : "=r" (res) : );
-       return res;
-}
-
-static void set_eflags (int newflags)
-{
-       __asm__ __volatile__ ("pushl %0; popfl" : : "r" (newflags) : "cc");
-}
-
-static int compare_and_swap_is_available (void)
-{
-       int oldflags = get_eflags ();
-       int changed;
-       /* Flip AC bit in EFLAGS.  */
-       set_eflags (oldflags ^ 0x40000);
-       /* See if bit changed.  */
-       changed = (get_eflags () ^ oldflags) & 0x40000;
-       /* Restore EFLAGS.  */
-       set_eflags (oldflags);
-       /* If the AC flag did not change, it's a 386 and it lacks cmpxchg.
-       Otherwise, it's a 486 or above and it has cmpxchg.  */
-       return changed != 0;
-}
-
-static void mutex_lock_signal_save(pthread_mutex_t *mutex, sigset_t *oldmask)
-{
-       sigset_t newmask;
-       int ret;
-
-       /* Disable signals */
-       ret = sigfillset(&newmask);
-       assert(!ret);
-       ret = pthread_sigmask(SIG_BLOCK, &newmask, oldmask);
-       assert(!ret);
-       ret = pthread_mutex_lock(&__urcu_x86_compat_mutex);
-       assert(!ret);
-}
-
-static void mutex_lock_signal_restore(pthread_mutex_t *mutex, sigset_t *oldmask)
-{
-       int ret;
-
-       ret = pthread_mutex_unlock(&__urcu_x86_compat_mutex);
-       assert(!ret);
-       ret = pthread_sigmask(SIG_SETMASK, oldmask, NULL);
-       assert(!ret);
-}
-
-unsigned long _compat_uatomic_set(void *addr, unsigned long _new, int len)
-{
-       sigset_t mask;
-       unsigned long result;
-
-       mutex_lock_signal_save(&__urcu_x86_compat_mutex, &mask);
-       switch (len) {
-       case 1:
-               *(unsigned char *)addr = (unsigned char)_new;
-               result = *(unsigned char *)addr;
-               break;
-       case 2:
-               *(unsigned short *)addr = (unsigned short)_new;
-               result = *(unsigned short *)addr;
-               break;
-       case 4:
-               *(unsigned int *)addr = (unsigned int)_new;
-               result = *(unsigned int *)addr;
-               break;
-       default:
-               /*
-                * generate an illegal instruction. Cannot catch this with
-                * linker tricks when optimizations are disabled.
-                */
-               result = 0;
-               __asm__ __volatile__("ud2");
-       }
-       mutex_lock_signal_restore(&__urcu_x86_compat_mutex, &mask);
-       return result;
-}
-
-unsigned long _compat_uatomic_xchg(void *addr, unsigned long _new, int len)
-{
-       sigset_t mask;
-       unsigned long retval;
-
-       mutex_lock_signal_save(&__urcu_x86_compat_mutex, &mask);
-       switch (len) {
-       case 1:
-               retval = *(unsigned char *)addr;
-               *(unsigned char *)addr = (unsigned char)_new;
-               break;
-       case 2:
-               retval = *(unsigned short *)addr;
-               *(unsigned short *)addr = (unsigned short)_new;
-               break;
-       case 4:
-               retval = *(unsigned int *)addr;
-               *(unsigned int *)addr = (unsigned int)_new;
-               break;
-       default:
-               /*
-                * generate an illegal instruction. Cannot catch this with
-                * linker tricks when optimizations are disabled.
-                */
-               retval = 0;     /* silence gcc warnings */
-               __asm__ __volatile__("ud2");
-       }
-       mutex_lock_signal_restore(&__urcu_x86_compat_mutex, &mask);
-       return retval;
-}
-
-unsigned long _compat_uatomic_cmpxchg(void *addr, unsigned long old,
-                                     unsigned long _new, int len)
-{
-       unsigned long retval;
-       sigset_t mask;
-
-       mutex_lock_signal_save(&__urcu_x86_compat_mutex, &mask);
-       switch (len) {
-       case 1:
-       {
-               unsigned char result = *(unsigned char *)addr;
-               if (result == (unsigned char)old)
-                       *(unsigned char *)addr = (unsigned char)_new;
-               retval = result;
-               break;
-       }
-       case 2:
-       {
-               unsigned short result = *(unsigned short *)addr;
-               if (result == (unsigned short)old)
-                       *(unsigned short *)addr = (unsigned short)_new;
-               retval = result;
-               break;
-       }
-       case 4:
-       {
-               unsigned int result = *(unsigned int *)addr;
-               if (result == (unsigned int)old)
-                       *(unsigned int *)addr = (unsigned int)_new;
-               retval = result;
-               break;
-       }
-       default:
-               /*
-                * generate an illegal instruction. Cannot catch this with
-                * linker tricks when optimizations are disabled.
-                */
-               retval = 0;     /* silence gcc warnings */
-               __asm__ __volatile__("ud2");
-       }
-       mutex_lock_signal_restore(&__urcu_x86_compat_mutex, &mask);
-       return retval;
-}
-
-void _compat_uatomic_or(void *addr, unsigned long v, int len)
-{
-       sigset_t mask;
-
-       mutex_lock_signal_save(&__urcu_x86_compat_mutex, &mask);
-       switch (len) {
-       case 1:
-               *(unsigned char *)addr |= (unsigned char)v;
-               break;
-       case 2:
-               *(unsigned short *)addr |= (unsigned short)v;
-               break;
-       case 4:
-               *(unsigned int *)addr |= (unsigned int)v;
-               break;
-       default:
-               /*
-                * generate an illegal instruction. Cannot catch this with
-                * linker tricks when optimizations are disabled.
-                */
-               __asm__ __volatile__("ud2");
-       }
-       mutex_lock_signal_restore(&__urcu_x86_compat_mutex, &mask);
-}
-
-void _compat_uatomic_and(void *addr, unsigned long v, int len)
-{
-       sigset_t mask;
-
-       mutex_lock_signal_save(&__urcu_x86_compat_mutex, &mask);
-       switch (len) {
-       case 1:
-               *(unsigned char *)addr &= (unsigned char)v;
-               break;
-       case 2:
-               *(unsigned short *)addr &= (unsigned short)v;
-               break;
-       case 4:
-               *(unsigned int *)addr &= (unsigned int)v;
-               break;
-       default:
-               /*
-                * generate an illegal instruction. Cannot catch this with
-                * linker tricks when optimizations are disabled.
-                */
-               __asm__ __volatile__("ud2");
-       }
-       mutex_lock_signal_restore(&__urcu_x86_compat_mutex, &mask);
-}
-
-unsigned long _compat_uatomic_add_return(void *addr, unsigned long v, int len)
-{
-       sigset_t mask;
-       unsigned long result;
-
-       mutex_lock_signal_save(&__urcu_x86_compat_mutex, &mask);
-       switch (len) {
-       case 1:
-               *(unsigned char *)addr += (unsigned char)v;
-               result = *(unsigned char *)addr;
-               break;
-       case 2:
-               *(unsigned short *)addr += (unsigned short)v;
-               result = *(unsigned short *)addr;
-               break;
-       case 4:
-               *(unsigned int *)addr += (unsigned int)v;
-               result = *(unsigned int *)addr;
-               break;
-       default:
-               /*
-                * generate an illegal instruction. Cannot catch this with
-                * linker tricks when optimizations are disabled.
-                */
-               result = 0;     /* silence gcc warnings */
-               __asm__ __volatile__("ud2");
-       }
-       mutex_lock_signal_restore(&__urcu_x86_compat_mutex, &mask);
-       return result;
-}
-
-int __rcu_cas_init(void)
-{
-       if (__rcu_cas_avail < 0)
-               __rcu_cas_avail = compare_and_swap_is_available();
-       return __rcu_cas_avail;
-}
index 9e918fe8e2aac035dc39e6e23868410348d02627..151a40cbae2b9cfa8cc1528d5c7630c6a1c4bcd0 100644 (file)
@@ -1,34 +1,20 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * compat_futex.c
- *
  * Userspace RCU library - sys_futex compatibility code
  * Userspace RCU library - sys_futex compatibility code
- *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <stdio.h>
 #include <pthread.h>
 #include <signal.h>
  */
 
 #include <stdio.h>
 #include <pthread.h>
 #include <signal.h>
-#include <assert.h>
 #include <errno.h>
 #include <poll.h>
 #include <stdint.h>
 
 #include <urcu/arch.h>
 #include <errno.h>
 #include <poll.h>
 #include <stdint.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 #include <urcu/futex.h>
 #include <urcu/system.h>
 
 #include <urcu/futex.h>
 #include <urcu/system.h>
 
@@ -60,9 +46,9 @@ int compat_futex_noasync(int32_t *uaddr, int op, int32_t val,
         * Check if NULL. Don't let users expect that they are taken into
         * account.
         */
         * Check if NULL. Don't let users expect that they are taken into
         * account.
         */
-       assert(!timeout);
-       assert(!uaddr2);
-       assert(!val3);
+       urcu_posix_assert(!timeout);
+       urcu_posix_assert(!uaddr2);
+       urcu_posix_assert(!val3);
 
        /*
         * memory barriers to serialize with the previous uaddr modification.
 
        /*
         * memory barriers to serialize with the previous uaddr modification.
@@ -124,9 +110,9 @@ int compat_futex_async(int32_t *uaddr, int op, int32_t val,
         * Check if NULL. Don't let users expect that they are taken into
         * account.
         */
         * Check if NULL. Don't let users expect that they are taken into
         * account.
         */
-       assert(!timeout);
-       assert(!uaddr2);
-       assert(!val3);
+       urcu_posix_assert(!timeout);
+       urcu_posix_assert(!uaddr2);
+       urcu_posix_assert(!val3);
 
        /*
         * Ensure previous memory operations on uaddr have completed.
 
        /*
         * Ensure previous memory operations on uaddr have completed.
index c974a4768171c7cfa7dfde15566804d18419fc7c..5a2c80f71f347a7994e40310098f13430715dc5c 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * lfstack.c
- *
  * Userspace RCU library - Lock-Free Stack
  * Userspace RCU library - Lock-Free Stack
- *
- * Copyright 2010-2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 /* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
  */
 
 /* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
index c5f2355a78c779ffabbb92dc68d26a5995931715..4f89fc2ea6f5487d724678cf66d97eaee595291c 100644 (file)
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
+
 prefix=@prefix@
 exec_prefix=@exec_prefix@
 libdir=@libdir@
 prefix=@prefix@
 exec_prefix=@exec_prefix@
 libdir=@libdir@
@@ -7,5 +11,5 @@ Name: Userspace RCU BulletProof
 Description: A userspace RCU (read-copy-update) library, bulletproof version
 Version: @PACKAGE_VERSION@
 Requires:
 Description: A userspace RCU (read-copy-update) library, bulletproof version
 Version: @PACKAGE_VERSION@
 Requires:
-Libs: -L${libdir} -lurcu-bp
+Libs: -L${libdir} -lurcu-common -lurcu-bp
 Cflags: -I${includedir} 
 Cflags: -I${includedir} 
index e3d13af038fb2b21c85ec7b7808f0aafaaf12717..945666c5e1cb40564bd7bbaa9aa4979c1966f25c 100644 (file)
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
+
 prefix=@prefix@
 exec_prefix=@exec_prefix@
 libdir=@libdir@
 prefix=@prefix@
 exec_prefix=@exec_prefix@
 libdir=@libdir@
@@ -7,5 +11,5 @@ Name: Userspace RCU Concurrent Data Structures
 Description: Data structures leveraging RCU and atomic operations to provide efficient concurrency-aware storage
 Version: @PACKAGE_VERSION@
 Requires:
 Description: Data structures leveraging RCU and atomic operations to provide efficient concurrency-aware storage
 Version: @PACKAGE_VERSION@
 Requires:
-Libs: -L${libdir} -lurcu-cds
+Libs: -L${libdir} -lurcu-common -lurcu-cds
 Cflags: -I${includedir} 
 Cflags: -I${includedir} 
index cd669ef44b234db1f15777c385ef4cb88a928718..fcd32e056f0a25574a247194a856be1c2d3cdea0 100644 (file)
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
+
 prefix=@prefix@
 exec_prefix=@exec_prefix@
 libdir=@libdir@
 prefix=@prefix@
 exec_prefix=@exec_prefix@
 libdir=@libdir@
@@ -7,5 +11,5 @@ Name: Userspace RCU Memory barriers
 Description: A userspace RCU (read-copy-update) library, memory barriers version
 Version: @PACKAGE_VERSION@
 Requires:
 Description: A userspace RCU (read-copy-update) library, memory barriers version
 Version: @PACKAGE_VERSION@
 Requires:
-Libs: -L${libdir} -lurcu-mb
+Libs: -L${libdir} -lurcu-common -lurcu-mb
 Cflags: -I${includedir} 
 Cflags: -I${includedir} 
diff --git a/src/liburcu-memb.pc.in b/src/liburcu-memb.pc.in
new file mode 100644 (file)
index 0000000..b72008d
--- /dev/null
@@ -0,0 +1,15 @@
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: Userspace RCU membarrier syscall
+Description: A userspace RCU (read-copy-update) library, membarrier syscall version
+Version: @PACKAGE_VERSION@
+Requires:
+Libs: -L${libdir} -lurcu-common -lurcu-memb
+Cflags: -I${includedir}
index 073260212683883075fea3680f09ac1d5f315e3e..2dc69985e103eadd88c426f4ebddf9009aaa9152 100644 (file)
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
+
 prefix=@prefix@
 exec_prefix=@exec_prefix@
 libdir=@libdir@
 prefix=@prefix@
 exec_prefix=@exec_prefix@
 libdir=@libdir@
@@ -7,5 +11,5 @@ Name: Userspace RCU QSBR
 Description: A userspace RCU (read-copy-update) library, quiescent state version
 Version: @PACKAGE_VERSION@
 Requires:
 Description: A userspace RCU (read-copy-update) library, quiescent state version
 Version: @PACKAGE_VERSION@
 Requires:
-Libs: -L${libdir} -lurcu-qsbr
+Libs: -L${libdir} -lurcu-common -lurcu-qsbr
 Cflags: -I${includedir} 
 Cflags: -I${includedir} 
diff --git a/src/liburcu-signal.pc.in b/src/liburcu-signal.pc.in
deleted file mode 100644 (file)
index f9bc3a3..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: Userspace RCU signal
-Description: A userspace RCU (read-copy-update) library, signal version
-Version: @PACKAGE_VERSION@
-Requires:
-Libs: -L${libdir} -lurcu-signal
-Cflags: -I${includedir} 
index 22bf2c8845977532fd6b1c19ade072913e2a0d45..8f738aee78121e571c8097576d92c9d7f1eca433 100644 (file)
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
+
 prefix=@prefix@
 exec_prefix=@exec_prefix@
 libdir=@libdir@
 prefix=@prefix@
 exec_prefix=@exec_prefix@
 libdir=@libdir@
@@ -7,5 +11,5 @@ Name: Userspace RCU
 Description: A userspace RCU (read-copy-update) library, standard version
 Version: @PACKAGE_VERSION@
 Requires:
 Description: A userspace RCU (read-copy-update) library, standard version
 Version: @PACKAGE_VERSION@
 Requires:
-Libs: -L${libdir} -lurcu
+Libs: -L${libdir} -lurcu-common -lurcu
 Cflags: -I${includedir} 
 Cflags: -I${includedir} 
index d29a9232c03e6c42c844d8bfaaf3f63e588c5473..7225ec99e90f27824d71b8647fc4495a2e3f24d3 100644 (file)
@@ -1,33 +1,21 @@
+// SPDX-FileCopyrightText: 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2011 Lai Jiangshan <laijs@cn.fujitsu.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_RCULFHASH_INTERNAL_H
 #define _URCU_RCULFHASH_INTERNAL_H
 
 /*
 #ifndef _URCU_RCULFHASH_INTERNAL_H
 #define _URCU_RCULFHASH_INTERNAL_H
 
 /*
- * urcu/rculfhash-internal.h
- *
  * Internal header for Lock-Free RCU Hash Table
  * Internal header for Lock-Free RCU Hash Table
- *
- * Copyright 2011 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright 2011 - Lai Jiangshan <laijs@cn.fujitsu.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
  */
 
+#include <urcu/assert.h>
 #include <urcu/rculfhash.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <urcu/rculfhash.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <assert.h>
+
+#include "workqueue.h"
 
 #ifdef DEBUG
 #define dbg_printf(fmt, args...)     printf("[debug rculfhash] " fmt, ## args)
 
 #ifdef DEBUG
 #define dbg_printf(fmt, args...)     printf("[debug rculfhash] " fmt, ## args)
@@ -71,6 +59,7 @@ struct cds_lfht {
        /* Initial configuration items */
        unsigned long max_nr_buckets;
        const struct cds_lfht_mm_type *mm;      /* memory management plugin */
        /* Initial configuration items */
        unsigned long max_nr_buckets;
        const struct cds_lfht_mm_type *mm;      /* memory management plugin */
+       const struct cds_lfht_alloc *alloc;     /* memory allocator for mm */
        const struct rcu_flavor_struct *flavor; /* RCU flavor */
 
        long count;                     /* global approximate item count */
        const struct rcu_flavor_struct *flavor; /* RCU flavor */
 
        long count;                     /* global approximate item count */
@@ -82,11 +71,13 @@ struct cds_lfht {
         * therefore cause grace-period deadlock if we hold off RCU G.P.
         * completion.
         */
         * therefore cause grace-period deadlock if we hold off RCU G.P.
         * completion.
         */
-       pthread_mutex_t resize_mutex;   /* resize mutex: add/del mutex */
-       pthread_attr_t *resize_attr;    /* Resize threads attributes */
+       pthread_mutex_t resize_mutex;           /* resize mutex: add/del mutex */
+       pthread_attr_t *caller_resize_attr;     /* resize threads attributes from lfht_new caller */
+       pthread_attr_t resize_attr;
        unsigned int in_progress_destroy;
        unsigned long resize_target;
        int resize_initiated;
        unsigned int in_progress_destroy;
        unsigned long resize_target;
        int resize_initiated;
+       struct urcu_work destroy_work;
 
        /*
         * Variables needed for add and remove fast-paths.
 
        /*
         * Variables needed for add and remove fast-paths.
@@ -149,30 +140,32 @@ extern unsigned int cds_lfht_fls_ulong(unsigned long x);
 extern int cds_lfht_get_count_order_ulong(unsigned long x);
 
 #ifdef POISON_FREE
 extern int cds_lfht_get_count_order_ulong(unsigned long x);
 
 #ifdef POISON_FREE
-#define poison_free(ptr)                                       \
+#define poison_free(alloc, ptr)                                        \
        do {                                                    \
                if (ptr) {                                      \
                        memset(ptr, 0x42, sizeof(*(ptr)));      \
        do {                                                    \
                if (ptr) {                                      \
                        memset(ptr, 0x42, sizeof(*(ptr)));      \
-                       free(ptr);                              \
+                       alloc->free(alloc->state, ptr);                         \
                }                                               \
        } while (0)
 #else
                }                                               \
        } while (0)
 #else
-#define poison_free(ptr)       free(ptr)
+#define poison_free(alloc, ptr)        alloc->free(alloc->state, ptr)
 #endif
 
 static inline
 struct cds_lfht *__default_alloc_cds_lfht(
                const struct cds_lfht_mm_type *mm,
 #endif
 
 static inline
 struct cds_lfht *__default_alloc_cds_lfht(
                const struct cds_lfht_mm_type *mm,
+               const struct cds_lfht_alloc *alloc,
                unsigned long cds_lfht_size,
                unsigned long min_nr_alloc_buckets,
                unsigned long max_nr_buckets)
 {
        struct cds_lfht *ht;
 
                unsigned long cds_lfht_size,
                unsigned long min_nr_alloc_buckets,
                unsigned long max_nr_buckets)
 {
        struct cds_lfht *ht;
 
-       ht = calloc(1, cds_lfht_size);
-       assert(ht);
+       ht = alloc->calloc(alloc->state, 1, cds_lfht_size);
+       urcu_posix_assert(ht);
 
        ht->mm = mm;
 
        ht->mm = mm;
+       ht->alloc = alloc;
        ht->bucket_at = mm->bucket_at;
        ht->min_nr_alloc_buckets = min_nr_alloc_buckets;
        ht->min_alloc_buckets_order =
        ht->bucket_at = mm->bucket_at;
        ht->min_nr_alloc_buckets = min_nr_alloc_buckets;
        ht->min_alloc_buckets_order =
index a7a9b765b4c2c734389b869fc8c4f0ceb7e46281..93931ee7a7e773dbd6fcf92917c6cfac1cfe2306 100644 (file)
@@ -1,42 +1,29 @@
+// SPDX-FileCopyrightText: 2011 Lai Jiangshan <laijs@cn.fujitsu.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * rculfhash-mm-chunk.c
- *
  * Chunk based memory management for Lock-Free RCU Hash Table
  * Chunk based memory management for Lock-Free RCU Hash Table
- *
- * Copyright 2011 - Lai Jiangshan <laijs@cn.fujitsu.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <stddef.h>
  */
 
 #include <stddef.h>
-#include <rculfhash-internal.h>
+#include <urcu/assert.h>
+#include "rculfhash-internal.h"
 
 static
 void cds_lfht_alloc_bucket_table(struct cds_lfht *ht, unsigned long order)
 {
        if (order == 0) {
 
 static
 void cds_lfht_alloc_bucket_table(struct cds_lfht *ht, unsigned long order)
 {
        if (order == 0) {
-               ht->tbl_chunk[0] = calloc(ht->min_nr_alloc_buckets,
-                       sizeof(struct cds_lfht_node));
-               assert(ht->tbl_chunk[0]);
+               ht->tbl_chunk[0] = ht->alloc->calloc(ht->alloc->state,
+                       ht->min_nr_alloc_buckets, sizeof(struct cds_lfht_node));
+               urcu_posix_assert(ht->tbl_chunk[0]);
        } else if (order > ht->min_alloc_buckets_order) {
                unsigned long i, len = 1UL << (order - 1 - ht->min_alloc_buckets_order);
 
                for (i = len; i < 2 * len; i++) {
        } else if (order > ht->min_alloc_buckets_order) {
                unsigned long i, len = 1UL << (order - 1 - ht->min_alloc_buckets_order);
 
                for (i = len; i < 2 * len; i++) {
-                       ht->tbl_chunk[i] = calloc(ht->min_nr_alloc_buckets,
-                               sizeof(struct cds_lfht_node));
-                       assert(ht->tbl_chunk[i]);
+                       ht->tbl_chunk[i] = ht->alloc->calloc(ht->alloc->state,
+                               ht->min_nr_alloc_buckets, sizeof(struct cds_lfht_node));
+                       urcu_posix_assert(ht->tbl_chunk[i]);
                }
        }
        /* Nothing to do for 0 < order && order <= ht->min_alloc_buckets_order */
                }
        }
        /* Nothing to do for 0 < order && order <= ht->min_alloc_buckets_order */
@@ -51,12 +38,12 @@ static
 void cds_lfht_free_bucket_table(struct cds_lfht *ht, unsigned long order)
 {
        if (order == 0)
 void cds_lfht_free_bucket_table(struct cds_lfht *ht, unsigned long order)
 {
        if (order == 0)
-               poison_free(ht->tbl_chunk[0]);
+               poison_free(ht->alloc, ht->tbl_chunk[0]);
        else if (order > ht->min_alloc_buckets_order) {
                unsigned long i, len = 1UL << (order - 1 - ht->min_alloc_buckets_order);
 
                for (i = len; i < 2 * len; i++)
        else if (order > ht->min_alloc_buckets_order) {
                unsigned long i, len = 1UL << (order - 1 - ht->min_alloc_buckets_order);
 
                for (i = len; i < 2 * len; i++)
-                       poison_free(ht->tbl_chunk[i]);
+                       poison_free(ht->alloc, ht->tbl_chunk[i]);
        }
        /* Nothing to do for 0 < order && order <= ht->min_alloc_buckets_order */
 }
        }
        /* Nothing to do for 0 < order && order <= ht->min_alloc_buckets_order */
 }
@@ -73,7 +60,7 @@ struct cds_lfht_node *bucket_at(struct cds_lfht *ht, unsigned long index)
 
 static
 struct cds_lfht *alloc_cds_lfht(unsigned long min_nr_alloc_buckets,
 
 static
 struct cds_lfht *alloc_cds_lfht(unsigned long min_nr_alloc_buckets,
-               unsigned long max_nr_buckets)
+               unsigned long max_nr_buckets, const struct cds_lfht_alloc *alloc)
 {
        unsigned long nr_chunks, cds_lfht_size;
 
 {
        unsigned long nr_chunks, cds_lfht_size;
 
@@ -85,7 +72,7 @@ struct cds_lfht *alloc_cds_lfht(unsigned long min_nr_alloc_buckets,
        cds_lfht_size = max(cds_lfht_size, sizeof(struct cds_lfht));
 
        return __default_alloc_cds_lfht(
        cds_lfht_size = max(cds_lfht_size, sizeof(struct cds_lfht));
 
        return __default_alloc_cds_lfht(
-                       &cds_lfht_mm_chunk, cds_lfht_size,
+                       &cds_lfht_mm_chunk, alloc, cds_lfht_size,
                        min_nr_alloc_buckets, max_nr_buckets);
 }
 
                        min_nr_alloc_buckets, max_nr_buckets);
 }
 
index 72333a866da098a7107cde22a666ac6c36b84d41..2b4bc421bae0d48050c1b93e942b8c303069b2ee 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2011 Lai Jiangshan <laijs@cn.fujitsu.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * rculfhash-mm-mmap.c
- *
  * mmap/reservation based memory management for Lock-Free RCU Hash Table
  * mmap/reservation based memory management for Lock-Free RCU Hash Table
- *
- * Copyright 2011 - Lai Jiangshan <laijs@cn.fujitsu.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <unistd.h>
  */
 
 #include <unistd.h>
@@ -25,6 +11,7 @@
 #include <errno.h>
 #include <stdlib.h>
 #include <sys/mman.h>
 #include <errno.h>
 #include <stdlib.h>
 #include <sys/mman.h>
+#include <urcu/assert.h>
 #include "rculfhash-internal.h"
 
 #ifndef MAP_ANONYMOUS
 #include "rculfhash-internal.h"
 
 #ifndef MAP_ANONYMOUS
@@ -131,9 +118,9 @@ void cds_lfht_alloc_bucket_table(struct cds_lfht *ht, unsigned long order)
        if (order == 0) {
                if (ht->min_nr_alloc_buckets == ht->max_nr_buckets) {
                        /* small table */
        if (order == 0) {
                if (ht->min_nr_alloc_buckets == ht->max_nr_buckets) {
                        /* small table */
-                       ht->tbl_mmap = calloc(ht->max_nr_buckets,
-                                       sizeof(*ht->tbl_mmap));
-                       assert(ht->tbl_mmap);
+                       ht->tbl_mmap = ht->alloc->calloc(ht->alloc->state,
+                                       ht->max_nr_buckets, sizeof(*ht->tbl_mmap));
+                       urcu_posix_assert(ht->tbl_mmap);
                        return;
                }
                /* large table */
                        return;
                }
                /* large table */
@@ -145,7 +132,7 @@ void cds_lfht_alloc_bucket_table(struct cds_lfht *ht, unsigned long order)
                /* large table */
                unsigned long len = 1UL << (order - 1);
 
                /* large table */
                unsigned long len = 1UL << (order - 1);
 
-               assert(ht->min_nr_alloc_buckets < ht->max_nr_buckets);
+               urcu_posix_assert(ht->min_nr_alloc_buckets < ht->max_nr_buckets);
                memory_populate(ht->tbl_mmap + len,
                                len * sizeof(*ht->tbl_mmap));
        }
                memory_populate(ht->tbl_mmap + len,
                                len * sizeof(*ht->tbl_mmap));
        }
@@ -163,7 +150,7 @@ void cds_lfht_free_bucket_table(struct cds_lfht *ht, unsigned long order)
        if (order == 0) {
                if (ht->min_nr_alloc_buckets == ht->max_nr_buckets) {
                        /* small table */
        if (order == 0) {
                if (ht->min_nr_alloc_buckets == ht->max_nr_buckets) {
                        /* small table */
-                       poison_free(ht->tbl_mmap);
+                       poison_free(ht->alloc, ht->tbl_mmap);
                        return;
                }
                /* large table */
                        return;
                }
                /* large table */
@@ -173,7 +160,7 @@ void cds_lfht_free_bucket_table(struct cds_lfht *ht, unsigned long order)
                /* large table */
                unsigned long len = 1UL << (order - 1);
 
                /* large table */
                unsigned long len = 1UL << (order - 1);
 
-               assert(ht->min_nr_alloc_buckets < ht->max_nr_buckets);
+               urcu_posix_assert(ht->min_nr_alloc_buckets < ht->max_nr_buckets);
                memory_discard(ht->tbl_mmap + len, len * sizeof(*ht->tbl_mmap));
        }
        /* Nothing to do for 0 < order && order <= ht->min_alloc_buckets_order */
                memory_discard(ht->tbl_mmap + len, len * sizeof(*ht->tbl_mmap));
        }
        /* Nothing to do for 0 < order && order <= ht->min_alloc_buckets_order */
@@ -187,7 +174,7 @@ struct cds_lfht_node *bucket_at(struct cds_lfht *ht, unsigned long index)
 
 static
 struct cds_lfht *alloc_cds_lfht(unsigned long min_nr_alloc_buckets,
 
 static
 struct cds_lfht *alloc_cds_lfht(unsigned long min_nr_alloc_buckets,
-               unsigned long max_nr_buckets)
+               unsigned long max_nr_buckets, const struct cds_lfht_alloc *alloc)
 {
        unsigned long page_bucket_size;
 
 {
        unsigned long page_bucket_size;
 
@@ -202,7 +189,7 @@ struct cds_lfht *alloc_cds_lfht(unsigned long min_nr_alloc_buckets,
        }
 
        return __default_alloc_cds_lfht(
        }
 
        return __default_alloc_cds_lfht(
-                       &cds_lfht_mm_mmap, sizeof(struct cds_lfht),
+                       &cds_lfht_mm_mmap, alloc, sizeof(struct cds_lfht),
                        min_nr_alloc_buckets, max_nr_buckets);
 }
 
                        min_nr_alloc_buckets, max_nr_buckets);
 }
 
index 20f3edd8ce37cf9a5abe88e18264ec1102759b53..2b0f707ef05ca77703e9de6c19cb55f5068cb948 100644 (file)
@@ -1,39 +1,26 @@
+// SPDX-FileCopyrightText: 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2011 Lai Jiangshan <laijs@cn.fujitsu.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * rculfhash-mm-order.c
- *
  * Order based memory management for Lock-Free RCU Hash Table
  * Order based memory management for Lock-Free RCU Hash Table
- *
- * Copyright 2011 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright 2011 - Lai Jiangshan <laijs@cn.fujitsu.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
  */
 
-#include <rculfhash-internal.h>
+#include <urcu/assert.h>
+#include "rculfhash-internal.h"
 
 static
 void cds_lfht_alloc_bucket_table(struct cds_lfht *ht, unsigned long order)
 {
        if (order == 0) {
 
 static
 void cds_lfht_alloc_bucket_table(struct cds_lfht *ht, unsigned long order)
 {
        if (order == 0) {
-               ht->tbl_order[0] = calloc(ht->min_nr_alloc_buckets,
-                       sizeof(struct cds_lfht_node));
-               assert(ht->tbl_order[0]);
+               ht->tbl_order[0] = ht->alloc->calloc(ht->alloc->state,
+                       ht->min_nr_alloc_buckets, sizeof(struct cds_lfht_node));
+               urcu_posix_assert(ht->tbl_order[0]);
        } else if (order > ht->min_alloc_buckets_order) {
        } else if (order > ht->min_alloc_buckets_order) {
-               ht->tbl_order[order] = calloc(1UL << (order -1),
-                       sizeof(struct cds_lfht_node));
-               assert(ht->tbl_order[order]);
+               ht->tbl_order[order] = ht->alloc->calloc(ht->alloc->state,
+                       1UL << (order -1), sizeof(struct cds_lfht_node));
+               urcu_posix_assert(ht->tbl_order[order]);
        }
        /* Nothing to do for 0 < order && order <= ht->min_alloc_buckets_order */
 }
        }
        /* Nothing to do for 0 < order && order <= ht->min_alloc_buckets_order */
 }
@@ -47,9 +34,9 @@ static
 void cds_lfht_free_bucket_table(struct cds_lfht *ht, unsigned long order)
 {
        if (order == 0)
 void cds_lfht_free_bucket_table(struct cds_lfht *ht, unsigned long order)
 {
        if (order == 0)
-               poison_free(ht->tbl_order[0]);
+               poison_free(ht->alloc, ht->tbl_order[0]);
        else if (order > ht->min_alloc_buckets_order)
        else if (order > ht->min_alloc_buckets_order)
-               poison_free(ht->tbl_order[order]);
+               poison_free(ht->alloc, ht->tbl_order[order]);
        /* Nothing to do for 0 < order && order <= ht->min_alloc_buckets_order */
 }
 
        /* Nothing to do for 0 < order && order <= ht->min_alloc_buckets_order */
 }
 
@@ -75,10 +62,10 @@ struct cds_lfht_node *bucket_at(struct cds_lfht *ht, unsigned long index)
 
 static
 struct cds_lfht *alloc_cds_lfht(unsigned long min_nr_alloc_buckets,
 
 static
 struct cds_lfht *alloc_cds_lfht(unsigned long min_nr_alloc_buckets,
-               unsigned long max_nr_buckets)
+               unsigned long max_nr_buckets, const struct cds_lfht_alloc *alloc)
 {
        return __default_alloc_cds_lfht(
 {
        return __default_alloc_cds_lfht(
-                       &cds_lfht_mm_order, sizeof(struct cds_lfht),
+                       &cds_lfht_mm_order, alloc, sizeof(struct cds_lfht),
                        min_nr_alloc_buckets, max_nr_buckets);
 }
 
                        min_nr_alloc_buckets, max_nr_buckets);
 }
 
index 51972c8d1b318c618776a8d0b4b26e5373b9dbae..10f5b8ed58a89c687421b72e513e218492299a0c 100644 (file)
@@ -1,24 +1,10 @@
+// SPDX-FileCopyrightText: 2010-2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2011 Lai Jiangshan <laijs@cn.fujitsu.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * rculfhash.c
- *
  * Userspace RCU library - Lock-Free Resizable RCU Hash Table
  * Userspace RCU library - Lock-Free Resizable RCU Hash Table
- *
- * Copyright 2010-2011 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright 2011 - Lai Jiangshan <laijs@cn.fujitsu.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 /*
  */
 
 /*
 #define _LGPL_SOURCE
 #include <stdlib.h>
 #include <errno.h>
 #define _LGPL_SOURCE
 #include <stdlib.h>
 #include <errno.h>
-#include <assert.h>
 #include <stdio.h>
 #include <stdint.h>
 #include <string.h>
 #include <sched.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <stdint.h>
 #include <string.h>
 #include <sched.h>
 #include <unistd.h>
+#include <stdlib.h>
 
 #include "compat-getcpu.h"
 
 #include "compat-getcpu.h"
+#include <urcu/assert.h>
 #include <urcu/pointer.h>
 #include <urcu/call-rcu.h>
 #include <urcu/flavor.h>
 #include <urcu/pointer.h>
 #include <urcu/call-rcu.h>
 #include <urcu/flavor.h>
 #include <urcu/uatomic.h>
 #include <urcu/compiler.h>
 #include <urcu/rculfhash.h>
 #include <urcu/uatomic.h>
 #include <urcu/compiler.h>
 #include <urcu/rculfhash.h>
-#include <urcu/static/urcu-signal-nr.h>
-#include <rculfhash-internal.h>
 #include <stdio.h>
 #include <pthread.h>
 #include <signal.h>
 #include <stdio.h>
 #include <pthread.h>
 #include <signal.h>
+#include "rculfhash-internal.h"
 #include "workqueue.h"
 #include "urcu-die.h"
 #include "urcu-utils.h"
 #include "workqueue.h"
 #include "urcu-die.h"
 #include "urcu-utils.h"
+#include "compat-smp.h"
 
 /*
  * Split-counters lazily update the global counter each 1024
 
 /*
  * Split-counters lazily update the global counter each 1024
@@ -361,8 +348,12 @@ struct partition_resize_work {
                    unsigned long start, unsigned long len);
 };
 
                    unsigned long start, unsigned long len);
 };
 
+enum nr_cpus_mask_state {
+       NR_CPUS_MASK_INIT_FAILED = -2,
+       NR_CPUS_MASK_UNINITIALIZED = -1,
+};
+
 static struct urcu_workqueue *cds_lfht_workqueue;
 static struct urcu_workqueue *cds_lfht_workqueue;
-static unsigned long cds_lfht_workqueue_user_count;
 
 /*
  * Mutex ensuring mutual exclusion between workqueue initialization and
 
 /*
  * Mutex ensuring mutual exclusion between workqueue initialization and
@@ -379,8 +370,8 @@ static struct urcu_atfork cds_lfht_atfork;
  */
 static int cds_lfht_workqueue_atfork_nesting;
 
  */
 static int cds_lfht_workqueue_atfork_nesting;
 
+static void __attribute__((destructor)) cds_lfht_exit(void);
 static void cds_lfht_init_worker(const struct rcu_flavor_struct *flavor);
 static void cds_lfht_init_worker(const struct rcu_flavor_struct *flavor);
-static void cds_lfht_fini_worker(const struct rcu_flavor_struct *flavor);
 
 #ifdef CONFIG_CDS_LFHT_ITER_DEBUG
 
 
 #ifdef CONFIG_CDS_LFHT_ITER_DEBUG
 
@@ -390,12 +381,13 @@ void cds_lfht_iter_debug_set_ht(struct cds_lfht *ht, struct cds_lfht_iter *iter)
        iter->lfht = ht;
 }
 
        iter->lfht = ht;
 }
 
-#define cds_lfht_iter_debug_assert(...)                assert(__VA_ARGS__)
+#define cds_lfht_iter_debug_assert(...)                urcu_posix_assert(__VA_ARGS__)
 
 #else
 
 static
 
 #else
 
 static
-void cds_lfht_iter_debug_set_ht(struct cds_lfht *ht, struct cds_lfht_iter *iter)
+void cds_lfht_iter_debug_set_ht(struct cds_lfht *ht __attribute__((unused)),
+               struct cds_lfht_iter *iter __attribute__((unused)))
 {
 }
 
 {
 }
 
@@ -467,7 +459,7 @@ unsigned long bit_reverse_ulong(unsigned long v)
  * Returns 0 if no bit is set, else returns the position of the most
  * significant bit (from 1 to 32 on 32-bit, from 1 to 64 on 64-bit).
  */
  * Returns 0 if no bit is set, else returns the position of the most
  * significant bit (from 1 to 32 on 32-bit, from 1 to 64 on 64-bit).
  */
-#if defined(__i386) || defined(__x86_64)
+#if defined(URCU_ARCH_X86)
 static inline
 unsigned int fls_u32(uint32_t x)
 {
 static inline
 unsigned int fls_u32(uint32_t x)
 {
@@ -483,7 +475,7 @@ unsigned int fls_u32(uint32_t x)
 #define HAS_FLS_U32
 #endif
 
 #define HAS_FLS_U32
 #endif
 
-#if defined(__x86_64)
+#if defined(URCU_ARCH_AMD64)
 static inline
 unsigned int fls_u64(uint64_t x)
 {
 static inline
 unsigned int fls_u64(uint64_t x)
 {
@@ -577,10 +569,55 @@ unsigned int cds_lfht_fls_ulong(unsigned long x)
 #endif
 }
 
 #endif
 }
 
+static void *cds_lfht_malloc(void *state __attribute__((unused)),
+               size_t size)
+{
+       return malloc(size);
+}
+
+static void *cds_lfht_calloc(void *state __attribute__((unused)),
+               size_t nmemb, size_t size)
+{
+       return calloc(nmemb, size);
+}
+
+static void *cds_lfht_realloc(void *state __attribute__((unused)),
+               void *ptr, size_t size)
+{
+       return realloc(ptr, size);
+}
+
+static void *cds_lfht_aligned_alloc(void *state __attribute__((unused)),
+               size_t alignment, size_t size)
+{
+       void *ptr;
+
+       if (posix_memalign(&ptr, alignment, size))
+               return NULL;
+       return ptr;
+}
+
+static void cds_lfht_free(void *state __attribute__((unused)), void *ptr)
+{
+       free(ptr);
+}
+
+
+/* Default memory allocator */
+static struct cds_lfht_alloc cds_lfht_default_alloc = {
+       .malloc = cds_lfht_malloc,
+       .calloc = cds_lfht_calloc,
+       .realloc = cds_lfht_realloc,
+       .aligned_alloc = cds_lfht_aligned_alloc,
+       .free = cds_lfht_free,
+       .state = NULL,
+};
+
 /*
  * Return the minimum order for which x <= (1UL << order).
  * Return -1 if x is 0.
  */
 /*
  * Return the minimum order for which x <= (1UL << order).
  * Return -1 if x is 0.
  */
+static
 int cds_lfht_get_count_order_u32(uint32_t x)
 {
        if (!x)
 int cds_lfht_get_count_order_u32(uint32_t x)
 {
        if (!x)
@@ -621,9 +658,7 @@ static void mutex_lock(pthread_mutex_t *mutex)
                if (ret != EBUSY && ret != EINTR)
                        urcu_die(ret);
                if (CMM_LOAD_SHARED(URCU_TLS(rcu_reader).need_mb)) {
                if (ret != EBUSY && ret != EINTR)
                        urcu_die(ret);
                if (CMM_LOAD_SHARED(URCU_TLS(rcu_reader).need_mb)) {
-                       cmm_smp_mb();
-                       _CMM_STORE_SHARED(URCU_TLS(rcu_reader).need_mb, 0);
-                       cmm_smp_mb();
+                       uatomic_store(&URCU_TLS(rcu_reader).need_mb, 0, CMM_SEQ_CST);
                }
                (void) poll(NULL, 0, 10);
        }
                }
                (void) poll(NULL, 0, 10);
        }
@@ -639,18 +674,17 @@ static void mutex_unlock(pthread_mutex_t *mutex)
                urcu_die(ret);
 }
 
                urcu_die(ret);
 }
 
-static long nr_cpus_mask = -1;
+static long nr_cpus_mask = NR_CPUS_MASK_UNINITIALIZED;
 static long split_count_mask = -1;
 static int split_count_order = -1;
 
 static long split_count_mask = -1;
 static int split_count_order = -1;
 
-#if defined(HAVE_SYSCONF)
 static void ht_init_nr_cpus_mask(void)
 {
        long maxcpus;
 
 static void ht_init_nr_cpus_mask(void)
 {
        long maxcpus;
 
-       maxcpus = sysconf(_SC_NPROCESSORS_CONF);
+       maxcpus = get_possible_cpus_array_len();
        if (maxcpus <= 0) {
        if (maxcpus <= 0) {
-               nr_cpus_mask = -2;
+               nr_cpus_mask = NR_CPUS_MASK_INIT_FAILED;
                return;
        }
        /*
                return;
        }
        /*
@@ -660,17 +694,11 @@ static void ht_init_nr_cpus_mask(void)
        maxcpus = 1UL << cds_lfht_get_count_order_ulong(maxcpus);
        nr_cpus_mask = maxcpus - 1;
 }
        maxcpus = 1UL << cds_lfht_get_count_order_ulong(maxcpus);
        nr_cpus_mask = maxcpus - 1;
 }
-#else /* #if defined(HAVE_SYSCONF) */
-static void ht_init_nr_cpus_mask(void)
-{
-       nr_cpus_mask = -2;
-}
-#endif /* #else #if defined(HAVE_SYSCONF) */
 
 static
 void alloc_split_items_count(struct cds_lfht *ht)
 {
 
 static
 void alloc_split_items_count(struct cds_lfht *ht)
 {
-       if (nr_cpus_mask == -1) {
+       if (nr_cpus_mask == NR_CPUS_MASK_UNINITIALIZED) {
                ht_init_nr_cpus_mask();
                if (nr_cpus_mask < 0)
                        split_count_mask = DEFAULT_SPLIT_COUNT_MASK;
                ht_init_nr_cpus_mask();
                if (nr_cpus_mask < 0)
                        split_count_mask = DEFAULT_SPLIT_COUNT_MASK;
@@ -680,12 +708,12 @@ void alloc_split_items_count(struct cds_lfht *ht)
                        cds_lfht_get_count_order_ulong(split_count_mask + 1);
        }
 
                        cds_lfht_get_count_order_ulong(split_count_mask + 1);
        }
 
-       assert(split_count_mask >= 0);
+       urcu_posix_assert(split_count_mask >= 0);
 
        if (ht->flags & CDS_LFHT_ACCOUNTING) {
 
        if (ht->flags & CDS_LFHT_ACCOUNTING) {
-               ht->split_count = calloc(split_count_mask + 1,
+               ht->split_count = ht->alloc->calloc(ht->alloc->state, split_count_mask + 1,
                                        sizeof(struct ht_items_count));
                                        sizeof(struct ht_items_count));
-               assert(ht->split_count);
+               urcu_posix_assert(ht->split_count);
        } else {
                ht->split_count = NULL;
        }
        } else {
                ht->split_count = NULL;
        }
@@ -694,7 +722,7 @@ void alloc_split_items_count(struct cds_lfht *ht)
 static
 void free_split_items_count(struct cds_lfht *ht)
 {
 static
 void free_split_items_count(struct cds_lfht *ht)
 {
-       poison_free(ht->split_count);
+       poison_free(ht->alloc, ht->split_count);
 }
 
 static
 }
 
 static
@@ -702,7 +730,7 @@ int ht_get_split_count_index(unsigned long hash)
 {
        int cpu;
 
 {
        int cpu;
 
-       assert(split_count_mask >= 0);
+       urcu_posix_assert(split_count_mask >= 0);
        cpu = urcu_sched_getcpu();
        if (caa_unlikely(cpu < 0))
                return hash & split_count_mask;
        cpu = urcu_sched_getcpu();
        if (caa_unlikely(cpu < 0))
                return hash & split_count_mask;
@@ -761,7 +789,7 @@ void ht_count_del(struct cds_lfht *ht, unsigned long size, unsigned long hash)
 
        if ((count >> CHAIN_LEN_RESIZE_THRESHOLD) >= size)
                return;
 
        if ((count >> CHAIN_LEN_RESIZE_THRESHOLD) >= size)
                return;
-       dbg_printf("del set global %ld\n", count);
+       dbg_printf("del set global %lu\n", count);
        /*
         * Don't shrink table if the number of nodes is below a
         * certain threshold.
        /*
         * Don't shrink table if the number of nodes is below a
         * certain threshold.
@@ -849,6 +877,12 @@ int is_removal_owner(struct cds_lfht_node *node)
        return ((unsigned long) node) & REMOVAL_OWNER_FLAG;
 }
 
        return ((unsigned long) node) & REMOVAL_OWNER_FLAG;
 }
 
+static
+struct cds_lfht_node *flag_removed(struct cds_lfht_node *node)
+{
+       return (struct cds_lfht_node *) (((unsigned long) node) | REMOVED_FLAG);
+}
+
 static
 struct cds_lfht_node *flag_removal_owner(struct cds_lfht_node *node)
 {
 static
 struct cds_lfht_node *flag_removal_owner(struct cds_lfht_node *node)
 {
@@ -882,8 +916,10 @@ unsigned long _uatomic_xchg_monotonic_increase(unsigned long *ptr,
        old1 = uatomic_read(ptr);
        do {
                old2 = old1;
        old1 = uatomic_read(ptr);
        do {
                old2 = old1;
-               if (old2 >= v)
+               if (old2 >= v) {
+                       cmm_smp_mb();
                        return old2;
                        return old2;
+               }
        } while ((old1 = uatomic_cmpxchg(ptr, old2, v)) != old2);
        return old2;
 }
        } while ((old1 = uatomic_cmpxchg(ptr, old2, v)) != old2);
        return old2;
 }
@@ -915,7 +951,7 @@ static inline
 struct cds_lfht_node *lookup_bucket(struct cds_lfht *ht, unsigned long size,
                unsigned long hash)
 {
 struct cds_lfht_node *lookup_bucket(struct cds_lfht *ht, unsigned long size,
                unsigned long hash)
 {
-       assert(size > 0);
+       urcu_posix_assert(size > 0);
        return bucket_at(ht, hash & (size - 1));
 }
 
        return bucket_at(ht, hash & (size - 1));
 }
 
@@ -927,26 +963,26 @@ void _cds_lfht_gc_bucket(struct cds_lfht_node *bucket, struct cds_lfht_node *nod
 {
        struct cds_lfht_node *iter_prev, *iter, *next, *new_next;
 
 {
        struct cds_lfht_node *iter_prev, *iter, *next, *new_next;
 
-       assert(!is_bucket(bucket));
-       assert(!is_removed(bucket));
-       assert(!is_removal_owner(bucket));
-       assert(!is_bucket(node));
-       assert(!is_removed(node));
-       assert(!is_removal_owner(node));
+       urcu_posix_assert(!is_bucket(bucket));
+       urcu_posix_assert(!is_removed(bucket));
+       urcu_posix_assert(!is_removal_owner(bucket));
+       urcu_posix_assert(!is_bucket(node));
+       urcu_posix_assert(!is_removed(node));
+       urcu_posix_assert(!is_removal_owner(node));
        for (;;) {
                iter_prev = bucket;
                /* We can always skip the bucket node initially */
                iter = rcu_dereference(iter_prev->next);
        for (;;) {
                iter_prev = bucket;
                /* We can always skip the bucket node initially */
                iter = rcu_dereference(iter_prev->next);
-               assert(!is_removed(iter));
-               assert(!is_removal_owner(iter));
-               assert(iter_prev->reverse_hash <= node->reverse_hash);
+               urcu_posix_assert(!is_removed(iter));
+               urcu_posix_assert(!is_removal_owner(iter));
+               urcu_posix_assert(iter_prev->reverse_hash <= node->reverse_hash);
                /*
                 * We should never be called with bucket (start of chain)
                 * and logically removed node (end of path compression
                 * marker) being the actual same node. This would be a
                 * bug in the algorithm implementation.
                 */
                /*
                 * We should never be called with bucket (start of chain)
                 * and logically removed node (end of path compression
                 * marker) being the actual same node. This would be a
                 * bug in the algorithm implementation.
                 */
-               assert(bucket != node);
+               urcu_posix_assert(bucket != node);
                for (;;) {
                        if (caa_unlikely(is_end(iter)))
                                return;
                for (;;) {
                        if (caa_unlikely(is_end(iter)))
                                return;
@@ -958,8 +994,8 @@ void _cds_lfht_gc_bucket(struct cds_lfht_node *bucket, struct cds_lfht_node *nod
                        iter_prev = clear_flag(iter);
                        iter = next;
                }
                        iter_prev = clear_flag(iter);
                        iter = next;
                }
-               assert(!is_removed(iter));
-               assert(!is_removal_owner(iter));
+               urcu_posix_assert(!is_removed(iter));
+               urcu_posix_assert(!is_removal_owner(iter));
                if (is_bucket(iter))
                        new_next = flag_bucket(clear_flag(next));
                else
                if (is_bucket(iter))
                        new_next = flag_bucket(clear_flag(next));
                else
@@ -979,13 +1015,13 @@ int _cds_lfht_replace(struct cds_lfht *ht, unsigned long size,
        if (!old_node)  /* Return -ENOENT if asked to replace NULL node */
                return -ENOENT;
 
        if (!old_node)  /* Return -ENOENT if asked to replace NULL node */
                return -ENOENT;
 
-       assert(!is_removed(old_node));
-       assert(!is_removal_owner(old_node));
-       assert(!is_bucket(old_node));
-       assert(!is_removed(new_node));
-       assert(!is_removal_owner(new_node));
-       assert(!is_bucket(new_node));
-       assert(new_node != old_node);
+       urcu_posix_assert(!is_removed(old_node));
+       urcu_posix_assert(!is_removal_owner(old_node));
+       urcu_posix_assert(!is_bucket(old_node));
+       urcu_posix_assert(!is_removed(new_node));
+       urcu_posix_assert(!is_removal_owner(new_node));
+       urcu_posix_assert(!is_bucket(new_node));
+       urcu_posix_assert(new_node != old_node);
        for (;;) {
                /* Insert after node to be replaced */
                if (is_removed(old_next)) {
        for (;;) {
                /* Insert after node to be replaced */
                if (is_removed(old_next)) {
@@ -995,14 +1031,14 @@ int _cds_lfht_replace(struct cds_lfht *ht, unsigned long size,
                         */
                        return -ENOENT;
                }
                         */
                        return -ENOENT;
                }
-               assert(old_next == clear_flag(old_next));
-               assert(new_node != old_next);
+               urcu_posix_assert(old_next == clear_flag(old_next));
+               urcu_posix_assert(new_node != old_next);
                /*
                 * REMOVAL_OWNER flag is _NEVER_ set before the REMOVED
                 * flag. It is either set atomically at the same time
                 * (replace) or after (del).
                 */
                /*
                 * REMOVAL_OWNER flag is _NEVER_ set before the REMOVED
                 * flag. It is either set atomically at the same time
                 * (replace) or after (del).
                 */
-               assert(!is_removal_owner(old_next));
+               urcu_posix_assert(!is_removal_owner(old_next));
                new_node->next = old_next;
                /*
                 * Here is the whole trick for lock-free replace: we add
                new_node->next = old_next;
                /*
                 * Here is the whole trick for lock-free replace: we add
@@ -1034,7 +1070,7 @@ int _cds_lfht_replace(struct cds_lfht *ht, unsigned long size,
        bucket = lookup_bucket(ht, size, bit_reverse_ulong(old_node->reverse_hash));
        _cds_lfht_gc_bucket(bucket, new_node);
 
        bucket = lookup_bucket(ht, size, bit_reverse_ulong(old_node->reverse_hash));
        _cds_lfht_gc_bucket(bucket, new_node);
 
-       assert(is_removed(CMM_LOAD_SHARED(old_node->next)));
+       urcu_posix_assert(is_removed(CMM_LOAD_SHARED(old_node->next)));
        return 0;
 }
 
        return 0;
 }
 
@@ -1056,9 +1092,9 @@ void _cds_lfht_add(struct cds_lfht *ht,
                        *return_node;
        struct cds_lfht_node *bucket;
 
                        *return_node;
        struct cds_lfht_node *bucket;
 
-       assert(!is_bucket(node));
-       assert(!is_removed(node));
-       assert(!is_removal_owner(node));
+       urcu_posix_assert(!is_bucket(node));
+       urcu_posix_assert(!is_removed(node));
+       urcu_posix_assert(!is_removal_owner(node));
        bucket = lookup_bucket(ht, size, hash);
        for (;;) {
                uint32_t chain_len = 0;
        bucket = lookup_bucket(ht, size, hash);
        for (;;) {
                uint32_t chain_len = 0;
@@ -1070,7 +1106,7 @@ void _cds_lfht_add(struct cds_lfht *ht,
                iter_prev = bucket;
                /* We can always skip the bucket node initially */
                iter = rcu_dereference(iter_prev->next);
                iter_prev = bucket;
                /* We can always skip the bucket node initially */
                iter = rcu_dereference(iter_prev->next);
-               assert(iter_prev->reverse_hash <= node->reverse_hash);
+               urcu_posix_assert(iter_prev->reverse_hash <= node->reverse_hash);
                for (;;) {
                        if (caa_unlikely(is_end(iter)))
                                goto insert;
                for (;;) {
                        if (caa_unlikely(is_end(iter)))
                                goto insert;
@@ -1123,12 +1159,12 @@ void _cds_lfht_add(struct cds_lfht *ht,
                }
 
        insert:
                }
 
        insert:
-               assert(node != clear_flag(iter));
-               assert(!is_removed(iter_prev));
-               assert(!is_removal_owner(iter_prev));
-               assert(!is_removed(iter));
-               assert(!is_removal_owner(iter));
-               assert(iter_prev != node);
+               urcu_posix_assert(node != clear_flag(iter));
+               urcu_posix_assert(!is_removed(iter_prev));
+               urcu_posix_assert(!is_removal_owner(iter_prev));
+               urcu_posix_assert(!is_removed(iter));
+               urcu_posix_assert(!is_removal_owner(iter));
+               urcu_posix_assert(iter_prev != node);
                if (!bucket_flag)
                        node->next = clear_flag(iter);
                else
                if (!bucket_flag)
                        node->next = clear_flag(iter);
                else
@@ -1146,8 +1182,8 @@ void _cds_lfht_add(struct cds_lfht *ht,
                }
 
        gc_node:
                }
 
        gc_node:
-               assert(!is_removed(iter));
-               assert(!is_removal_owner(iter));
+               urcu_posix_assert(!is_removed(iter));
+               urcu_posix_assert(!is_removal_owner(iter));
                if (is_bucket(iter))
                        new_next = flag_bucket(clear_flag(next));
                else
                if (is_bucket(iter))
                        new_next = flag_bucket(clear_flag(next));
                else
@@ -1167,14 +1203,15 @@ int _cds_lfht_del(struct cds_lfht *ht, unsigned long size,
                struct cds_lfht_node *node)
 {
        struct cds_lfht_node *bucket, *next;
                struct cds_lfht_node *node)
 {
        struct cds_lfht_node *bucket, *next;
+       uintptr_t *node_next;
 
        if (!node)      /* Return -ENOENT if asked to delete NULL node */
                return -ENOENT;
 
        /* logically delete the node */
 
        if (!node)      /* Return -ENOENT if asked to delete NULL node */
                return -ENOENT;
 
        /* logically delete the node */
-       assert(!is_bucket(node));
-       assert(!is_removed(node));
-       assert(!is_removal_owner(node));
+       urcu_posix_assert(!is_bucket(node));
+       urcu_posix_assert(!is_removed(node));
+       urcu_posix_assert(!is_removal_owner(node));
 
        /*
         * We are first checking if the node had previously been
 
        /*
         * We are first checking if the node had previously been
@@ -1185,19 +1222,22 @@ int _cds_lfht_del(struct cds_lfht *ht, unsigned long size,
        next = CMM_LOAD_SHARED(node->next);     /* next is not dereferenced */
        if (caa_unlikely(is_removed(next)))
                return -ENOENT;
        next = CMM_LOAD_SHARED(node->next);     /* next is not dereferenced */
        if (caa_unlikely(is_removed(next)))
                return -ENOENT;
-       assert(!is_bucket(next));
+       urcu_posix_assert(!is_bucket(next));
        /*
         * The del operation semantic guarantees a full memory barrier
         * before the uatomic_or atomic commit of the deletion flag.
        /*
         * The del operation semantic guarantees a full memory barrier
         * before the uatomic_or atomic commit of the deletion flag.
-        */
-       cmm_smp_mb__before_uatomic_or();
-       /*
+        *
         * We set the REMOVED_FLAG unconditionally. Note that there may
         * be more than one concurrent thread setting this flag.
         * Knowing which wins the race will be known after the garbage
         * collection phase, stay tuned!
         * We set the REMOVED_FLAG unconditionally. Note that there may
         * be more than one concurrent thread setting this flag.
         * Knowing which wins the race will be known after the garbage
         * collection phase, stay tuned!
+        *
+        * NOTE: The node_next variable is present to avoid breaking
+        * strict-aliasing rules.
         */
         */
-       uatomic_or(&node->next, REMOVED_FLAG);
+       node_next = (uintptr_t*)&node->next;
+       uatomic_or_mo(node_next, REMOVED_FLAG, CMM_RELEASE);
+
        /* We performed the (logical) deletion. */
 
        /*
        /* We performed the (logical) deletion. */
 
        /*
@@ -1208,7 +1248,7 @@ int _cds_lfht_del(struct cds_lfht *ht, unsigned long size,
        bucket = lookup_bucket(ht, size, bit_reverse_ulong(node->reverse_hash));
        _cds_lfht_gc_bucket(bucket, node);
 
        bucket = lookup_bucket(ht, size, bit_reverse_ulong(node->reverse_hash));
        _cds_lfht_gc_bucket(bucket, node);
 
-       assert(is_removed(CMM_LOAD_SHARED(node->next)));
+       urcu_posix_assert(is_removed(CMM_LOAD_SHARED(node->next)));
        /*
         * Last phase: atomically exchange node->next with a version
         * having "REMOVAL_OWNER_FLAG" set. If the returned node->next
        /*
         * Last phase: atomically exchange node->next with a version
         * having "REMOVAL_OWNER_FLAG" set. If the returned node->next
@@ -1222,7 +1262,7 @@ int _cds_lfht_del(struct cds_lfht *ht, unsigned long size,
         * was already set).
         */
        if (!is_removal_owner(uatomic_xchg(&node->next,
         * was already set).
         */
        if (!is_removal_owner(uatomic_xchg(&node->next,
-                       flag_removal_owner(node->next))))
+                       flag_removal_owner(uatomic_load(&node->next, CMM_RELAXED)))))
                return 0;
        else
                return -ENOENT;
                return 0;
        else
                return -ENOENT;
@@ -1249,8 +1289,9 @@ void partition_resize_helper(struct cds_lfht *ht, unsigned long i,
        struct partition_resize_work *work;
        int ret;
        unsigned long thread, nr_threads;
        struct partition_resize_work *work;
        int ret;
        unsigned long thread, nr_threads;
+       sigset_t newmask, oldmask;
 
 
-       assert(nr_cpus_mask != -1);
+       urcu_posix_assert(nr_cpus_mask != NR_CPUS_MASK_UNINITIALIZED);
        if (nr_cpus_mask < 0 || len < 2 * MIN_PARTITION_PER_THREAD)
                goto fallback;
 
        if (nr_cpus_mask < 0 || len < 2 * MIN_PARTITION_PER_THREAD)
                goto fallback;
 
@@ -1266,18 +1307,25 @@ void partition_resize_helper(struct cds_lfht *ht, unsigned long i,
                nr_threads = 1;
        }
        partition_len = len >> cds_lfht_get_count_order_ulong(nr_threads);
                nr_threads = 1;
        }
        partition_len = len >> cds_lfht_get_count_order_ulong(nr_threads);
-       work = calloc(nr_threads, sizeof(*work));
+       work = ht->alloc->calloc(ht->alloc->state, nr_threads, sizeof(*work));
        if (!work) {
                dbg_printf("error allocating for resize, single-threading\n");
                goto fallback;
        }
        if (!work) {
                dbg_printf("error allocating for resize, single-threading\n");
                goto fallback;
        }
+
+       ret = sigfillset(&newmask);
+       urcu_posix_assert(!ret);
+       ret = pthread_sigmask(SIG_BLOCK, &newmask, &oldmask);
+       urcu_posix_assert(!ret);
+
        for (thread = 0; thread < nr_threads; thread++) {
                work[thread].ht = ht;
                work[thread].i = i;
                work[thread].len = partition_len;
                work[thread].start = thread * partition_len;
                work[thread].fct = fct;
        for (thread = 0; thread < nr_threads; thread++) {
                work[thread].ht = ht;
                work[thread].i = i;
                work[thread].len = partition_len;
                work[thread].start = thread * partition_len;
                work[thread].fct = fct;
-               ret = pthread_create(&(work[thread].thread_id), ht->resize_attr,
+               ret = pthread_create(&(work[thread].thread_id),
+                       ht->caller_resize_attr ? &ht->resize_attr : NULL,
                        partition_resize_thread, &work[thread]);
                if (ret == EAGAIN) {
                        /*
                        partition_resize_thread, &work[thread]);
                if (ret == EAGAIN) {
                        /*
@@ -1290,13 +1338,17 @@ void partition_resize_helper(struct cds_lfht *ht, unsigned long i,
                        nr_threads = thread;
                        break;
                }
                        nr_threads = thread;
                        break;
                }
-               assert(!ret);
+               urcu_posix_assert(!ret);
        }
        }
+
+       ret = pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
+       urcu_posix_assert(!ret);
+
        for (thread = 0; thread < nr_threads; thread++) {
                ret = pthread_join(work[thread].thread_id, NULL);
        for (thread = 0; thread < nr_threads; thread++) {
                ret = pthread_join(work[thread].thread_id, NULL);
-               assert(!ret);
+               urcu_posix_assert(!ret);
        }
        }
-       free(work);
+       ht->alloc->free(ht->alloc->state, work);
 
        /*
         * A pthread_create failure above will either lead in us having
 
        /*
         * A pthread_create failure above will either lead in us having
@@ -1326,12 +1378,12 @@ void init_table_populate_partition(struct cds_lfht *ht, unsigned long i,
 {
        unsigned long j, size = 1UL << (i - 1);
 
 {
        unsigned long j, size = 1UL << (i - 1);
 
-       assert(i > MIN_TABLE_ORDER);
+       urcu_posix_assert(i > MIN_TABLE_ORDER);
        ht->flavor->read_lock();
        for (j = size + start; j < size + start + len; j++) {
                struct cds_lfht_node *new_node = bucket_at(ht, j);
 
        ht->flavor->read_lock();
        for (j = size + start; j < size + start + len; j++) {
                struct cds_lfht_node *new_node = bucket_at(ht, j);
 
-               assert(j >= size && j < (size << 1));
+               urcu_posix_assert(j >= size && j < (size << 1));
                dbg_printf("init populate: order %lu index %lu hash %lu\n",
                           i, j, j);
                new_node->reverse_hash = bit_reverse_ulong(j);
                dbg_printf("init populate: order %lu index %lu hash %lu\n",
                           i, j, j);
                new_node->reverse_hash = bit_reverse_ulong(j);
@@ -1355,7 +1407,7 @@ void init_table(struct cds_lfht *ht,
 
        dbg_printf("init table: first_order %lu last_order %lu\n",
                   first_order, last_order);
 
        dbg_printf("init table: first_order %lu last_order %lu\n",
                   first_order, last_order);
-       assert(first_order > MIN_TABLE_ORDER);
+       urcu_posix_assert(first_order > MIN_TABLE_ORDER);
        for (i = first_order; i <= last_order; i++) {
                unsigned long len;
 
        for (i = first_order; i <= last_order; i++) {
                unsigned long len;
 
@@ -1376,9 +1428,10 @@ void init_table(struct cds_lfht *ht,
 
                /*
                 * Update table size.
 
                /*
                 * Update table size.
+                *
+                * Populate data before RCU size.
                 */
                 */
-               cmm_smp_wmb();  /* populate data before RCU size */
-               CMM_STORE_SHARED(ht->size, 1UL << i);
+               uatomic_store(&ht->size, 1UL << i, CMM_RELEASE);
 
                dbg_printf("init new size: %lu\n", 1UL << i);
                if (CMM_LOAD_SHARED(ht->in_progress_destroy))
 
                dbg_printf("init new size: %lu\n", 1UL << i);
                if (CMM_LOAD_SHARED(ht->in_progress_destroy))
@@ -1418,17 +1471,23 @@ void remove_table_partition(struct cds_lfht *ht, unsigned long i,
 {
        unsigned long j, size = 1UL << (i - 1);
 
 {
        unsigned long j, size = 1UL << (i - 1);
 
-       assert(i > MIN_TABLE_ORDER);
+       urcu_posix_assert(i > MIN_TABLE_ORDER);
        ht->flavor->read_lock();
        for (j = size + start; j < size + start + len; j++) {
                struct cds_lfht_node *fini_bucket = bucket_at(ht, j);
                struct cds_lfht_node *parent_bucket = bucket_at(ht, j - size);
        ht->flavor->read_lock();
        for (j = size + start; j < size + start + len; j++) {
                struct cds_lfht_node *fini_bucket = bucket_at(ht, j);
                struct cds_lfht_node *parent_bucket = bucket_at(ht, j - size);
+               uintptr_t *fini_bucket_next;
 
 
-               assert(j >= size && j < (size << 1));
+               urcu_posix_assert(j >= size && j < (size << 1));
                dbg_printf("remove entry: order %lu index %lu hash %lu\n",
                           i, j, j);
                dbg_printf("remove entry: order %lu index %lu hash %lu\n",
                           i, j, j);
-               /* Set the REMOVED_FLAG to freeze the ->next for gc */
-               uatomic_or(&fini_bucket->next, REMOVED_FLAG);
+               /* Set the REMOVED_FLAG to freeze the ->next for gc.
+                *
+                * NOTE: The fini_bucket_next variable is present to
+                * avoid breaking strict-aliasing rules.
+                */
+               fini_bucket_next = (uintptr_t*)&fini_bucket->next;
+               uatomic_or(fini_bucket_next, REMOVED_FLAG);
                _cds_lfht_gc_bucket(parent_bucket, fini_bucket);
        }
        ht->flavor->read_unlock();
                _cds_lfht_gc_bucket(parent_bucket, fini_bucket);
        }
        ht->flavor->read_unlock();
@@ -1453,7 +1512,7 @@ void fini_table(struct cds_lfht *ht,
 
        dbg_printf("fini table: first_order %lu last_order %lu\n",
                   first_order, last_order);
 
        dbg_printf("fini table: first_order %lu last_order %lu\n",
                   first_order, last_order);
-       assert(first_order > MIN_TABLE_ORDER);
+       urcu_posix_assert(first_order > MIN_TABLE_ORDER);
        for (i = last_order; i >= first_order; i--) {
                unsigned long len;
 
        for (i = last_order; i >= first_order; i--) {
                unsigned long len;
 
@@ -1516,7 +1575,7 @@ void cds_lfht_create_bucket(struct cds_lfht *ht, unsigned long size)
        node->reverse_hash = 0;
 
        bucket_order = cds_lfht_get_count_order_ulong(size);
        node->reverse_hash = 0;
 
        bucket_order = cds_lfht_get_count_order_ulong(size);
-       assert(bucket_order >= 0);
+       urcu_posix_assert(bucket_order >= 0);
 
        for (order = 1; order < (unsigned long) bucket_order + 1; order++) {
                len = 1UL << (order - 1);
 
        for (order = 1; order < (unsigned long) bucket_order + 1; order++) {
                len = 1UL << (order - 1);
@@ -1542,7 +1601,7 @@ void cds_lfht_create_bucket(struct cds_lfht *ht, unsigned long size)
                        node->reverse_hash = bit_reverse_ulong(len + i);
 
                        /* insert after prev */
                        node->reverse_hash = bit_reverse_ulong(len + i);
 
                        /* insert after prev */
-                       assert(is_bucket(prev->next));
+                       urcu_posix_assert(is_bucket(prev->next));
                        node->next = prev->next;
                        prev->next = flag_bucket(node);
                }
                        node->next = prev->next;
                        prev->next = flag_bucket(node);
                }
@@ -1569,18 +1628,26 @@ const struct cds_lfht_mm_type *get_mm_type(unsigned long max_nr_buckets)
  * For 32-bit architectures, use the order allocator.
  */
 static
  * For 32-bit architectures, use the order allocator.
  */
 static
-const struct cds_lfht_mm_type *get_mm_type(unsigned long max_nr_buckets)
+const struct cds_lfht_mm_type *get_mm_type(
+               unsigned long max_nr_buckets __attribute__((unused)))
 {
        return &cds_lfht_mm_order;
 }
 #endif
 
 {
        return &cds_lfht_mm_order;
 }
 #endif
 
-struct cds_lfht *_cds_lfht_new(unsigned long init_size,
+void cds_lfht_node_init_deleted(struct cds_lfht_node *node)
+{
+       cds_lfht_node_init(node);
+       node->next = flag_removed(NULL);
+}
+
+struct cds_lfht *_cds_lfht_new_with_alloc(unsigned long init_size,
                        unsigned long min_nr_alloc_buckets,
                        unsigned long max_nr_buckets,
                        int flags,
                        const struct cds_lfht_mm_type *mm,
                        const struct rcu_flavor_struct *flavor,
                        unsigned long min_nr_alloc_buckets,
                        unsigned long max_nr_buckets,
                        int flags,
                        const struct cds_lfht_mm_type *mm,
                        const struct rcu_flavor_struct *flavor,
+                       const struct cds_lfht_alloc *alloc,
                        pthread_attr_t *attr)
 {
        struct cds_lfht *ht;
                        pthread_attr_t *attr)
 {
        struct cds_lfht *ht;
@@ -1616,14 +1683,17 @@ struct cds_lfht *_cds_lfht_new(unsigned long init_size,
        max_nr_buckets = max(max_nr_buckets, min_nr_alloc_buckets);
        init_size = min(init_size, max_nr_buckets);
 
        max_nr_buckets = max(max_nr_buckets, min_nr_alloc_buckets);
        init_size = min(init_size, max_nr_buckets);
 
-       ht = mm->alloc_cds_lfht(min_nr_alloc_buckets, max_nr_buckets);
-       assert(ht);
-       assert(ht->mm == mm);
-       assert(ht->bucket_at == mm->bucket_at);
+       ht = mm->alloc_cds_lfht(min_nr_alloc_buckets, max_nr_buckets, alloc ? : &cds_lfht_default_alloc);
+
+       urcu_posix_assert(ht);
+       urcu_posix_assert(ht->mm == mm);
+       urcu_posix_assert(ht->bucket_at == mm->bucket_at);
 
        ht->flags = flags;
        ht->flavor = flavor;
 
        ht->flags = flags;
        ht->flavor = flavor;
-       ht->resize_attr = attr;
+       ht->caller_resize_attr = attr;
+       if (attr)
+               ht->resize_attr = *attr;
        alloc_split_items_count(ht);
        /* this mutex should not nest in read-side C.S. */
        pthread_mutex_init(&ht->resize_mutex, NULL);
        alloc_split_items_count(ht);
        /* this mutex should not nest in read-side C.S. */
        pthread_mutex_init(&ht->resize_mutex, NULL);
@@ -1634,6 +1704,19 @@ struct cds_lfht *_cds_lfht_new(unsigned long init_size,
        return ht;
 }
 
        return ht;
 }
 
+struct cds_lfht *_cds_lfht_new(unsigned long init_size,
+                       unsigned long min_nr_alloc_buckets,
+                       unsigned long max_nr_buckets,
+                       int flags,
+                       const struct cds_lfht_mm_type *mm,
+                       const struct rcu_flavor_struct *flavor,
+                       pthread_attr_t *attr)
+{
+       return _cds_lfht_new_with_alloc(init_size,
+                       min_nr_alloc_buckets, max_nr_buckets,
+                       flags, mm, flavor, NULL, attr);
+}
+
 void cds_lfht_lookup(struct cds_lfht *ht, unsigned long hash,
                cds_lfht_match_fct match, const void *key,
                struct cds_lfht_iter *iter)
 void cds_lfht_lookup(struct cds_lfht *ht, unsigned long hash,
                cds_lfht_match_fct match, const void *key,
                struct cds_lfht_iter *iter)
@@ -1645,7 +1728,14 @@ void cds_lfht_lookup(struct cds_lfht *ht, unsigned long hash,
 
        reverse_hash = bit_reverse_ulong(hash);
 
 
        reverse_hash = bit_reverse_ulong(hash);
 
-       size = rcu_dereference(ht->size);
+       /*
+        * Use load acquire instead of rcu_dereference because there is no
+        * dependency between the table size and the dereference of the bucket
+        * content.
+        *
+        * This acquire is paired with the store release in init_table().
+        */
+       size = uatomic_load(&ht->size, CMM_ACQUIRE);
        bucket = lookup_bucket(ht, size, hash);
        /* We can always skip the bucket node initially */
        node = rcu_dereference(bucket->next);
        bucket = lookup_bucket(ht, size, hash);
        /* We can always skip the bucket node initially */
        node = rcu_dereference(bucket->next);
@@ -1660,7 +1750,7 @@ void cds_lfht_lookup(struct cds_lfht *ht, unsigned long hash,
                        break;
                }
                next = rcu_dereference(node->next);
                        break;
                }
                next = rcu_dereference(node->next);
-               assert(node == clear_flag(node));
+               urcu_posix_assert(node == clear_flag(node));
                if (caa_likely(!is_removed(next))
                    && !is_bucket(next)
                    && node->reverse_hash == reverse_hash
                if (caa_likely(!is_removed(next))
                    && !is_bucket(next)
                    && node->reverse_hash == reverse_hash
@@ -1669,12 +1759,13 @@ void cds_lfht_lookup(struct cds_lfht *ht, unsigned long hash,
                }
                node = clear_flag(next);
        }
                }
                node = clear_flag(next);
        }
-       assert(!node || !is_bucket(CMM_LOAD_SHARED(node->next)));
+       urcu_posix_assert(!node || !is_bucket(CMM_LOAD_SHARED(node->next)));
        iter->node = node;
        iter->next = next;
 }
 
        iter->node = node;
        iter->next = next;
 }
 
-void cds_lfht_next_duplicate(struct cds_lfht *ht, cds_lfht_match_fct match,
+void cds_lfht_next_duplicate(struct cds_lfht *ht __attribute__((unused)),
+               cds_lfht_match_fct match,
                const void *key, struct cds_lfht_iter *iter)
 {
        struct cds_lfht_node *node, *next;
                const void *key, struct cds_lfht_iter *iter)
 {
        struct cds_lfht_node *node, *next;
@@ -1703,12 +1794,13 @@ void cds_lfht_next_duplicate(struct cds_lfht *ht, cds_lfht_match_fct match,
                }
                node = clear_flag(next);
        }
                }
                node = clear_flag(next);
        }
-       assert(!node || !is_bucket(CMM_LOAD_SHARED(node->next)));
+       urcu_posix_assert(!node || !is_bucket(uatomic_load(&node->next, CMM_RELAXED)));
        iter->node = node;
        iter->next = next;
 }
 
        iter->node = node;
        iter->next = next;
 }
 
-void cds_lfht_next(struct cds_lfht *ht, struct cds_lfht_iter *iter)
+void cds_lfht_next(struct cds_lfht *ht __attribute__((unused)),
+               struct cds_lfht_iter *iter)
 {
        struct cds_lfht_node *node, *next;
 
 {
        struct cds_lfht_node *node, *next;
 
@@ -1726,7 +1818,7 @@ void cds_lfht_next(struct cds_lfht *ht, struct cds_lfht_iter *iter)
                }
                node = clear_flag(next);
        }
                }
                node = clear_flag(next);
        }
-       assert(!node || !is_bucket(CMM_LOAD_SHARED(node->next)));
+       urcu_posix_assert(!node || !is_bucket(uatomic_load(&node->next, CMM_RELAXED)));
        iter->node = node;
        iter->next = next;
 }
        iter->node = node;
        iter->next = next;
 }
@@ -1738,7 +1830,7 @@ void cds_lfht_first(struct cds_lfht *ht, struct cds_lfht_iter *iter)
         * Get next after first bucket node. The first bucket node is the
         * first node of the linked list.
         */
         * Get next after first bucket node. The first bucket node is the
         * first node of the linked list.
         */
-       iter->next = bucket_at(ht, 0)->next;
+       iter->next = uatomic_load(&bucket_at(ht, 0)->next, CMM_CONSUME);
        cds_lfht_next(ht, iter);
 }
 
        cds_lfht_next(ht, iter);
 }
 
@@ -1748,7 +1840,7 @@ void cds_lfht_add(struct cds_lfht *ht, unsigned long hash,
        unsigned long size;
 
        node->reverse_hash = bit_reverse_ulong(hash);
        unsigned long size;
 
        node->reverse_hash = bit_reverse_ulong(hash);
-       size = rcu_dereference(ht->size);
+       size = uatomic_load(&ht->size, CMM_ACQUIRE);
        _cds_lfht_add(ht, hash, NULL, NULL, size, node, NULL, 0);
        ht_count_add(ht, size, hash);
 }
        _cds_lfht_add(ht, hash, NULL, NULL, size, node, NULL, 0);
        ht_count_add(ht, size, hash);
 }
@@ -1763,7 +1855,7 @@ struct cds_lfht_node *cds_lfht_add_unique(struct cds_lfht *ht,
        struct cds_lfht_iter iter;
 
        node->reverse_hash = bit_reverse_ulong(hash);
        struct cds_lfht_iter iter;
 
        node->reverse_hash = bit_reverse_ulong(hash);
-       size = rcu_dereference(ht->size);
+       size = uatomic_load(&ht->size, CMM_ACQUIRE);
        _cds_lfht_add(ht, hash, match, key, size, node, &iter, 0);
        if (iter.node == node)
                ht_count_add(ht, size, hash);
        _cds_lfht_add(ht, hash, match, key, size, node, &iter, 0);
        if (iter.node == node)
                ht_count_add(ht, size, hash);
@@ -1780,7 +1872,7 @@ struct cds_lfht_node *cds_lfht_add_replace(struct cds_lfht *ht,
        struct cds_lfht_iter iter;
 
        node->reverse_hash = bit_reverse_ulong(hash);
        struct cds_lfht_iter iter;
 
        node->reverse_hash = bit_reverse_ulong(hash);
-       size = rcu_dereference(ht->size);
+       size = uatomic_load(&ht->size, CMM_ACQUIRE);
        for (;;) {
                _cds_lfht_add(ht, hash, match, key, size, node, &iter, 0);
                if (iter.node == node) {
        for (;;) {
                _cds_lfht_add(ht, hash, match, key, size, node, &iter, 0);
                if (iter.node == node) {
@@ -1809,7 +1901,7 @@ int cds_lfht_replace(struct cds_lfht *ht,
                return -EINVAL;
        if (caa_unlikely(!match(old_iter->node, key)))
                return -EINVAL;
                return -EINVAL;
        if (caa_unlikely(!match(old_iter->node, key)))
                return -EINVAL;
-       size = rcu_dereference(ht->size);
+       size = uatomic_load(&ht->size, CMM_ACQUIRE);
        return _cds_lfht_replace(ht, size, old_iter->node, old_iter->next,
                        new_node);
 }
        return _cds_lfht_replace(ht, size, old_iter->node, old_iter->next,
                        new_node);
 }
@@ -1819,7 +1911,7 @@ int cds_lfht_del(struct cds_lfht *ht, struct cds_lfht_node *node)
        unsigned long size;
        int ret;
 
        unsigned long size;
        int ret;
 
-       size = rcu_dereference(ht->size);
+       size = uatomic_load(&ht->size, CMM_ACQUIRE);
        ret = _cds_lfht_del(ht, size, node);
        if (!ret) {
                unsigned long hash;
        ret = _cds_lfht_del(ht, size, node);
        if (!ret) {
                unsigned long hash;
@@ -1835,6 +1927,35 @@ int cds_lfht_is_node_deleted(const struct cds_lfht_node *node)
        return is_removed(CMM_LOAD_SHARED(node->next));
 }
 
        return is_removed(CMM_LOAD_SHARED(node->next));
 }
 
+static
+bool cds_lfht_is_empty(struct cds_lfht *ht)
+{
+       struct cds_lfht_node *node, *next;
+       bool empty = true;
+       bool was_online;
+
+       was_online = ht->flavor->read_ongoing();
+       if (!was_online) {
+               ht->flavor->thread_online();
+               ht->flavor->read_lock();
+       }
+       /* Check that the table is empty */
+       node = bucket_at(ht, 0);
+       do {
+               next = rcu_dereference(node->next);
+               if (!is_bucket(next)) {
+                       empty = false;
+                       break;
+               }
+               node = clear_flag(next);
+       } while (!is_end(node));
+       if (!was_online) {
+               ht->flavor->read_unlock();
+               ht->flavor->thread_offline();
+       }
+       return empty;
+}
+
 static
 int cds_lfht_delete_bucket(struct cds_lfht *ht)
 {
 static
 int cds_lfht_delete_bucket(struct cds_lfht *ht)
 {
@@ -1847,8 +1968,8 @@ int cds_lfht_delete_bucket(struct cds_lfht *ht)
                node = clear_flag(node)->next;
                if (!is_bucket(node))
                        return -EPERM;
                node = clear_flag(node)->next;
                if (!is_bucket(node))
                        return -EPERM;
-               assert(!is_removed(node));
-               assert(!is_removal_owner(node));
+               urcu_posix_assert(!is_removed(node));
+               urcu_posix_assert(!is_removal_owner(node));
        } while (!is_end(node));
        /*
         * size accessed without rcu_dereference because hash table is
        } while (!is_end(node));
        /*
         * size accessed without rcu_dereference because hash table is
@@ -1860,7 +1981,7 @@ int cds_lfht_delete_bucket(struct cds_lfht *ht)
                node = bucket_at(ht, i);
                dbg_printf("delete bucket: index %lu expected hash %lu hash %lu\n",
                        i, i, bit_reverse_ulong(node->reverse_hash));
                node = bucket_at(ht, i);
                dbg_printf("delete bucket: index %lu expected hash %lu hash %lu\n",
                        i, i, bit_reverse_ulong(node->reverse_hash));
-               assert(is_bucket(node->next));
+               urcu_posix_assert(is_bucket(node->next));
        }
 
        for (order = cds_lfht_get_count_order_ulong(size); (long)order >= 0; order--)
        }
 
        for (order = cds_lfht_get_count_order_ulong(size); (long)order >= 0; order--)
@@ -1869,6 +1990,24 @@ int cds_lfht_delete_bucket(struct cds_lfht *ht)
        return 0;
 }
 
        return 0;
 }
 
+static
+void do_auto_resize_destroy_cb(struct urcu_work *work)
+{
+       struct cds_lfht *ht = caa_container_of(work, struct cds_lfht, destroy_work);
+       int ret;
+
+       ht->flavor->register_thread();
+       ret = cds_lfht_delete_bucket(ht);
+       if (ret)
+               urcu_die(-ret);
+       free_split_items_count(ht);
+       ret = pthread_mutex_destroy(&ht->resize_mutex);
+       if (ret)
+               urcu_die(ret);
+       ht->flavor->unregister_thread();
+       poison_free(ht->alloc, ht);
+}
+
 /*
  * Should only be called when no more concurrent readers nor writers can
  * possibly access the table.
 /*
  * Should only be called when no more concurrent readers nor writers can
  * possibly access the table.
@@ -1878,23 +2017,39 @@ int cds_lfht_destroy(struct cds_lfht *ht, pthread_attr_t **attr)
        int ret;
 
        if (ht->flags & CDS_LFHT_AUTO_RESIZE) {
        int ret;
 
        if (ht->flags & CDS_LFHT_AUTO_RESIZE) {
+               /*
+                * Perform error-checking for emptiness before queuing
+                * work, so we can return error to the caller. This runs
+                * concurrently with ongoing resize.
+                */
+               if (!cds_lfht_is_empty(ht))
+                       return -EPERM;
                /* Cancel ongoing resize operations. */
                /* Cancel ongoing resize operations. */
-               _CMM_STORE_SHARED(ht->in_progress_destroy, 1);
-               /* Wait for in-flight resize operations to complete */
-               urcu_workqueue_flush_queued_work(cds_lfht_workqueue);
+               uatomic_store(&ht->in_progress_destroy, 1, CMM_RELAXED);
+               if (attr) {
+                       *attr = ht->caller_resize_attr;
+                       ht->caller_resize_attr = NULL;
+               }
+               /*
+                * Queue destroy work after prior queued resize
+                * operations. Given there are no concurrent writers
+                * accessing the hash table at this point, no resize
+                * operations can be queued after this destroy work.
+                */
+               urcu_workqueue_queue_work(cds_lfht_workqueue,
+                       &ht->destroy_work, do_auto_resize_destroy_cb);
+               return 0;
        }
        ret = cds_lfht_delete_bucket(ht);
        if (ret)
                return ret;
        free_split_items_count(ht);
        if (attr)
        }
        ret = cds_lfht_delete_bucket(ht);
        if (ret)
                return ret;
        free_split_items_count(ht);
        if (attr)
-               *attr = ht->resize_attr;
+               *attr = ht->caller_resize_attr;
        ret = pthread_mutex_destroy(&ht->resize_mutex);
        if (ret)
                ret = -EBUSY;
        ret = pthread_mutex_destroy(&ht->resize_mutex);
        if (ret)
                ret = -EBUSY;
-       if (ht->flags & CDS_LFHT_AUTO_RESIZE)
-               cds_lfht_fini_worker(ht->flavor);
-       poison_free(ht);
+       poison_free(ht->alloc, ht);
        return ret;
 }
 
        return ret;
 }
 
@@ -1957,7 +2112,7 @@ void _do_cds_lfht_grow(struct cds_lfht *ht,
        new_order = cds_lfht_get_count_order_ulong(new_size);
        dbg_printf("resize from %lu (order %lu) to %lu (order %lu) buckets\n",
                   old_size, old_order, new_size, new_order);
        new_order = cds_lfht_get_count_order_ulong(new_size);
        dbg_printf("resize from %lu (order %lu) to %lu (order %lu) buckets\n",
                   old_size, old_order, new_size, new_order);
-       assert(new_size > old_size);
+       urcu_posix_assert(new_size > old_size);
        init_table(ht, old_order + 1, new_order);
 }
 
        init_table(ht, old_order + 1, new_order);
 }
 
@@ -1973,7 +2128,7 @@ void _do_cds_lfht_shrink(struct cds_lfht *ht,
        new_order = cds_lfht_get_count_order_ulong(new_size);
        dbg_printf("resize from %lu (order %lu) to %lu (order %lu) buckets\n",
                   old_size, old_order, new_size, new_order);
        new_order = cds_lfht_get_count_order_ulong(new_size);
        dbg_printf("resize from %lu (order %lu) to %lu (order %lu) buckets\n",
                   old_size, old_order, new_size, new_order);
-       assert(new_size < old_size);
+       urcu_posix_assert(new_size < old_size);
 
        /* Remove and unlink all bucket nodes to remove. */
        fini_table(ht, new_order + 1, old_order);
 
        /* Remove and unlink all bucket nodes to remove. */
        fini_table(ht, new_order + 1, old_order);
@@ -1990,19 +2145,22 @@ void _do_cds_lfht_resize(struct cds_lfht *ht)
         * Resize table, re-do if the target size has changed under us.
         */
        do {
         * Resize table, re-do if the target size has changed under us.
         */
        do {
-               if (CMM_LOAD_SHARED(ht->in_progress_destroy))
+               if (uatomic_load(&ht->in_progress_destroy, CMM_RELAXED))
                        break;
                        break;
-               ht->resize_initiated = 1;
+
+               uatomic_store(&ht->resize_initiated, 1, CMM_RELAXED);
+
                old_size = ht->size;
                old_size = ht->size;
-               new_size = CMM_LOAD_SHARED(ht->resize_target);
+               new_size = uatomic_load(&ht->resize_target, CMM_RELAXED);
                if (old_size < new_size)
                        _do_cds_lfht_grow(ht, old_size, new_size);
                else if (old_size > new_size)
                        _do_cds_lfht_shrink(ht, old_size, new_size);
                if (old_size < new_size)
                        _do_cds_lfht_grow(ht, old_size, new_size);
                else if (old_size > new_size)
                        _do_cds_lfht_shrink(ht, old_size, new_size);
-               ht->resize_initiated = 0;
+
+               uatomic_store(&ht->resize_initiated, 0, CMM_RELAXED);
                /* write resize_initiated before read resize_target */
                cmm_smp_mb();
                /* write resize_initiated before read resize_target */
                cmm_smp_mb();
-       } while (ht->size != CMM_LOAD_SHARED(ht->resize_target));
+       } while (ht->size != uatomic_load(&ht->resize_target, CMM_RELAXED));
 }
 
 static
 }
 
 static
@@ -2023,7 +2181,12 @@ void resize_target_update_count(struct cds_lfht *ht,
 void cds_lfht_resize(struct cds_lfht *ht, unsigned long new_size)
 {
        resize_target_update_count(ht, new_size);
 void cds_lfht_resize(struct cds_lfht *ht, unsigned long new_size)
 {
        resize_target_update_count(ht, new_size);
-       CMM_STORE_SHARED(ht->resize_initiated, 1);
+
+       /*
+        * Set flags has early as possible even in contention case.
+        */
+       uatomic_store(&ht->resize_initiated, 1, CMM_RELAXED);
+
        mutex_lock(&ht->resize_mutex);
        _do_cds_lfht_resize(ht);
        mutex_unlock(&ht->resize_mutex);
        mutex_lock(&ht->resize_mutex);
        _do_cds_lfht_resize(ht);
        mutex_unlock(&ht->resize_mutex);
@@ -2041,7 +2204,7 @@ void do_resize_cb(struct urcu_work *work)
        _do_cds_lfht_resize(ht);
        mutex_unlock(&ht->resize_mutex);
        ht->flavor->unregister_thread();
        _do_cds_lfht_resize(ht);
        mutex_unlock(&ht->resize_mutex);
        ht->flavor->unregister_thread();
-       poison_free(work);
+       poison_free(ht->alloc, work);
 }
 
 static
 }
 
 static
@@ -2049,13 +2212,15 @@ void __cds_lfht_resize_lazy_launch(struct cds_lfht *ht)
 {
        struct resize_work *work;
 
 {
        struct resize_work *work;
 
-       /* Store resize_target before read resize_initiated */
-       cmm_smp_mb();
-       if (!CMM_LOAD_SHARED(ht->resize_initiated)) {
-               if (CMM_LOAD_SHARED(ht->in_progress_destroy)) {
+       /*
+        * Store to resize_target is before read resize_initiated as guaranteed
+        * by either cmpxchg or _uatomic_xchg_monotonic_increase.
+        */
+       if (!uatomic_load(&ht->resize_initiated, CMM_RELAXED)) {
+               if (uatomic_load(&ht->in_progress_destroy, CMM_RELAXED)) {
                        return;
                }
                        return;
                }
-               work = malloc(sizeof(*work));
+               work = ht->alloc->malloc(ht->alloc->state, sizeof(*work));
                if (work == NULL) {
                        dbg_printf("error allocating resize work, bailing out\n");
                        return;
                if (work == NULL) {
                        dbg_printf("error allocating resize work, bailing out\n");
                        return;
@@ -2063,7 +2228,7 @@ void __cds_lfht_resize_lazy_launch(struct cds_lfht *ht)
                work->ht = ht;
                urcu_workqueue_queue_work(cds_lfht_workqueue,
                        &work->work, do_resize_cb);
                work->ht = ht;
                urcu_workqueue_queue_work(cds_lfht_workqueue,
                        &work->work, do_resize_cb);
-               CMM_STORE_SHARED(ht->resize_initiated, 1);
+               uatomic_store(&ht->resize_initiated, 1, CMM_RELAXED);
        }
 }
 
        }
 }
 
@@ -2114,7 +2279,7 @@ void cds_lfht_resize_lazy_count(struct cds_lfht *ht, unsigned long size,
        __cds_lfht_resize_lazy_launch(ht);
 }
 
        __cds_lfht_resize_lazy_launch(ht);
 }
 
-static void cds_lfht_before_fork(void *priv)
+static void cds_lfht_before_fork(void *priv __attribute__((unused)))
 {
        if (cds_lfht_workqueue_atfork_nesting++)
                return;
 {
        if (cds_lfht_workqueue_atfork_nesting++)
                return;
@@ -2124,7 +2289,7 @@ static void cds_lfht_before_fork(void *priv)
        urcu_workqueue_pause_worker(cds_lfht_workqueue);
 }
 
        urcu_workqueue_pause_worker(cds_lfht_workqueue);
 }
 
-static void cds_lfht_after_fork_parent(void *priv)
+static void cds_lfht_after_fork_parent(void *priv __attribute__((unused)))
 {
        if (--cds_lfht_workqueue_atfork_nesting)
                return;
 {
        if (--cds_lfht_workqueue_atfork_nesting)
                return;
@@ -2135,7 +2300,7 @@ end:
        mutex_unlock(&cds_lfht_fork_mutex);
 }
 
        mutex_unlock(&cds_lfht_fork_mutex);
 }
 
-static void cds_lfht_after_fork_child(void *priv)
+static void cds_lfht_after_fork_child(void *priv __attribute__((unused)))
 {
        if (--cds_lfht_workqueue_atfork_nesting)
                return;
 {
        if (--cds_lfht_workqueue_atfork_nesting)
                return;
@@ -2152,50 +2317,24 @@ static struct urcu_atfork cds_lfht_atfork = {
        .after_fork_child = cds_lfht_after_fork_child,
 };
 
        .after_fork_child = cds_lfht_after_fork_child,
 };
 
-/*
- * Block all signals for the workqueue worker thread to ensure we don't
- * disturb the application. The SIGRCU signal needs to be unblocked for
- * the urcu-signal flavor.
- */
-static void cds_lfht_worker_init(struct urcu_workqueue *workqueue,
-               void *priv)
-{
-       int ret;
-       sigset_t mask;
-
-       ret = sigfillset(&mask);
-       if (ret)
-               urcu_die(errno);
-       ret = sigdelset(&mask, SIGRCU);
-       if (ret)
-               urcu_die(errno);
-       ret = pthread_sigmask(SIG_SETMASK, &mask, NULL);
-       if (ret)
-               urcu_die(ret);
-}
-
 static void cds_lfht_init_worker(const struct rcu_flavor_struct *flavor)
 {
        flavor->register_rculfhash_atfork(&cds_lfht_atfork);
 
        mutex_lock(&cds_lfht_fork_mutex);
 static void cds_lfht_init_worker(const struct rcu_flavor_struct *flavor)
 {
        flavor->register_rculfhash_atfork(&cds_lfht_atfork);
 
        mutex_lock(&cds_lfht_fork_mutex);
-       if (cds_lfht_workqueue_user_count++)
-               goto end;
-       cds_lfht_workqueue = urcu_workqueue_create(0, -1, NULL,
-               NULL, cds_lfht_worker_init, NULL, NULL, NULL, NULL, NULL);
-end:
+       if (!cds_lfht_workqueue)
+               cds_lfht_workqueue = urcu_workqueue_create(0, -1, NULL,
+                       NULL, NULL, NULL, NULL, NULL, NULL, NULL);
        mutex_unlock(&cds_lfht_fork_mutex);
 }
 
        mutex_unlock(&cds_lfht_fork_mutex);
 }
 
-static void cds_lfht_fini_worker(const struct rcu_flavor_struct *flavor)
+static void cds_lfht_exit(void)
 {
        mutex_lock(&cds_lfht_fork_mutex);
 {
        mutex_lock(&cds_lfht_fork_mutex);
-       if (--cds_lfht_workqueue_user_count)
-               goto end;
-       urcu_workqueue_destroy(cds_lfht_workqueue);
-       cds_lfht_workqueue = NULL;
-end:
+       if (cds_lfht_workqueue) {
+               urcu_workqueue_flush_queued_work(cds_lfht_workqueue);
+               urcu_workqueue_destroy(cds_lfht_workqueue);
+               cds_lfht_workqueue = NULL;
+       }
        mutex_unlock(&cds_lfht_fork_mutex);
        mutex_unlock(&cds_lfht_fork_mutex);
-
-       flavor->unregister_rculfhash_atfork(&cds_lfht_atfork);
 }
 }
index 38eddcf3a4283c2b86d2d66ee5604bf3a57b2213..8b6e0a65baa3dfd65fb212a6e871d70e27bd2adc 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * rculfqueue.c
- *
  * Userspace RCU library - Lock-Free RCU Queue
  * Userspace RCU library - Lock-Free RCU Queue
- *
- * Copyright 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 /* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
  */
 
 /* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
index df5c54703820461766b6cc18bf7f961812cad8b7..d7b00ffcd8876695366cd103c51461bf6c038a16 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * rculfstack.c
- *
  * Userspace RCU library - Lock-Free RCU Stack
  * Userspace RCU library - Lock-Free RCU Stack
- *
- * Copyright 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 /* Remove deprecation warnings from LGPL wrapper build. */
  */
 
 /* Remove deprecation warnings from LGPL wrapper build. */
index 33f280799208c66f0337e25acfeaf8adce213aa1..38f867e7b46347dd8da6b74a2fd18f2ea8505129 100644 (file)
@@ -1,25 +1,11 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * urcu-bp.c
- *
  * Userspace RCU library, "bulletproof" version.
  *
  * Userspace RCU library, "bulletproof" version.
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
@@ -28,7 +14,6 @@
 #include <stdio.h>
 #include <pthread.h>
 #include <signal.h>
 #include <stdio.h>
 #include <pthread.h>
 #include <signal.h>
-#include <assert.h>
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
@@ -37,6 +22,9 @@
 #include <stdbool.h>
 #include <sys/mman.h>
 
 #include <stdbool.h>
 #include <sys/mman.h>
 
+#include <urcu/annotate.h>
+#include <urcu/assert.h>
+#include <urcu/config.h>
 #include <urcu/arch.h>
 #include <urcu/wfcqueue.h>
 #include <urcu/map/urcu-bp.h>
 #include <urcu/arch.h>
 #include <urcu/wfcqueue.h>
 #include <urcu/map/urcu-bp.h>
@@ -74,10 +62,12 @@ void *mremap_wrapper(void *old_address, size_t old_size,
  * This is not generic.
 */
 static
  * This is not generic.
 */
 static
-void *mremap_wrapper(void *old_address, size_t old_size,
-               size_t new_size, int flags)
+void *mremap_wrapper(void *old_address __attribute__((unused)),
+               size_t old_size __attribute__((unused)),
+               size_t new_size __attribute__((unused)),
+               int flags)
 {
 {
-       assert(!(flags & MREMAP_MAYMOVE));
+       urcu_posix_assert(!(flags & MREMAP_MAYMOVE));
 
        return MAP_FAILED;
 }
 
        return MAP_FAILED;
 }
@@ -85,10 +75,7 @@ void *mremap_wrapper(void *old_address, size_t old_size,
 
 /* Sleep delay in ms */
 #define RCU_SLEEP_DELAY_MS     10
 
 /* Sleep delay in ms */
 #define RCU_SLEEP_DELAY_MS     10
-#define INIT_NR_THREADS                8
-#define ARENA_INIT_ALLOC               \
-       sizeof(struct registry_chunk)   \
-       + INIT_NR_THREADS * sizeof(struct urcu_bp_reader)
+#define INIT_READER_COUNT      8
 
 /*
  * Active attempts to check for reader Q.S. before calling sleep().
 
 /*
  * Active attempts to check for reader Q.S. before calling sleep().
@@ -117,7 +104,10 @@ enum membarrier_cmd {
 static
 void __attribute__((constructor)) _urcu_bp_init(void);
 static
 static
 void __attribute__((constructor)) _urcu_bp_init(void);
 static
-void __attribute__((destructor)) urcu_bp_exit(void);
+void urcu_bp_exit(void);
+static
+void __attribute__((destructor)) urcu_bp_exit_destructor(void);
+static void urcu_call_rcu_exit(void);
 
 #ifndef CONFIG_RCU_FORCE_SYS_MEMBARRIER
 int urcu_bp_has_sys_membarrier;
 
 #ifndef CONFIG_RCU_FORCE_SYS_MEMBARRIER
 int urcu_bp_has_sys_membarrier;
@@ -145,22 +135,20 @@ static int initialized;
 static pthread_key_t urcu_bp_key;
 
 struct urcu_bp_gp urcu_bp_gp = { .ctr = URCU_BP_GP_COUNT };
 static pthread_key_t urcu_bp_key;
 
 struct urcu_bp_gp urcu_bp_gp = { .ctr = URCU_BP_GP_COUNT };
-URCU_ATTR_ALIAS("urcu_bp_gp") extern struct urcu_bp_gp rcu_gp_bp;
 
 /*
  * Pointer to registry elements. Written to only by each individual reader. Read
  * by both the reader and the writers.
  */
 DEFINE_URCU_TLS(struct urcu_bp_reader *, urcu_bp_reader);
 
 /*
  * Pointer to registry elements. Written to only by each individual reader. Read
  * by both the reader and the writers.
  */
 DEFINE_URCU_TLS(struct urcu_bp_reader *, urcu_bp_reader);
-DEFINE_URCU_TLS_ALIAS(struct urcu_bp_reader *, urcu_bp_reader, rcu_reader_bp);
 
 static CDS_LIST_HEAD(registry);
 
 struct registry_chunk {
 
 static CDS_LIST_HEAD(registry);
 
 struct registry_chunk {
-       size_t data_len;                /* data length */
-       size_t used;                    /* amount of data used */
+       size_t capacity;                /* capacity of this chunk (in elements) */
+       size_t used;                    /* count of elements used */
        struct cds_list_head node;      /* chunk_list node */
        struct cds_list_head node;      /* chunk_list node */
-       char data[];
+       struct urcu_bp_reader readers[];
 };
 
 struct registry_arena {
 };
 
 struct registry_arena {
@@ -210,13 +198,21 @@ static void smp_mb_master(void)
        }
 }
 
        }
 }
 
+/* Get the size of a chunk's allocation from its capacity (an element count). */
+static size_t chunk_allocation_size(size_t capacity)
+{
+       return (capacity * sizeof(struct urcu_bp_reader)) +
+               sizeof(struct registry_chunk);
+}
+
 /*
  * Always called with rcu_registry lock held. Releases this lock between
  * iterations and grabs it again. Holds the lock when it returns.
  */
 static void wait_for_readers(struct cds_list_head *input_readers,
                        struct cds_list_head *cur_snap_readers,
 /*
  * Always called with rcu_registry lock held. Releases this lock between
  * iterations and grabs it again. Holds the lock when it returns.
  */
 static void wait_for_readers(struct cds_list_head *input_readers,
                        struct cds_list_head *cur_snap_readers,
-                       struct cds_list_head *qsreaders)
+                       struct cds_list_head *qsreaders,
+                       cmm_annotate_t *group)
 {
        unsigned int wait_loops = 0;
        struct urcu_bp_reader *index, *tmp;
 {
        unsigned int wait_loops = 0;
        struct urcu_bp_reader *index, *tmp;
@@ -231,7 +227,7 @@ static void wait_for_readers(struct cds_list_head *input_readers,
                        wait_loops++;
 
                cds_list_for_each_entry_safe(index, tmp, input_readers, node) {
                        wait_loops++;
 
                cds_list_for_each_entry_safe(index, tmp, input_readers, node) {
-                       switch (urcu_bp_reader_state(&index->ctr)) {
+                       switch (urcu_bp_reader_state(&index->ctr, group)) {
                        case URCU_BP_READER_ACTIVE_CURRENT:
                                if (cur_snap_readers) {
                                        cds_list_move(&index->node,
                        case URCU_BP_READER_ACTIVE_CURRENT:
                                if (cur_snap_readers) {
                                        cds_list_move(&index->node,
@@ -270,15 +266,17 @@ static void wait_for_readers(struct cds_list_head *input_readers,
 
 void urcu_bp_synchronize_rcu(void)
 {
 
 void urcu_bp_synchronize_rcu(void)
 {
+       cmm_annotate_define(acquire_group);
+       cmm_annotate_define(release_group);
        CDS_LIST_HEAD(cur_snap_readers);
        CDS_LIST_HEAD(qsreaders);
        sigset_t newmask, oldmask;
        int ret;
 
        ret = sigfillset(&newmask);
        CDS_LIST_HEAD(cur_snap_readers);
        CDS_LIST_HEAD(qsreaders);
        sigset_t newmask, oldmask;
        int ret;
 
        ret = sigfillset(&newmask);
-       assert(!ret);
+       urcu_posix_assert(!ret);
        ret = pthread_sigmask(SIG_BLOCK, &newmask, &oldmask);
        ret = pthread_sigmask(SIG_BLOCK, &newmask, &oldmask);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 
        mutex_lock(&rcu_gp_lock);
 
 
        mutex_lock(&rcu_gp_lock);
 
@@ -291,13 +289,14 @@ void urcu_bp_synchronize_rcu(void)
         * where new ptr points to. */
        /* Write new ptr before changing the qparity */
        smp_mb_master();
         * where new ptr points to. */
        /* Write new ptr before changing the qparity */
        smp_mb_master();
+       cmm_annotate_group_mb_release(&release_group);
 
        /*
         * Wait for readers to observe original parity or be quiescent.
         * wait_for_readers() can release and grab again rcu_registry_lock
 
        /*
         * Wait for readers to observe original parity or be quiescent.
         * wait_for_readers() can release and grab again rcu_registry_lock
-        * interally.
+        * internally.
         */
         */
-       wait_for_readers(&registry, &cur_snap_readers, &qsreaders);
+       wait_for_readers(&registry, &cur_snap_readers, &qsreaders, &acquire_group);
 
        /*
         * Adding a cmm_smp_mb() which is _not_ formally required, but makes the
 
        /*
         * Adding a cmm_smp_mb() which is _not_ formally required, but makes the
@@ -307,7 +306,8 @@ void urcu_bp_synchronize_rcu(void)
        cmm_smp_mb();
 
        /* Switch parity: 0 -> 1, 1 -> 0 */
        cmm_smp_mb();
 
        /* Switch parity: 0 -> 1, 1 -> 0 */
-       CMM_STORE_SHARED(rcu_gp.ctr, rcu_gp.ctr ^ URCU_BP_GP_CTR_PHASE);
+       cmm_annotate_group_mem_release(&release_group, &rcu_gp.ctr);
+       uatomic_store(&rcu_gp.ctr, rcu_gp.ctr ^ URCU_BP_GP_CTR_PHASE, CMM_RELAXED);
 
        /*
         * Must commit qparity update to memory before waiting for other parity
 
        /*
         * Must commit qparity update to memory before waiting for other parity
@@ -326,9 +326,9 @@ void urcu_bp_synchronize_rcu(void)
        /*
         * Wait for readers to observe new parity or be quiescent.
         * wait_for_readers() can release and grab again rcu_registry_lock
        /*
         * Wait for readers to observe new parity or be quiescent.
         * wait_for_readers() can release and grab again rcu_registry_lock
-        * interally.
+        * internally.
         */
         */
-       wait_for_readers(&cur_snap_readers, NULL, &qsreaders);
+       wait_for_readers(&cur_snap_readers, NULL, &qsreaders, &acquire_group);
 
        /*
         * Put quiescent reader list back into registry.
 
        /*
         * Put quiescent reader list back into registry.
@@ -340,13 +340,13 @@ void urcu_bp_synchronize_rcu(void)
         * freed.
         */
        smp_mb_master();
         * freed.
         */
        smp_mb_master();
+       cmm_annotate_group_mb_acquire(&acquire_group);
 out:
        mutex_unlock(&rcu_registry_lock);
        mutex_unlock(&rcu_gp_lock);
        ret = pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
 out:
        mutex_unlock(&rcu_registry_lock);
        mutex_unlock(&rcu_gp_lock);
        ret = pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 }
 }
-URCU_ATTR_ALIAS("urcu_bp_synchronize_rcu") void synchronize_rcu_bp();
 
 /*
  * library wrappers to be used by non-LGPL compatible source code.
 
 /*
  * library wrappers to be used by non-LGPL compatible source code.
@@ -356,19 +356,16 @@ void urcu_bp_read_lock(void)
 {
        _urcu_bp_read_lock();
 }
 {
        _urcu_bp_read_lock();
 }
-URCU_ATTR_ALIAS("urcu_bp_read_lock") void rcu_read_lock_bp();
 
 void urcu_bp_read_unlock(void)
 {
        _urcu_bp_read_unlock();
 }
 
 void urcu_bp_read_unlock(void)
 {
        _urcu_bp_read_unlock();
 }
-URCU_ATTR_ALIAS("urcu_bp_read_unlock") void rcu_read_unlock_bp();
 
 int urcu_bp_read_ongoing(void)
 {
        return _urcu_bp_read_ongoing();
 }
 
 int urcu_bp_read_ongoing(void)
 {
        return _urcu_bp_read_ongoing();
 }
-URCU_ATTR_ALIAS("urcu_bp_read_ongoing") int rcu_read_ongoing_bp();
 
 /*
  * Only grow for now. If empty, allocate a ARENA_INIT_ALLOC sized chunk.
 
 /*
  * Only grow for now. If empty, allocate a ARENA_INIT_ALLOC sized chunk.
@@ -382,24 +379,20 @@ static
 void expand_arena(struct registry_arena *arena)
 {
        struct registry_chunk *new_chunk, *last_chunk;
 void expand_arena(struct registry_arena *arena)
 {
        struct registry_chunk *new_chunk, *last_chunk;
-       size_t old_chunk_len, new_chunk_len;
+       size_t old_chunk_size_bytes, new_chunk_size_bytes, new_capacity;
 
        /* No chunk. */
        if (cds_list_empty(&arena->chunk_list)) {
 
        /* No chunk. */
        if (cds_list_empty(&arena->chunk_list)) {
-               assert(ARENA_INIT_ALLOC >=
-                       sizeof(struct registry_chunk)
-                       + sizeof(struct rcu_reader));
-               new_chunk_len = ARENA_INIT_ALLOC;
+               new_chunk_size_bytes = chunk_allocation_size(INIT_READER_COUNT);
                new_chunk = (struct registry_chunk *) mmap(NULL,
                new_chunk = (struct registry_chunk *) mmap(NULL,
-                       new_chunk_len,
+                       new_chunk_size_bytes,
                        PROT_READ | PROT_WRITE,
                        MAP_ANONYMOUS | MAP_PRIVATE,
                        -1, 0);
                if (new_chunk == MAP_FAILED)
                        abort();
                        PROT_READ | PROT_WRITE,
                        MAP_ANONYMOUS | MAP_PRIVATE,
                        -1, 0);
                if (new_chunk == MAP_FAILED)
                        abort();
-               memset(new_chunk, 0, new_chunk_len);
-               new_chunk->data_len =
-                       new_chunk_len - sizeof(struct registry_chunk);
+               memset(new_chunk, 0, new_chunk_size_bytes);
+               new_chunk->capacity = INIT_READER_COUNT;
                cds_list_add_tail(&new_chunk->node, &arena->chunk_list);
                return;         /* We're done. */
        }
                cds_list_add_tail(&new_chunk->node, &arena->chunk_list);
                return;         /* We're done. */
        }
@@ -407,34 +400,32 @@ void expand_arena(struct registry_arena *arena)
        /* Try expanding last chunk. */
        last_chunk = cds_list_entry(arena->chunk_list.prev,
                struct registry_chunk, node);
        /* Try expanding last chunk. */
        last_chunk = cds_list_entry(arena->chunk_list.prev,
                struct registry_chunk, node);
-       old_chunk_len =
-               last_chunk->data_len + sizeof(struct registry_chunk);
-       new_chunk_len = old_chunk_len << 1;
+       old_chunk_size_bytes = chunk_allocation_size(last_chunk->capacity);
+       new_capacity = last_chunk->capacity << 1;
+       new_chunk_size_bytes = chunk_allocation_size(new_capacity);
 
        /* Don't allow memory mapping to move, just expand. */
 
        /* Don't allow memory mapping to move, just expand. */
-       new_chunk = mremap_wrapper(last_chunk, old_chunk_len,
-               new_chunk_len, 0);
+       new_chunk = mremap_wrapper(last_chunk, old_chunk_size_bytes,
+               new_chunk_size_bytes, 0);
        if (new_chunk != MAP_FAILED) {
                /* Should not have moved. */
                assert(new_chunk == last_chunk);
        if (new_chunk != MAP_FAILED) {
                /* Should not have moved. */
                assert(new_chunk == last_chunk);
-               memset((char *) last_chunk + old_chunk_len, 0,
-                       new_chunk_len - old_chunk_len);
-               last_chunk->data_len =
-                       new_chunk_len - sizeof(struct registry_chunk);
+               memset((char *) last_chunk + old_chunk_size_bytes, 0,
+                       new_chunk_size_bytes - old_chunk_size_bytes);
+               last_chunk->capacity = new_capacity;
                return;         /* We're done. */
        }
 
        /* Remap did not succeed, we need to add a new chunk. */
        new_chunk = (struct registry_chunk *) mmap(NULL,
                return;         /* We're done. */
        }
 
        /* Remap did not succeed, we need to add a new chunk. */
        new_chunk = (struct registry_chunk *) mmap(NULL,
-               new_chunk_len,
+               new_chunk_size_bytes,
                PROT_READ | PROT_WRITE,
                MAP_ANONYMOUS | MAP_PRIVATE,
                -1, 0);
        if (new_chunk == MAP_FAILED)
                abort();
                PROT_READ | PROT_WRITE,
                MAP_ANONYMOUS | MAP_PRIVATE,
                -1, 0);
        if (new_chunk == MAP_FAILED)
                abort();
-       memset(new_chunk, 0, new_chunk_len);
-       new_chunk->data_len =
-               new_chunk_len - sizeof(struct registry_chunk);
+       memset(new_chunk, 0, new_chunk_size_bytes);
+       new_chunk->capacity = new_capacity;
        cds_list_add_tail(&new_chunk->node, &arena->chunk_list);
 }
 
        cds_list_add_tail(&new_chunk->node, &arena->chunk_list);
 }
 
@@ -442,22 +433,23 @@ static
 struct rcu_reader *arena_alloc(struct registry_arena *arena)
 {
        struct registry_chunk *chunk;
 struct rcu_reader *arena_alloc(struct registry_arena *arena)
 {
        struct registry_chunk *chunk;
-       struct rcu_reader *rcu_reader_reg;
        int expand_done = 0;    /* Only allow to expand once per alloc */
        int expand_done = 0;    /* Only allow to expand once per alloc */
-       size_t len = sizeof(struct rcu_reader);
 
 retry:
        cds_list_for_each_entry(chunk, &arena->chunk_list, node) {
 
 retry:
        cds_list_for_each_entry(chunk, &arena->chunk_list, node) {
-               if (chunk->data_len - chunk->used < len)
+               size_t spot_idx;
+
+               /* Skip fully used chunks. */
+               if (chunk->used == chunk->capacity) {
                        continue;
                        continue;
-               /* Find spot */
-               for (rcu_reader_reg = (struct rcu_reader *) &chunk->data[0];
-                               rcu_reader_reg < (struct rcu_reader *) &chunk->data[chunk->data_len];
-                               rcu_reader_reg++) {
-                       if (!rcu_reader_reg->alloc) {
-                               rcu_reader_reg->alloc = 1;
-                               chunk->used += len;
-                               return rcu_reader_reg;
+               }
+
+               /* Find a spot. */
+               for (spot_idx = 0; spot_idx < chunk->capacity; spot_idx++) {
+                       if (!chunk->readers[spot_idx].alloc) {
+                               chunk->readers[spot_idx].alloc = 1;
+                               chunk->used++;
+                               return &chunk->readers[spot_idx];
                        }
                }
        }
                        }
                }
        }
@@ -487,7 +479,7 @@ void add_thread(void)
 
        /* Add to registry */
        rcu_reader_reg->tid = pthread_self();
 
        /* Add to registry */
        rcu_reader_reg->tid = pthread_self();
-       assert(rcu_reader_reg->ctr == 0);
+       urcu_posix_assert(rcu_reader_reg->ctr == 0);
        cds_list_add(&rcu_reader_reg->node, &registry);
        /*
         * Reader threads are pointing to the reader registry. This is
        cds_list_add(&rcu_reader_reg->node, &registry);
        /*
         * Reader threads are pointing to the reader registry. This is
@@ -505,7 +497,7 @@ void cleanup_thread(struct registry_chunk *chunk,
        cds_list_del(&rcu_reader_reg->node);
        rcu_reader_reg->tid = 0;
        rcu_reader_reg->alloc = 0;
        cds_list_del(&rcu_reader_reg->node);
        rcu_reader_reg->tid = 0;
        rcu_reader_reg->alloc = 0;
-       chunk->used -= sizeof(struct rcu_reader);
+       chunk->used--;
 }
 
 static
 }
 
 static
@@ -514,9 +506,9 @@ struct registry_chunk *find_chunk(struct rcu_reader *rcu_reader_reg)
        struct registry_chunk *chunk;
 
        cds_list_for_each_entry(chunk, &registry_arena.chunk_list, node) {
        struct registry_chunk *chunk;
 
        cds_list_for_each_entry(chunk, &registry_arena.chunk_list, node) {
-               if (rcu_reader_reg < (struct rcu_reader *) &chunk->data[0])
+               if (rcu_reader_reg < (struct urcu_bp_reader *) &chunk->readers[0])
                        continue;
                        continue;
-               if (rcu_reader_reg >= (struct rcu_reader *) &chunk->data[chunk->data_len])
+               if (rcu_reader_reg >= (struct urcu_bp_reader *) &chunk->readers[chunk->capacity])
                        continue;
                return chunk;
        }
                        continue;
                return chunk;
        }
@@ -564,7 +556,12 @@ end:
        if (ret)
                abort();
 }
        if (ret)
                abort();
 }
-URCU_ATTR_ALIAS("urcu_bp_register") void rcu_bp_register();
+
+void urcu_bp_register_thread(void)
+{
+       if (caa_unlikely(!URCU_TLS(urcu_bp_reader)))
+               urcu_bp_register(); /* If not yet registered. */
+}
 
 /* Disable signals, take mutex, remove from registry */
 static
 
 /* Disable signals, take mutex, remove from registry */
 static
@@ -660,8 +657,7 @@ void urcu_bp_exit(void)
 
                cds_list_for_each_entry_safe(chunk, tmp,
                                &registry_arena.chunk_list, node) {
 
                cds_list_for_each_entry_safe(chunk, tmp,
                                &registry_arena.chunk_list, node) {
-                       munmap((void *) chunk, chunk->data_len
-                                       + sizeof(struct registry_chunk));
+                       munmap((void *) chunk, chunk_allocation_size(chunk->capacity));
                }
                CDS_INIT_LIST_HEAD(&registry_arena.chunk_list);
                ret = pthread_key_delete(urcu_bp_key);
                }
                CDS_INIT_LIST_HEAD(&registry_arena.chunk_list);
                ret = pthread_key_delete(urcu_bp_key);
@@ -671,6 +667,13 @@ void urcu_bp_exit(void)
        mutex_unlock(&init_lock);
 }
 
        mutex_unlock(&init_lock);
 }
 
+static
+void urcu_bp_exit_destructor(void)
+{
+       urcu_call_rcu_exit();
+       urcu_bp_exit();
+}
+
 /*
  * Holding the rcu_gp_lock and rcu_registry_lock across fork will make
  * sure we fork() don't race with a concurrent thread executing with
 /*
  * Holding the rcu_gp_lock and rcu_registry_lock across fork will make
  * sure we fork() don't race with a concurrent thread executing with
@@ -683,14 +686,13 @@ void urcu_bp_before_fork(void)
        int ret;
 
        ret = sigfillset(&newmask);
        int ret;
 
        ret = sigfillset(&newmask);
-       assert(!ret);
+       urcu_posix_assert(!ret);
        ret = pthread_sigmask(SIG_BLOCK, &newmask, &oldmask);
        ret = pthread_sigmask(SIG_BLOCK, &newmask, &oldmask);
-       assert(!ret);
+       urcu_posix_assert(!ret);
        mutex_lock(&rcu_gp_lock);
        mutex_lock(&rcu_registry_lock);
        saved_fork_signal_mask = oldmask;
 }
        mutex_lock(&rcu_gp_lock);
        mutex_lock(&rcu_registry_lock);
        saved_fork_signal_mask = oldmask;
 }
-URCU_ATTR_ALIAS("urcu_bp_before_fork") void rcu_bp_before_fork();
 
 void urcu_bp_after_fork_parent(void)
 {
 
 void urcu_bp_after_fork_parent(void)
 {
@@ -701,10 +703,8 @@ void urcu_bp_after_fork_parent(void)
        mutex_unlock(&rcu_registry_lock);
        mutex_unlock(&rcu_gp_lock);
        ret = pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
        mutex_unlock(&rcu_registry_lock);
        mutex_unlock(&rcu_gp_lock);
        ret = pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 }
 }
-URCU_ATTR_ALIAS("urcu_bp_after_fork_parent")
-void rcu_bp_after_fork_parent(void);
 
 /*
  * Prune all entries from registry except our own thread. Fits the Linux
 
 /*
  * Prune all entries from registry except our own thread. Fits the Linux
@@ -714,17 +714,18 @@ static
 void urcu_bp_prune_registry(void)
 {
        struct registry_chunk *chunk;
 void urcu_bp_prune_registry(void)
 {
        struct registry_chunk *chunk;
-       struct urcu_bp_reader *rcu_reader_reg;
 
        cds_list_for_each_entry(chunk, &registry_arena.chunk_list, node) {
 
        cds_list_for_each_entry(chunk, &registry_arena.chunk_list, node) {
-               for (rcu_reader_reg = (struct urcu_bp_reader *) &chunk->data[0];
-                               rcu_reader_reg < (struct urcu_bp_reader *) &chunk->data[chunk->data_len];
-                               rcu_reader_reg++) {
-                       if (!rcu_reader_reg->alloc)
+               size_t spot_idx;
+
+               for (spot_idx = 0; spot_idx < chunk->capacity; spot_idx++) {
+                       struct urcu_bp_reader *reader = &chunk->readers[spot_idx];
+
+                       if (!reader->alloc)
                                continue;
                                continue;
-                       if (rcu_reader_reg->tid == pthread_self())
+                       if (reader->tid == pthread_self())
                                continue;
                                continue;
-                       cleanup_thread(chunk, rcu_reader_reg);
+                       cleanup_thread(chunk, reader);
                }
        }
 }
                }
        }
 }
@@ -739,17 +740,13 @@ void urcu_bp_after_fork_child(void)
        mutex_unlock(&rcu_registry_lock);
        mutex_unlock(&rcu_gp_lock);
        ret = pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
        mutex_unlock(&rcu_registry_lock);
        mutex_unlock(&rcu_gp_lock);
        ret = pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 }
 }
-URCU_ATTR_ALIAS("urcu_bp_after_fork_child")
-void rcu_bp_after_fork_child(void);
 
 void *urcu_bp_dereference_sym(void *p)
 {
        return _rcu_dereference(p);
 }
 
 void *urcu_bp_dereference_sym(void *p)
 {
        return _rcu_dereference(p);
 }
-URCU_ATTR_ALIAS("urcu_bp_dereference_sym")
-void *rcu_dereference_sym_bp();
 
 void *urcu_bp_set_pointer_sym(void **p, void *v)
 {
 
 void *urcu_bp_set_pointer_sym(void **p, void *v)
 {
@@ -757,27 +754,21 @@ void *urcu_bp_set_pointer_sym(void **p, void *v)
        uatomic_set(p, v);
        return v;
 }
        uatomic_set(p, v);
        return v;
 }
-URCU_ATTR_ALIAS("urcu_bp_set_pointer_sym")
-void *rcu_set_pointer_sym_bp();
 
 void *urcu_bp_xchg_pointer_sym(void **p, void *v)
 {
        cmm_wmb();
        return uatomic_xchg(p, v);
 }
 
 void *urcu_bp_xchg_pointer_sym(void **p, void *v)
 {
        cmm_wmb();
        return uatomic_xchg(p, v);
 }
-URCU_ATTR_ALIAS("urcu_bp_xchg_pointer_sym")
-void *rcu_xchg_pointer_sym_bp();
 
 void *urcu_bp_cmpxchg_pointer_sym(void **p, void *old, void *_new)
 {
        cmm_wmb();
        return uatomic_cmpxchg(p, old, _new);
 }
 
 void *urcu_bp_cmpxchg_pointer_sym(void **p, void *old, void *_new)
 {
        cmm_wmb();
        return uatomic_cmpxchg(p, old, _new);
 }
-URCU_ATTR_ALIAS("urcu_bp_cmpxchg_pointer_sym")
-void *rcu_cmpxchg_pointer_sym_bp();
 
 DEFINE_RCU_FLAVOR(rcu_flavor);
 
 DEFINE_RCU_FLAVOR(rcu_flavor);
-DEFINE_RCU_FLAVOR_ALIAS(rcu_flavor, alias_rcu_flavor);
 
 #include "urcu-call-rcu-impl.h"
 #include "urcu-defer-impl.h"
 
 #include "urcu-call-rcu-impl.h"
 #include "urcu-defer-impl.h"
+#include "urcu-poll-impl.h"
index b6ec6ba3913fd1546a39485a3764a7488e7112bb..2ea1efcd19c978f4a144aa4f7300ecdae8e67101 100644 (file)
@@ -1,30 +1,15 @@
+// SPDX-FileCopyrightText: 2010 Paul E. McKenney <paulmck@linux.vnet.ibm.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * urcu-call-rcu.c
- *
  * Userspace RCU library - batch memory reclamation with kernel API
  * Userspace RCU library - batch memory reclamation with kernel API
- *
- * Copyright (c) 2010 Paul E. McKenney <paulmck@linux.vnet.ibm.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #define _LGPL_SOURCE
 #include <stdio.h>
 #include <pthread.h>
 #include <signal.h>
  */
 
 #define _LGPL_SOURCE
 #include <stdio.h>
 #include <pthread.h>
 #include <signal.h>
-#include <assert.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include <string.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include <string.h>
@@ -35,6 +20,7 @@
 #include <sched.h>
 
 #include "compat-getcpu.h"
 #include <sched.h>
 
 #include "compat-getcpu.h"
+#include <urcu/assert.h>
 #include <urcu/wfcqueue.h>
 #include <urcu/call-rcu.h>
 #include <urcu/pointer.h>
 #include <urcu/wfcqueue.h>
 #include <urcu/call-rcu.h>
 #include <urcu/pointer.h>
@@ -44,6 +30,7 @@
 #include <urcu/ref.h>
 #include "urcu-die.h"
 #include "urcu-utils.h"
 #include <urcu/ref.h>
 #include "urcu-die.h"
 #include "urcu-utils.h"
+#include "compat-smp.h"
 
 #define SET_AFFINITY_CHECK_PERIOD              (1U << 8)       /* 256 */
 #define SET_AFFINITY_CHECK_PERIOD_MASK         (SET_AFFINITY_CHECK_PERIOD - 1)
 
 #define SET_AFFINITY_CHECK_PERIOD              (1U << 8)       /* 256 */
 #define SET_AFFINITY_CHECK_PERIOD_MASK         (SET_AFFINITY_CHECK_PERIOD - 1)
@@ -80,6 +67,10 @@ struct call_rcu_completion_work {
        struct call_rcu_completion *completion;
 };
 
        struct call_rcu_completion *completion;
 };
 
+enum crdf_flags {
+       CRDF_FLAG_JOIN_THREAD = (1 << 0),
+};
+
 /*
  * List of all call_rcu_data structures to keep valgrind happy.
  * Protected by call_rcu_mutex.
 /*
  * List of all call_rcu_data structures to keep valgrind happy.
  * Protected by call_rcu_mutex.
@@ -101,7 +92,6 @@ static pthread_mutex_t call_rcu_mutex = PTHREAD_MUTEX_INITIALIZER;
 static struct call_rcu_data *default_call_rcu_data;
 
 static struct urcu_atfork *registered_rculfhash_atfork;
 static struct call_rcu_data *default_call_rcu_data;
 
 static struct urcu_atfork *registered_rculfhash_atfork;
-static unsigned long registered_rculfhash_atfork_refcount;
 
 /*
  * If the sched_getcpu() and sysconf(_SC_NPROCESSORS_CONF) calls are
 
 /*
  * If the sched_getcpu() and sysconf(_SC_NPROCESSORS_CONF) calls are
@@ -120,11 +110,11 @@ static unsigned long registered_rculfhash_atfork_refcount;
  */
 
 static struct call_rcu_data **per_cpu_call_rcu_data;
  */
 
 static struct call_rcu_data **per_cpu_call_rcu_data;
-static long maxcpus;
+static long cpus_array_len;
 
 
-static void maxcpus_reset(void)
+static void cpus_array_len_reset(void)
 {
 {
-       maxcpus = 0;
+       cpus_array_len = 0;
 }
 
 /* Allocate the array if it has not already been allocated. */
 }
 
 /* Allocate the array if it has not already been allocated. */
@@ -134,15 +124,15 @@ static void alloc_cpu_call_rcu_data(void)
        struct call_rcu_data **p;
        static int warned = 0;
 
        struct call_rcu_data **p;
        static int warned = 0;
 
-       if (maxcpus != 0)
+       if (cpus_array_len != 0)
                return;
                return;
-       maxcpus = sysconf(_SC_NPROCESSORS_CONF);
-       if (maxcpus <= 0) {
+       cpus_array_len = get_possible_cpus_array_len();
+       if (cpus_array_len <= 0) {
                return;
        }
                return;
        }
-       p = malloc(maxcpus * sizeof(*per_cpu_call_rcu_data));
+       p = malloc(cpus_array_len * sizeof(*per_cpu_call_rcu_data));
        if (p != NULL) {
        if (p != NULL) {
-               memset(p, '\0', maxcpus * sizeof(*per_cpu_call_rcu_data));
+               memset(p, '\0', cpus_array_len * sizeof(*per_cpu_call_rcu_data));
                rcu_set_pointer(&per_cpu_call_rcu_data, p);
        } else {
                if (!warned) {
                rcu_set_pointer(&per_cpu_call_rcu_data, p);
        } else {
                if (!warned) {
@@ -160,9 +150,9 @@ static void alloc_cpu_call_rcu_data(void)
  * constant.
  */
 static struct call_rcu_data **per_cpu_call_rcu_data = NULL;
  * constant.
  */
 static struct call_rcu_data **per_cpu_call_rcu_data = NULL;
-static const long maxcpus = -1;
+static const long cpus_array_len = -1;
 
 
-static void maxcpus_reset(void)
+static void cpus_array_len_reset(void)
 {
 }
 
 {
 }
 
@@ -199,7 +189,7 @@ static void call_rcu_unlock(pthread_mutex_t *pmp)
  * Losing affinity can be caused by CPU hotunplug/hotplug, or by
  * cpuset(7).
  */
  * Losing affinity can be caused by CPU hotunplug/hotplug, or by
  * cpuset(7).
  */
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
 static
 int set_thread_cpu_affinity(struct call_rcu_data *crdp)
 {
 static
 int set_thread_cpu_affinity(struct call_rcu_data *crdp)
 {
@@ -215,11 +205,8 @@ int set_thread_cpu_affinity(struct call_rcu_data *crdp)
 
        CPU_ZERO(&mask);
        CPU_SET(crdp->cpu_affinity, &mask);
 
        CPU_ZERO(&mask);
        CPU_SET(crdp->cpu_affinity, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       ret = sched_setaffinity(0, &mask);
-#else
        ret = sched_setaffinity(0, sizeof(mask), &mask);
        ret = sched_setaffinity(0, sizeof(mask), &mask);
-#endif
+
        /*
         * EINVAL is fine: can be caused by hotunplugged CPUs, or by
         * cpuset(7). This is why we should always retry if we detect
        /*
         * EINVAL is fine: can be caused by hotunplugged CPUs, or by
         * cpuset(7). This is why we should always retry if we detect
@@ -233,7 +220,7 @@ int set_thread_cpu_affinity(struct call_rcu_data *crdp)
 }
 #else
 static
 }
 #else
 static
-int set_thread_cpu_affinity(struct call_rcu_data *crdp)
+int set_thread_cpu_affinity(struct call_rcu_data *crdp __attribute__((unused)))
 {
        return 0;
 }
 {
        return 0;
 }
@@ -243,17 +230,25 @@ static void call_rcu_wait(struct call_rcu_data *crdp)
 {
        /* Read call_rcu list before read futex */
        cmm_smp_mb();
 {
        /* Read call_rcu list before read futex */
        cmm_smp_mb();
-       if (uatomic_read(&crdp->futex) != -1)
-               return;
-       while (futex_async(&crdp->futex, FUTEX_WAIT, -1,
-                       NULL, NULL, 0)) {
+       while (uatomic_read(&crdp->futex) == -1) {
+               if (!futex_async(&crdp->futex, FUTEX_WAIT, -1, NULL, NULL, 0)) {
+                       /*
+                        * Prior queued wakeups queued by unrelated code
+                        * using the same address can cause futex wait to
+                        * return 0 even through the futex value is still
+                        * -1 (spurious wakeups). Check the value again
+                        * in user-space to validate whether it really
+                        * differs from -1.
+                        */
+                       continue;
+               }
                switch (errno) {
                switch (errno) {
-               case EWOULDBLOCK:
+               case EAGAIN:
                        /* Value already changed. */
                        return;
                case EINTR:
                        /* Retry if interrupted by signal. */
                        /* Value already changed. */
                        return;
                case EINTR:
                        /* Retry if interrupted by signal. */
-                       break;  /* Get out of switch. */
+                       break;  /* Get out of switch. Check again. */
                default:
                        /* Unexpected error. */
                        urcu_die(errno);
                default:
                        /* Unexpected error. */
                        urcu_die(errno);
@@ -277,17 +272,25 @@ static void call_rcu_completion_wait(struct call_rcu_completion *completion)
 {
        /* Read completion barrier count before read futex */
        cmm_smp_mb();
 {
        /* Read completion barrier count before read futex */
        cmm_smp_mb();
-       if (uatomic_read(&completion->futex) != -1)
-               return;
-       while (futex_async(&completion->futex, FUTEX_WAIT, -1,
-                       NULL, NULL, 0)) {
+       while (uatomic_read(&completion->futex) == -1) {
+               if (!futex_async(&completion->futex, FUTEX_WAIT, -1, NULL, NULL, 0)) {
+                       /*
+                        * Prior queued wakeups queued by unrelated code
+                        * using the same address can cause futex wait to
+                        * return 0 even through the futex value is still
+                        * -1 (spurious wakeups). Check the value again
+                        * in user-space to validate whether it really
+                        * differs from -1.
+                        */
+                       continue;
+               }
                switch (errno) {
                switch (errno) {
-               case EWOULDBLOCK:
+               case EAGAIN:
                        /* Value already changed. */
                        return;
                case EINTR:
                        /* Retry if interrupted by signal. */
                        /* Value already changed. */
                        return;
                case EINTR:
                        /* Retry if interrupted by signal. */
-                       break;  /* Get out of switch. */
+                       break;  /* Get out of switch. Check again. */
                default:
                        /* Unexpected error. */
                        urcu_die(errno);
                default:
                        /* Unexpected error. */
                        urcu_die(errno);
@@ -358,8 +361,8 @@ static void *call_rcu_thread(void *arg)
                cds_wfcq_init(&cbs_tmp_head, &cbs_tmp_tail);
                splice_ret = __cds_wfcq_splice_blocking(&cbs_tmp_head,
                        &cbs_tmp_tail, &crdp->cbs_head, &crdp->cbs_tail);
                cds_wfcq_init(&cbs_tmp_head, &cbs_tmp_tail);
                splice_ret = __cds_wfcq_splice_blocking(&cbs_tmp_head,
                        &cbs_tmp_tail, &crdp->cbs_head, &crdp->cbs_tail);
-               assert(splice_ret != CDS_WFCQ_RET_WOULDBLOCK);
-               assert(splice_ret != CDS_WFCQ_RET_DEST_NON_EMPTY);
+               urcu_posix_assert(splice_ret != CDS_WFCQ_RET_WOULDBLOCK);
+               urcu_posix_assert(splice_ret != CDS_WFCQ_RET_DEST_NON_EMPTY);
                if (splice_ret != CDS_WFCQ_RET_SRC_EMPTY) {
                        synchronize_rcu();
                        cbcount = 0;
                if (splice_ret != CDS_WFCQ_RET_SRC_EMPTY) {
                        synchronize_rcu();
                        cbcount = 0;
@@ -420,6 +423,7 @@ static void call_rcu_data_init(struct call_rcu_data **crdpp,
 {
        struct call_rcu_data *crdp;
        int ret;
 {
        struct call_rcu_data *crdp;
        int ret;
+       sigset_t newmask, oldmask;
 
        crdp = malloc(sizeof(*crdp));
        if (crdp == NULL)
 
        crdp = malloc(sizeof(*crdp));
        if (crdp == NULL)
@@ -432,11 +436,19 @@ static void call_rcu_data_init(struct call_rcu_data **crdpp,
        cds_list_add(&crdp->list, &call_rcu_data_list);
        crdp->cpu_affinity = cpu_affinity;
        crdp->gp_count = 0;
        cds_list_add(&crdp->list, &call_rcu_data_list);
        crdp->cpu_affinity = cpu_affinity;
        crdp->gp_count = 0;
-       cmm_smp_mb();  /* Structure initialized before pointer is planted. */
-       *crdpp = crdp;
+       rcu_set_pointer(crdpp, crdp);
+
+       ret = sigfillset(&newmask);
+       urcu_posix_assert(!ret);
+       ret = pthread_sigmask(SIG_BLOCK, &newmask, &oldmask);
+       urcu_posix_assert(!ret);
+
        ret = pthread_create(&crdp->tid, NULL, call_rcu_thread, crdp);
        if (ret)
                urcu_die(ret);
        ret = pthread_create(&crdp->tid, NULL, call_rcu_thread, crdp);
        if (ret)
                urcu_die(ret);
+
+       ret = pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
+       urcu_posix_assert(!ret);
 }
 
 /*
 }
 
 /*
@@ -457,16 +469,14 @@ struct call_rcu_data *get_cpu_call_rcu_data(int cpu)
        pcpu_crdp = rcu_dereference(per_cpu_call_rcu_data);
        if (pcpu_crdp == NULL)
                return NULL;
        pcpu_crdp = rcu_dereference(per_cpu_call_rcu_data);
        if (pcpu_crdp == NULL)
                return NULL;
-       if (!warned && maxcpus > 0 && (cpu < 0 || maxcpus <= cpu)) {
+       if (!warned && cpus_array_len > 0 && (cpu < 0 || cpus_array_len <= cpu)) {
                fprintf(stderr, "[error] liburcu: get CPU # out of range\n");
                warned = 1;
        }
                fprintf(stderr, "[error] liburcu: get CPU # out of range\n");
                warned = 1;
        }
-       if (cpu < 0 || maxcpus <= cpu)
+       if (cpu < 0 || cpus_array_len <= cpu)
                return NULL;
        return rcu_dereference(pcpu_crdp[cpu]);
 }
                return NULL;
        return rcu_dereference(pcpu_crdp[cpu]);
 }
-URCU_ATTR_ALIAS(urcu_stringify(get_cpu_call_rcu_data))
-struct call_rcu_data *alias_get_cpu_call_rcu_data();
 
 /*
  * Return the tid corresponding to the call_rcu thread whose
 
 /*
  * Return the tid corresponding to the call_rcu thread whose
@@ -477,8 +487,6 @@ pthread_t get_call_rcu_thread(struct call_rcu_data *crdp)
 {
        return crdp->tid;
 }
 {
        return crdp->tid;
 }
-URCU_ATTR_ALIAS(urcu_stringify(get_call_rcu_thread))
-pthread_t alias_get_call_rcu_thread();
 
 /*
  * Create a call_rcu_data structure (with thread) and return a pointer.
 
 /*
  * Create a call_rcu_data structure (with thread) and return a pointer.
@@ -493,8 +501,6 @@ static struct call_rcu_data *__create_call_rcu_data(unsigned long flags,
        return crdp;
 }
 
        return crdp;
 }
 
-URCU_ATTR_ALIAS(urcu_stringify(create_call_rcu_data))
-struct call_rcu_data *alias_create_call_rcu_data();
 struct call_rcu_data *create_call_rcu_data(unsigned long flags,
                                           int cpu_affinity)
 {
 struct call_rcu_data *create_call_rcu_data(unsigned long flags,
                                           int cpu_affinity)
 {
@@ -525,7 +531,7 @@ int set_cpu_call_rcu_data(int cpu, struct call_rcu_data *crdp)
 
        call_rcu_lock(&call_rcu_mutex);
        alloc_cpu_call_rcu_data();
 
        call_rcu_lock(&call_rcu_mutex);
        alloc_cpu_call_rcu_data();
-       if (cpu < 0 || maxcpus <= cpu) {
+       if (cpu < 0 || cpus_array_len <= cpu) {
                if (!warned) {
                        fprintf(stderr, "[error] liburcu: set CPU # out of range\n");
                        warned = 1;
                if (!warned) {
                        fprintf(stderr, "[error] liburcu: set CPU # out of range\n");
                        warned = 1;
@@ -551,30 +557,31 @@ int set_cpu_call_rcu_data(int cpu, struct call_rcu_data *crdp)
        call_rcu_unlock(&call_rcu_mutex);
        return 0;
 }
        call_rcu_unlock(&call_rcu_mutex);
        return 0;
 }
-URCU_ATTR_ALIAS(urcu_stringify(set_cpu_call_rcu_data))
-int alias_set_cpu_call_rcu_data();
 
 /*
  * Return a pointer to the default call_rcu_data structure, creating
 
 /*
  * Return a pointer to the default call_rcu_data structure, creating
- * one if need be.  Because we never free call_rcu_data structures,
- * we don't need to be in an RCU read-side critical section.
+ * one if need be.
+ *
+ * The call to this function with intent to use the returned
+ * call_rcu_data should be protected by RCU read-side lock.
  */
 
 struct call_rcu_data *get_default_call_rcu_data(void)
 {
  */
 
 struct call_rcu_data *get_default_call_rcu_data(void)
 {
-       if (default_call_rcu_data != NULL)
-               return rcu_dereference(default_call_rcu_data);
+       struct call_rcu_data *crdp;
+
+       crdp = rcu_dereference(default_call_rcu_data);
+       if (crdp != NULL)
+               return crdp;
+
        call_rcu_lock(&call_rcu_mutex);
        call_rcu_lock(&call_rcu_mutex);
-       if (default_call_rcu_data != NULL) {
-               call_rcu_unlock(&call_rcu_mutex);
-               return default_call_rcu_data;
-       }
-       call_rcu_data_init(&default_call_rcu_data, 0, -1);
+       if (default_call_rcu_data == NULL)
+               call_rcu_data_init(&default_call_rcu_data, 0, -1);
+       crdp = default_call_rcu_data;
        call_rcu_unlock(&call_rcu_mutex);
        call_rcu_unlock(&call_rcu_mutex);
-       return default_call_rcu_data;
+
+       return crdp;
 }
 }
-URCU_ATTR_ALIAS(urcu_stringify(get_default_call_rcu_data))
-struct call_rcu_data *alias_get_default_call_rcu_data();
 
 /*
  * Return the call_rcu_data structure that applies to the currently
 
 /*
  * Return the call_rcu_data structure that applies to the currently
@@ -594,7 +601,7 @@ struct call_rcu_data *get_call_rcu_data(void)
        if (URCU_TLS(thread_call_rcu_data) != NULL)
                return URCU_TLS(thread_call_rcu_data);
 
        if (URCU_TLS(thread_call_rcu_data) != NULL)
                return URCU_TLS(thread_call_rcu_data);
 
-       if (maxcpus > 0) {
+       if (cpus_array_len > 0) {
                crd = get_cpu_call_rcu_data(urcu_sched_getcpu());
                if (crd)
                        return crd;
                crd = get_cpu_call_rcu_data(urcu_sched_getcpu());
                if (crd)
                        return crd;
@@ -602,8 +609,6 @@ struct call_rcu_data *get_call_rcu_data(void)
 
        return get_default_call_rcu_data();
 }
 
        return get_default_call_rcu_data();
 }
-URCU_ATTR_ALIAS(urcu_stringify(get_call_rcu_data))
-struct call_rcu_data *alias_get_call_rcu_data();
 
 /*
  * Return a pointer to this task's call_rcu_data if there is one.
 
 /*
  * Return a pointer to this task's call_rcu_data if there is one.
@@ -613,8 +618,6 @@ struct call_rcu_data *get_thread_call_rcu_data(void)
 {
        return URCU_TLS(thread_call_rcu_data);
 }
 {
        return URCU_TLS(thread_call_rcu_data);
 }
-URCU_ATTR_ALIAS(urcu_stringify(get_thread_call_rcu_data))
-struct call_rcu_data *alias_get_thread_call_rcu_data();
 
 /*
  * Set this task's call_rcu_data structure as specified, regardless
 
 /*
  * Set this task's call_rcu_data structure as specified, regardless
@@ -631,8 +634,6 @@ void set_thread_call_rcu_data(struct call_rcu_data *crdp)
 {
        URCU_TLS(thread_call_rcu_data) = crdp;
 }
 {
        URCU_TLS(thread_call_rcu_data) = crdp;
 }
-URCU_ATTR_ALIAS(urcu_stringify(set_thread_call_rcu_data))
-void alias_set_thread_call_rcu_data();
 
 /*
  * Create a separate call_rcu thread for each CPU.  This does not
 
 /*
  * Create a separate call_rcu thread for each CPU.  This does not
@@ -651,7 +652,7 @@ int create_all_cpu_call_rcu_data(unsigned long flags)
        call_rcu_lock(&call_rcu_mutex);
        alloc_cpu_call_rcu_data();
        call_rcu_unlock(&call_rcu_mutex);
        call_rcu_lock(&call_rcu_mutex);
        alloc_cpu_call_rcu_data();
        call_rcu_unlock(&call_rcu_mutex);
-       if (maxcpus <= 0) {
+       if (cpus_array_len <= 0) {
                errno = EINVAL;
                return -EINVAL;
        }
                errno = EINVAL;
                return -EINVAL;
        }
@@ -659,7 +660,7 @@ int create_all_cpu_call_rcu_data(unsigned long flags)
                errno = ENOMEM;
                return -ENOMEM;
        }
                errno = ENOMEM;
                return -ENOMEM;
        }
-       for (i = 0; i < maxcpus; i++) {
+       for (i = 0; i < cpus_array_len; i++) {
                call_rcu_lock(&call_rcu_mutex);
                if (get_cpu_call_rcu_data(i)) {
                        call_rcu_unlock(&call_rcu_mutex);
                call_rcu_lock(&call_rcu_mutex);
                if (get_cpu_call_rcu_data(i)) {
                        call_rcu_unlock(&call_rcu_mutex);
@@ -684,8 +685,6 @@ int create_all_cpu_call_rcu_data(unsigned long flags)
        }
        return 0;
 }
        }
        return 0;
 }
-URCU_ATTR_ALIAS(urcu_stringify(create_all_cpu_call_rcu_data))
-int alias_create_all_cpu_call_rcu_data();
 
 /*
  * Wake up the call_rcu thread corresponding to the specified
 
 /*
  * Wake up the call_rcu thread corresponding to the specified
@@ -733,7 +732,6 @@ void call_rcu(struct rcu_head *head,
        _call_rcu(head, func, crdp);
        _rcu_read_unlock();
 }
        _call_rcu(head, func, crdp);
        _rcu_read_unlock();
 }
-URCU_ATTR_ALIAS(urcu_stringify(call_rcu)) void alias_call_rcu();
 
 /*
  * Free up the specified call_rcu_data structure, terminating the
 
 /*
  * Free up the specified call_rcu_data structure, terminating the
@@ -761,7 +759,8 @@ URCU_ATTR_ALIAS(urcu_stringify(call_rcu)) void alias_call_rcu();
  * a list corruption bug in the 0.7.x series. The equivalent fix
  * appeared in 0.6.8 for the stable-0.6 branch.
  */
  * a list corruption bug in the 0.7.x series. The equivalent fix
  * appeared in 0.6.8 for the stable-0.6 branch.
  */
-void call_rcu_data_free(struct call_rcu_data *crdp)
+static
+void _call_rcu_data_free(struct call_rcu_data *crdp, unsigned int flags)
 {
        if (crdp == NULL || crdp == default_call_rcu_data) {
                return;
 {
        if (crdp == NULL || crdp == default_call_rcu_data) {
                return;
@@ -772,9 +771,13 @@ void call_rcu_data_free(struct call_rcu_data *crdp)
                while ((uatomic_read(&crdp->flags) & URCU_CALL_RCU_STOPPED) == 0)
                        (void) poll(NULL, 0, 1);
        }
                while ((uatomic_read(&crdp->flags) & URCU_CALL_RCU_STOPPED) == 0)
                        (void) poll(NULL, 0, 1);
        }
+       call_rcu_lock(&call_rcu_mutex);
        if (!cds_wfcq_empty(&crdp->cbs_head, &crdp->cbs_tail)) {
        if (!cds_wfcq_empty(&crdp->cbs_head, &crdp->cbs_tail)) {
-               /* Create default call rcu data if need be */
+               call_rcu_unlock(&call_rcu_mutex);
+               /* Create default call rcu data if need be. */
+               /* CBs queued here will be handed to the default list. */
                (void) get_default_call_rcu_data();
                (void) get_default_call_rcu_data();
+               call_rcu_lock(&call_rcu_mutex);
                __cds_wfcq_splice_blocking(&default_call_rcu_data->cbs_head,
                        &default_call_rcu_data->cbs_tail,
                        &crdp->cbs_head, &crdp->cbs_tail);
                __cds_wfcq_splice_blocking(&default_call_rcu_data->cbs_head,
                        &default_call_rcu_data->cbs_tail,
                        &crdp->cbs_head, &crdp->cbs_tail);
@@ -783,14 +786,23 @@ void call_rcu_data_free(struct call_rcu_data *crdp)
                wake_call_rcu_thread(default_call_rcu_data);
        }
 
                wake_call_rcu_thread(default_call_rcu_data);
        }
 
-       call_rcu_lock(&call_rcu_mutex);
        cds_list_del(&crdp->list);
        call_rcu_unlock(&call_rcu_mutex);
 
        cds_list_del(&crdp->list);
        call_rcu_unlock(&call_rcu_mutex);
 
+       if (flags & CRDF_FLAG_JOIN_THREAD) {
+               int ret;
+
+               ret = pthread_join(get_call_rcu_thread(crdp), NULL);
+               if (ret)
+                       urcu_die(ret);
+       }
        free(crdp);
 }
        free(crdp);
 }
-URCU_ATTR_ALIAS(urcu_stringify(call_rcu_data_free))
-void alias_call_rcu_data_free();
+
+void call_rcu_data_free(struct call_rcu_data *crdp)
+{
+       _call_rcu_data_free(crdp, CRDF_FLAG_JOIN_THREAD);
+}
 
 /*
  * Clean up all the per-CPU call_rcu threads.
 
 /*
  * Clean up all the per-CPU call_rcu threads.
@@ -801,10 +813,10 @@ void free_all_cpu_call_rcu_data(void)
        struct call_rcu_data **crdp;
        static int warned = 0;
 
        struct call_rcu_data **crdp;
        static int warned = 0;
 
-       if (maxcpus <= 0)
+       if (cpus_array_len <= 0)
                return;
 
                return;
 
-       crdp = malloc(sizeof(*crdp) * maxcpus);
+       crdp = malloc(sizeof(*crdp) * cpus_array_len);
        if (!crdp) {
                if (!warned) {
                        fprintf(stderr, "[error] liburcu: unable to allocate per-CPU pointer array\n");
        if (!crdp) {
                if (!warned) {
                        fprintf(stderr, "[error] liburcu: unable to allocate per-CPU pointer array\n");
@@ -813,7 +825,7 @@ void free_all_cpu_call_rcu_data(void)
                return;
        }
 
                return;
        }
 
-       for (cpu = 0; cpu < maxcpus; cpu++) {
+       for (cpu = 0; cpu < cpus_array_len; cpu++) {
                crdp[cpu] = get_cpu_call_rcu_data(cpu);
                if (crdp[cpu] == NULL)
                        continue;
                crdp[cpu] = get_cpu_call_rcu_data(cpu);
                if (crdp[cpu] == NULL)
                        continue;
@@ -824,23 +836,13 @@ void free_all_cpu_call_rcu_data(void)
         * call_rcu_data to become quiescent.
         */
        synchronize_rcu();
         * call_rcu_data to become quiescent.
         */
        synchronize_rcu();
-       for (cpu = 0; cpu < maxcpus; cpu++) {
+       for (cpu = 0; cpu < cpus_array_len; cpu++) {
                if (crdp[cpu] == NULL)
                        continue;
                call_rcu_data_free(crdp[cpu]);
        }
        free(crdp);
 }
                if (crdp[cpu] == NULL)
                        continue;
                call_rcu_data_free(crdp[cpu]);
        }
        free(crdp);
 }
-#ifdef RCU_QSBR
-/* ABI6 has a non-namespaced free_all_cpu_call_rcu_data for qsbr */
-#undef free_all_cpu_call_rcu_data
-URCU_ATTR_ALIAS("urcu_qsbr_free_all_cpu_call_rcu_data")
-void free_all_cpu_call_rcu_data();
-#define free_all_cpu_call_rcu_data urcu_qsbr_free_all_cpu_call_rcu_data
-#else
-URCU_ATTR_ALIAS(urcu_stringify(free_all_cpu_call_rcu_data))
-void alias_free_all_cpu_call_rcu_data();
-#endif
 
 static
 void free_completion(struct urcu_ref *ref)
 
 static
 void free_completion(struct urcu_ref *ref)
@@ -893,7 +895,7 @@ void rcu_barrier(void)
                goto online;
        }
 
                goto online;
        }
 
-       completion = calloc(sizeof(*completion), 1);
+       completion = calloc(1, sizeof(*completion));
        if (!completion)
                urcu_die(errno);
 
        if (!completion)
                urcu_die(errno);
 
@@ -908,7 +910,7 @@ void rcu_barrier(void)
        cds_list_for_each_entry(crdp, &call_rcu_data_list, list) {
                struct call_rcu_completion_work *work;
 
        cds_list_for_each_entry(crdp, &call_rcu_data_list, list) {
                struct call_rcu_completion_work *work;
 
-               work = calloc(sizeof(*work), 1);
+               work = calloc(1, sizeof(*work));
                if (!work)
                        urcu_die(errno);
                work->completion = completion;
                if (!work)
                        urcu_die(errno);
                work->completion = completion;
@@ -932,8 +934,6 @@ online:
        if (was_online)
                rcu_thread_online();
 }
        if (was_online)
                rcu_thread_online();
 }
-URCU_ATTR_ALIAS(urcu_stringify(rcu_barrier))
-void alias_rcu_barrier();
 
 /*
  * Acquire the call_rcu_mutex in order to ensure that the child sees
 
 /*
  * Acquire the call_rcu_mutex in order to ensure that the child sees
@@ -962,8 +962,6 @@ void call_rcu_before_fork(void)
                        (void) poll(NULL, 0, 1);
        }
 }
                        (void) poll(NULL, 0, 1);
        }
 }
-URCU_ATTR_ALIAS(urcu_stringify(call_rcu_before_fork))
-void alias_call_rcu_before_fork();
 
 /*
  * Clean up call_rcu data structures in the parent of a successful fork()
 
 /*
  * Clean up call_rcu data structures in the parent of a successful fork()
@@ -986,8 +984,6 @@ void call_rcu_after_fork_parent(void)
                atfork->after_fork_parent(atfork->priv);
        call_rcu_unlock(&call_rcu_mutex);
 }
                atfork->after_fork_parent(atfork->priv);
        call_rcu_unlock(&call_rcu_mutex);
 }
-URCU_ATTR_ALIAS(urcu_stringify(call_rcu_after_fork_parent))
-void alias_call_rcu_after_fork_parent();
 
 /*
  * Clean up call_rcu data structures in the child of a successful fork()
 
 /*
  * Clean up call_rcu data structures in the child of a successful fork()
@@ -1018,7 +1014,7 @@ void call_rcu_after_fork_child(void)
        (void)get_default_call_rcu_data();
 
        /* Cleanup call_rcu_data pointers before use */
        (void)get_default_call_rcu_data();
 
        /* Cleanup call_rcu_data pointers before use */
-       maxcpus_reset();
+       cpus_array_len_reset();
        free(per_cpu_call_rcu_data);
        rcu_set_pointer(&per_cpu_call_rcu_data, NULL);
        URCU_TLS(thread_call_rcu_data) = NULL;
        free(per_cpu_call_rcu_data);
        rcu_set_pointer(&per_cpu_call_rcu_data, NULL);
        URCU_TLS(thread_call_rcu_data) = NULL;
@@ -1032,32 +1028,85 @@ void call_rcu_after_fork_child(void)
                if (crdp == default_call_rcu_data)
                        continue;
                uatomic_set(&crdp->flags, URCU_CALL_RCU_STOPPED);
                if (crdp == default_call_rcu_data)
                        continue;
                uatomic_set(&crdp->flags, URCU_CALL_RCU_STOPPED);
-               call_rcu_data_free(crdp);
+               /*
+                * Do not join the thread because it does not exist in
+                * the child.
+                */
+               _call_rcu_data_free(crdp, 0);
        }
 }
        }
 }
-URCU_ATTR_ALIAS(urcu_stringify(call_rcu_after_fork_child))
-void alias_call_rcu_after_fork_child();
 
 void urcu_register_rculfhash_atfork(struct urcu_atfork *atfork)
 {
 
 void urcu_register_rculfhash_atfork(struct urcu_atfork *atfork)
 {
+       if (CMM_LOAD_SHARED(registered_rculfhash_atfork))
+               return;
        call_rcu_lock(&call_rcu_mutex);
        call_rcu_lock(&call_rcu_mutex);
-       if (registered_rculfhash_atfork_refcount++)
-               goto end;
-       registered_rculfhash_atfork = atfork;
-end:
+       if (!registered_rculfhash_atfork)
+               registered_rculfhash_atfork = atfork;
        call_rcu_unlock(&call_rcu_mutex);
 }
        call_rcu_unlock(&call_rcu_mutex);
 }
-URCU_ATTR_ALIAS(urcu_stringify(urcu_register_rculfhash_atfork))
-void alias_urcu_register_rculfhash_atfork();
 
 
-void urcu_unregister_rculfhash_atfork(struct urcu_atfork *atfork)
+/*
+ * This unregistration function is deprecated, meant only for internal
+ * use by rculfhash.
+ */
+__attribute__((__noreturn__))
+void urcu_unregister_rculfhash_atfork(struct urcu_atfork *atfork __attribute__((unused)))
+{
+       urcu_die(EPERM);
+}
+
+/*
+ * Teardown the default call_rcu worker thread if there are no queued
+ * callbacks on process exit. This prevents leaking memory.
+ *
+ * Here is how an application can ensure graceful teardown of this
+ * worker thread:
+ *
+ * - An application queuing call_rcu callbacks should invoke
+ *   rcu_barrier() before it exits.
+ * - When chaining call_rcu callbacks, the number of calls to
+ *   rcu_barrier() on application exit must match at least the maximum
+ *   number of chained callbacks.
+ * - If an application chains callbacks endlessly, it would have to be
+ *   modified to stop chaining callbacks when it detects an application
+ *   exit (e.g. with a flag), and wait for quiescence with rcu_barrier()
+ *   after setting that flag.
+ * - The statements above apply to a library which queues call_rcu
+ *   callbacks, only it needs to invoke rcu_barrier in its library
+ *   destructor.
+ *
+ * Note that this function does not presume it is being called when the
+ * application is single-threaded even though this is invoked from a
+ * destructor: this function synchronizes against concurrent calls to
+ * get_default_call_rcu_data().
+ */
+static void urcu_call_rcu_exit(void)
 {
 {
+       struct call_rcu_data *crdp;
+       bool teardown = true;
+
+       if (default_call_rcu_data == NULL)
+               return;
        call_rcu_lock(&call_rcu_mutex);
        call_rcu_lock(&call_rcu_mutex);
-       if (--registered_rculfhash_atfork_refcount)
-               goto end;
-       registered_rculfhash_atfork = NULL;
-end:
+       /*
+        * If the application leaves callbacks in the default call_rcu
+        * worker queue, keep the default worker in place.
+        */
+       crdp = default_call_rcu_data;
+       if (!crdp) {
+               teardown = false;
+               goto unlock;
+       }
+       if (!cds_wfcq_empty(&crdp->cbs_head, &crdp->cbs_tail)) {
+               teardown = false;
+               goto unlock;
+       }
+       rcu_set_pointer(&default_call_rcu_data, NULL);
+unlock:
        call_rcu_unlock(&call_rcu_mutex);
        call_rcu_unlock(&call_rcu_mutex);
+       if (teardown) {
+               synchronize_rcu();
+               call_rcu_data_free(crdp);
+       }
 }
 }
-URCU_ATTR_ALIAS(urcu_stringify(urcu_unregister_rculfhash_atfork))
-void alias_urcu_unregister_rculfhash_atfork();
index b34a1a17b11adabd9cc8da0aca6d030106889755..a180c4875bf173ea70f70d93aa6d17f998919229 100644 (file)
@@ -1,31 +1,17 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_DEFER_IMPL_H
 #define _URCU_DEFER_IMPL_H
 
 /*
 #ifndef _URCU_DEFER_IMPL_H
 #define _URCU_DEFER_IMPL_H
 
 /*
- * urcu-defer-impl.h
- *
  * Userspace RCU header - memory reclamation.
  *
  * TO BE INCLUDED ONLY FROM URCU LIBRARY CODE. See urcu-defer.h for linking
  * dynamically with the userspace rcu reclamation library.
  *
  * Userspace RCU header - memory reclamation.
  *
  * TO BE INCLUDED ONLY FROM URCU LIBRARY CODE. See urcu-defer.h for linking
  * dynamically with the userspace rcu reclamation library.
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
@@ -33,7 +19,6 @@
 #include <pthread.h>
 #include <stdio.h>
 #include <signal.h>
 #include <pthread.h>
 #include <stdio.h>
 #include <signal.h>
-#include <assert.h>
 #include <string.h>
 #include <errno.h>
 #include <poll.h>
 #include <string.h>
 #include <errno.h>
 #include <poll.h>
@@ -43,6 +28,7 @@
 
 #include "urcu/futex.h"
 
 
 #include "urcu/futex.h"
 
+#include <urcu/assert.h>
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
 #include <urcu/uatomic.h>
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
 #include <urcu/uatomic.h>
@@ -194,17 +180,25 @@ static void wait_defer(void)
                uatomic_set(&defer_thread_futex, 0);
        } else {
                cmm_smp_rmb();  /* Read queue before read futex */
                uatomic_set(&defer_thread_futex, 0);
        } else {
                cmm_smp_rmb();  /* Read queue before read futex */
-               if (uatomic_read(&defer_thread_futex) != -1)
-                       return;
-               while (futex_noasync(&defer_thread_futex, FUTEX_WAIT, -1,
-                               NULL, NULL, 0)) {
+               while (uatomic_read(&defer_thread_futex) == -1) {
+                       if (!futex_noasync(&defer_thread_futex, FUTEX_WAIT, -1, NULL, NULL, 0)) {
+                               /*
+                                * Prior queued wakeups queued by unrelated code
+                                * using the same address can cause futex wait to
+                                * return 0 even through the futex value is still
+                                * -1 (spurious wakeups). Check the value again
+                                * in user-space to validate whether it really
+                                * differs from -1.
+                                */
+                               continue;
+                       }
                        switch (errno) {
                        switch (errno) {
-                       case EWOULDBLOCK:
+                       case EAGAIN:
                                /* Value already changed. */
                                return;
                        case EINTR:
                                /* Retry if interrupted by signal. */
                                /* Value already changed. */
                                return;
                        case EINTR:
                                /* Retry if interrupted by signal. */
-                               break;  /* Get out of switch. */
+                               break;  /* Get out of switch. Check again. */
                        default:
                                /* Unexpected error. */
                                urcu_die(errno);
                        default:
                                /* Unexpected error. */
                                urcu_die(errno);
@@ -265,8 +259,6 @@ void rcu_defer_barrier_thread(void)
        _rcu_defer_barrier_thread();
        mutex_unlock(&rcu_defer_mutex);
 }
        _rcu_defer_barrier_thread();
        mutex_unlock(&rcu_defer_mutex);
 }
-URCU_ATTR_ALIAS(urcu_stringify(rcu_defer_barrier_thread))
-void alias_rcu_defer_barrier_thread();
 
 /*
  * rcu_defer_barrier - Execute all queued rcu callbacks.
 
 /*
  * rcu_defer_barrier - Execute all queued rcu callbacks.
@@ -307,8 +299,6 @@ void rcu_defer_barrier(void)
 end:
        mutex_unlock(&rcu_defer_mutex);
 }
 end:
        mutex_unlock(&rcu_defer_mutex);
 }
-URCU_ATTR_ALIAS(urcu_stringify(rcu_defer_barrier))
-void alias_rcu_defer_barrier();
 
 /*
  * _defer_rcu - Queue a RCU callback.
 
 /*
  * _defer_rcu - Queue a RCU callback.
@@ -329,9 +319,9 @@ static void _defer_rcu(void (*fct)(void *p), void *p)
         * Worse-case: must allow 2 supplementary entries for fct pointer.
         */
        if (caa_unlikely(head - tail >= DEFER_QUEUE_SIZE - 2)) {
         * Worse-case: must allow 2 supplementary entries for fct pointer.
         */
        if (caa_unlikely(head - tail >= DEFER_QUEUE_SIZE - 2)) {
-               assert(head - tail <= DEFER_QUEUE_SIZE);
+               urcu_posix_assert(head - tail <= DEFER_QUEUE_SIZE);
                rcu_defer_barrier_thread();
                rcu_defer_barrier_thread();
-               assert(head - CMM_LOAD_SHARED(URCU_TLS(defer_queue).tail) == 0);
+               urcu_posix_assert(head - CMM_LOAD_SHARED(URCU_TLS(defer_queue).tail) == 0);
        }
 
        /*
        }
 
        /*
@@ -376,7 +366,7 @@ static void _defer_rcu(void (*fct)(void *p), void *p)
        wake_up_defer();
 }
 
        wake_up_defer();
 }
 
-static void *thr_defer(void *args)
+static void *thr_defer(void *args __attribute__((unused)))
 {
        for (;;) {
                /*
 {
        for (;;) {
                /*
@@ -401,14 +391,23 @@ void defer_rcu(void (*fct)(void *p), void *p)
 {
        _defer_rcu(fct, p);
 }
 {
        _defer_rcu(fct, p);
 }
-URCU_ATTR_ALIAS(urcu_stringify(defer_rcu)) void alias_defer_rcu();
 
 static void start_defer_thread(void)
 {
        int ret;
 
 static void start_defer_thread(void)
 {
        int ret;
+       sigset_t newmask, oldmask;
+
+       ret = sigfillset(&newmask);
+       urcu_posix_assert(!ret);
+       ret = pthread_sigmask(SIG_BLOCK, &newmask, &oldmask);
+       urcu_posix_assert(!ret);
 
        ret = pthread_create(&tid_defer, NULL, thr_defer, NULL);
 
        ret = pthread_create(&tid_defer, NULL, thr_defer, NULL);
-       assert(!ret);
+       if (ret)
+               urcu_die(ret);
+
+       ret = pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
+       urcu_posix_assert(!ret);
 }
 
 static void stop_defer_thread(void)
 }
 
 static void stop_defer_thread(void)
@@ -422,19 +421,19 @@ static void stop_defer_thread(void)
        wake_up_defer();
 
        ret = pthread_join(tid_defer, &tret);
        wake_up_defer();
 
        ret = pthread_join(tid_defer, &tret);
-       assert(!ret);
+       urcu_posix_assert(!ret);
 
        CMM_STORE_SHARED(defer_thread_stop, 0);
        /* defer thread should always exit when futex value is 0 */
 
        CMM_STORE_SHARED(defer_thread_stop, 0);
        /* defer thread should always exit when futex value is 0 */
-       assert(uatomic_read(&defer_thread_futex) == 0);
+       urcu_posix_assert(uatomic_read(&defer_thread_futex) == 0);
 }
 
 int rcu_defer_register_thread(void)
 {
        int was_empty;
 
 }
 
 int rcu_defer_register_thread(void)
 {
        int was_empty;
 
-       assert(URCU_TLS(defer_queue).last_head == 0);
-       assert(URCU_TLS(defer_queue).q == NULL);
+       urcu_posix_assert(URCU_TLS(defer_queue).last_head == 0);
+       urcu_posix_assert(URCU_TLS(defer_queue).q == NULL);
        URCU_TLS(defer_queue).q = malloc(sizeof(void *) * DEFER_QUEUE_SIZE);
        if (!URCU_TLS(defer_queue).q)
                return -ENOMEM;
        URCU_TLS(defer_queue).q = malloc(sizeof(void *) * DEFER_QUEUE_SIZE);
        if (!URCU_TLS(defer_queue).q)
                return -ENOMEM;
@@ -450,8 +449,6 @@ int rcu_defer_register_thread(void)
        mutex_unlock(&defer_thread_mutex);
        return 0;
 }
        mutex_unlock(&defer_thread_mutex);
        return 0;
 }
-URCU_ATTR_ALIAS(urcu_stringify(rcu_defer_register_thread))
-int alias_rcu_defer_register_thread();
 
 void rcu_defer_unregister_thread(void)
 {
 
 void rcu_defer_unregister_thread(void)
 {
@@ -470,14 +467,10 @@ void rcu_defer_unregister_thread(void)
                stop_defer_thread();
        mutex_unlock(&defer_thread_mutex);
 }
                stop_defer_thread();
        mutex_unlock(&defer_thread_mutex);
 }
-URCU_ATTR_ALIAS(urcu_stringify(rcu_defer_unregister_thread))
-void alias_rcu_defer_unregister_thread();
 
 void rcu_defer_exit(void)
 {
 
 void rcu_defer_exit(void)
 {
-       assert(cds_list_empty(&registry_defer));
+       urcu_posix_assert(cds_list_empty(&registry_defer));
 }
 }
-URCU_ATTR_ALIAS(urcu_stringify(rcu_defer_exit))
-void alias_rcu_defer_exit();
 
 #endif /* _URCU_DEFER_IMPL_H */
 
 #endif /* _URCU_DEFER_IMPL_H */
index 227c8dcfa5468e0045d8ef7b7fbc015207d33047..d6b0b16a821f03b8462835d43efdf6c40e99d3cf 100644 (file)
@@ -1,26 +1,12 @@
+// SPDX-FileCopyrightText: 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_DIE_H
 #define _URCU_DIE_H
 
 /*
 #ifndef _URCU_DIE_H
 #define _URCU_DIE_H
 
 /*
- * urcu-die.h
- *
  * Userspace RCU library unrecoverable error handling
  * Userspace RCU library unrecoverable error handling
- *
- * Copyright (c) 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <stdlib.h>
  */
 
 #include <stdlib.h>
index d0854ac8fb3ac1051b573b7afad890cf6f04cc2d..a42fe87be47c0feea1549ccc91ba9db685342538 100644 (file)
@@ -1,26 +1,11 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
 
 /*
 
 /*
- * urcu-pointer.c
- *
  * library wrappers to be used by non-LGPL compatible source code.
  *
  * library wrappers to be used by non-LGPL compatible source code.
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
@@ -39,19 +24,16 @@ void *rcu_dereference_sym(void *p)
 
 void *rcu_set_pointer_sym(void **p, void *v)
 {
 
 void *rcu_set_pointer_sym(void **p, void *v)
 {
-       cmm_wmb();
-       uatomic_set(p, v);
+       uatomic_store(p, v, CMM_RELEASE);
        return v;
 }
 
 void *rcu_xchg_pointer_sym(void **p, void *v)
 {
        return v;
 }
 
 void *rcu_xchg_pointer_sym(void **p, void *v)
 {
-       cmm_wmb();
-       return uatomic_xchg(p, v);
+       return uatomic_xchg_mo(p, v, CMM_SEQ_CST);
 }
 
 void *rcu_cmpxchg_pointer_sym(void **p, void *old, void *_new)
 {
 }
 
 void *rcu_cmpxchg_pointer_sym(void **p, void *old, void *_new)
 {
-       cmm_wmb();
-       return uatomic_cmpxchg(p, old, _new);
+       return uatomic_cmpxchg_mo(p, old, _new, CMM_SEQ_CST, CMM_RELAXED);
 }
 }
diff --git a/src/urcu-poll-impl.h b/src/urcu-poll-impl.h
new file mode 100644 (file)
index 0000000..9aaf5eb
--- /dev/null
@@ -0,0 +1,86 @@
+// SPDX-FileCopyrightText: 2023 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+/*
+ * Userspace RCU library - Grace period polling API
+ */
+
+#include <pthread.h>
+#include <stdbool.h>
+
+#include <urcu/urcu-poll.h>
+#include <urcu/call-rcu.h>
+
+struct urcu_poll_worker_state {
+       struct urcu_gp_poll_state current_state;
+       struct urcu_gp_poll_state latest_target;        /* Most recent snapshot taken */
+       struct rcu_head rcu_head;
+       pthread_mutex_t lock;
+       bool active;
+};
+
+static struct urcu_poll_worker_state poll_worker_gp_state = {
+       .lock = PTHREAD_MUTEX_INITIALIZER,
+};
+
+static
+void urcu_poll_worker_cb(struct rcu_head *head __attribute__((unused)))
+{
+       mutex_lock(&poll_worker_gp_state.lock);
+       /* A new grace period has been reached. */
+       poll_worker_gp_state.current_state.grace_period_id++;
+       if ((long)(poll_worker_gp_state.latest_target.grace_period_id - poll_worker_gp_state.current_state.grace_period_id) >= 0) {
+               /* Need to re-queue. */
+               call_rcu(&poll_worker_gp_state.rcu_head, urcu_poll_worker_cb);
+       } else {
+               /* No user waiting for a target grace period. */
+               poll_worker_gp_state.active = false;
+       }
+       mutex_unlock(&poll_worker_gp_state.lock);
+}
+
+/*
+ * Start polling on grace period. If no worker is currently active,
+ * snapshot the current value and start a worker callback. If the worker
+ * is currently active, snapshot the current value + 1, and set this
+ * value as the latest snapshot, which will cause the worker to re-queue
+ * itself with call_rcu to issue one more grace period.
+ *
+ * Because it uses call_rcu, it needs to be called from a registered RCU
+ * thread.
+ */
+struct urcu_gp_poll_state start_poll_synchronize_rcu(void)
+{
+       struct urcu_gp_poll_state new_target_gp_state;
+       bool was_active = false;
+
+       mutex_lock(&poll_worker_gp_state.lock);
+       new_target_gp_state.grace_period_id = poll_worker_gp_state.current_state.grace_period_id;
+       was_active = poll_worker_gp_state.active;
+       if (!was_active)
+               poll_worker_gp_state.active = true;
+       else
+               new_target_gp_state.grace_period_id++;
+       poll_worker_gp_state.latest_target.grace_period_id = new_target_gp_state.grace_period_id;
+       if (!was_active)
+               call_rcu(&poll_worker_gp_state.rcu_head, urcu_poll_worker_cb);
+       mutex_unlock(&poll_worker_gp_state.lock);
+       return new_target_gp_state;
+}
+
+/*
+ * Poll the grace period state. Return true if quiescence was reached
+ * since the snapshot was taken, return false if quiescence was not
+ * reached since snapshot.
+ */
+bool poll_state_synchronize_rcu(struct urcu_gp_poll_state target_gp_state)
+{
+       bool target_gp_reached = false;
+
+       mutex_lock(&poll_worker_gp_state.lock);
+       if ((long)(target_gp_state.grace_period_id - poll_worker_gp_state.current_state.grace_period_id) < 0)
+               target_gp_reached = true;
+       mutex_unlock(&poll_worker_gp_state.lock);
+       return target_gp_reached;
+}
index 3709412f2519ff7259da6bb144f9818584842580..e7ee180a9f81119a091de2d3156203028debb2bb 100644 (file)
@@ -1,25 +1,11 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * urcu-qsbr.c
- *
  * Userspace RCU QSBR library
  *
  * Userspace RCU QSBR library
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 #include <stdio.h>
 #include <pthread.h>
 #include <signal.h>
 #include <stdio.h>
 #include <pthread.h>
 #include <signal.h>
-#include <assert.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include <string.h>
 #include <errno.h>
 #include <poll.h>
 
 #include <stdlib.h>
 #include <stdint.h>
 #include <string.h>
 #include <errno.h>
 #include <poll.h>
 
+#include <urcu/annotate.h>
+#include <urcu/assert.h>
 #include <urcu/wfcqueue.h>
 #include <urcu/map/urcu-qsbr.h>
 #define BUILD_QSBR_LIB
 #include <urcu/wfcqueue.h>
 #include <urcu/map/urcu-qsbr.h>
 #define BUILD_QSBR_LIB
@@ -53,6 +40,7 @@
 #define _LGPL_SOURCE
 
 void __attribute__((destructor)) urcu_qsbr_exit(void);
 #define _LGPL_SOURCE
 
 void __attribute__((destructor)) urcu_qsbr_exit(void);
+static void urcu_call_rcu_exit(void);
 
 /*
  * rcu_gp_lock ensures mutual exclusion between threads calling
 
 /*
  * rcu_gp_lock ensures mutual exclusion between threads calling
@@ -70,7 +58,6 @@ static pthread_mutex_t rcu_gp_lock = PTHREAD_MUTEX_INITIALIZER;
  */
 static pthread_mutex_t rcu_registry_lock = PTHREAD_MUTEX_INITIALIZER;
 struct urcu_gp urcu_qsbr_gp = { .ctr = URCU_QSBR_GP_ONLINE };
  */
 static pthread_mutex_t rcu_registry_lock = PTHREAD_MUTEX_INITIALIZER;
 struct urcu_gp urcu_qsbr_gp = { .ctr = URCU_QSBR_GP_ONLINE };
-URCU_ATTR_ALIAS("urcu_qsbr_gp") extern struct urcu_gp rcu_gp_qsbr;
 
 /*
  * Active attempts to check for reader Q.S. before calling futex().
 
 /*
  * Active attempts to check for reader Q.S. before calling futex().
@@ -82,7 +69,6 @@ URCU_ATTR_ALIAS("urcu_qsbr_gp") extern struct urcu_gp rcu_gp_qsbr;
  * writers.
  */
 DEFINE_URCU_TLS(struct urcu_qsbr_reader, urcu_qsbr_reader);
  * writers.
  */
 DEFINE_URCU_TLS(struct urcu_qsbr_reader, urcu_qsbr_reader);
-DEFINE_URCU_TLS_ALIAS(struct urcu_qsbr_reader, urcu_qsbr_reader, rcu_reader_qsbr);
 
 static CDS_LIST_HEAD(registry);
 
 
 static CDS_LIST_HEAD(registry);
 
@@ -125,17 +111,25 @@ static void wait_gp(void)
 {
        /* Read reader_gp before read futex */
        cmm_smp_rmb();
 {
        /* Read reader_gp before read futex */
        cmm_smp_rmb();
-       if (uatomic_read(&urcu_qsbr_gp.futex) != -1)
-               return;
-       while (futex_noasync(&urcu_qsbr_gp.futex, FUTEX_WAIT, -1,
-                       NULL, NULL, 0)) {
+       while (uatomic_read(&urcu_qsbr_gp.futex) == -1) {
+               if (!futex_noasync(&urcu_qsbr_gp.futex, FUTEX_WAIT, -1, NULL, NULL, 0)) {
+                       /*
+                        * Prior queued wakeups queued by unrelated code
+                        * using the same address can cause futex wait to
+                        * return 0 even through the futex value is still
+                        * -1 (spurious wakeups). Check the value again
+                        * in user-space to validate whether it really
+                        * differs from -1.
+                        */
+                       continue;
+               }
                switch (errno) {
                switch (errno) {
-               case EWOULDBLOCK:
+               case EAGAIN:
                        /* Value already changed. */
                        return;
                case EINTR:
                        /* Retry if interrupted by signal. */
                        /* Value already changed. */
                        return;
                case EINTR:
                        /* Retry if interrupted by signal. */
-                       break;  /* Get out of switch. */
+                       break;  /* Get out of switch. Check again. */
                default:
                        /* Unexpected error. */
                        urcu_die(errno);
                default:
                        /* Unexpected error. */
                        urcu_die(errno);
@@ -149,7 +143,8 @@ static void wait_gp(void)
  */
 static void wait_for_readers(struct cds_list_head *input_readers,
                        struct cds_list_head *cur_snap_readers,
  */
 static void wait_for_readers(struct cds_list_head *input_readers,
                        struct cds_list_head *cur_snap_readers,
-                       struct cds_list_head *qsreaders)
+                       struct cds_list_head *qsreaders,
+                       cmm_annotate_t *group)
 {
        unsigned int wait_loops = 0;
        struct urcu_qsbr_reader *index, *tmp;
 {
        unsigned int wait_loops = 0;
        struct urcu_qsbr_reader *index, *tmp;
@@ -176,7 +171,7 @@ static void wait_for_readers(struct cds_list_head *input_readers,
                        cmm_smp_mb();
                }
                cds_list_for_each_entry_safe(index, tmp, input_readers, node) {
                        cmm_smp_mb();
                }
                cds_list_for_each_entry_safe(index, tmp, input_readers, node) {
-                       switch (urcu_qsbr_reader_state(&index->ctr)) {
+                       switch (urcu_qsbr_reader_state(&index->ctr, group)) {
                        case URCU_READER_ACTIVE_CURRENT:
                                if (cur_snap_readers) {
                                        cds_list_move(&index->node,
                        case URCU_READER_ACTIVE_CURRENT:
                                if (cur_snap_readers) {
                                        cds_list_move(&index->node,
@@ -201,8 +196,7 @@ static void wait_for_readers(struct cds_list_head *input_readers,
                if (cds_list_empty(input_readers)) {
                        if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
                                /* Read reader_gp before write futex */
                if (cds_list_empty(input_readers)) {
                        if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
                                /* Read reader_gp before write futex */
-                               cmm_smp_mb();
-                               uatomic_set(&urcu_qsbr_gp.futex, 0);
+                               uatomic_store(&urcu_qsbr_gp.futex, 0, CMM_RELEASE);
                        }
                        break;
                } else {
                        }
                        break;
                } else {
@@ -231,6 +225,8 @@ static void wait_for_readers(struct cds_list_head *input_readers,
 #if (CAA_BITS_PER_LONG < 64)
 void urcu_qsbr_synchronize_rcu(void)
 {
 #if (CAA_BITS_PER_LONG < 64)
 void urcu_qsbr_synchronize_rcu(void)
 {
+       cmm_annotate_define(acquire_group);
+       cmm_annotate_define(release_group);
        CDS_LIST_HEAD(cur_snap_readers);
        CDS_LIST_HEAD(qsreaders);
        unsigned long was_online;
        CDS_LIST_HEAD(cur_snap_readers);
        CDS_LIST_HEAD(qsreaders);
        unsigned long was_online;
@@ -251,6 +247,7 @@ void urcu_qsbr_synchronize_rcu(void)
                urcu_qsbr_thread_offline();
        else
                cmm_smp_mb();
                urcu_qsbr_thread_offline();
        else
                cmm_smp_mb();
+       cmm_annotate_group_mb_release(&release_group);
 
        /*
         * Add ourself to gp_waiters queue of threads awaiting to wait
 
        /*
         * Add ourself to gp_waiters queue of threads awaiting to wait
@@ -280,9 +277,9 @@ void urcu_qsbr_synchronize_rcu(void)
        /*
         * Wait for readers to observe original parity or be quiescent.
         * wait_for_readers() can release and grab again rcu_registry_lock
        /*
         * Wait for readers to observe original parity or be quiescent.
         * wait_for_readers() can release and grab again rcu_registry_lock
-        * interally.
+        * internally.
         */
         */
-       wait_for_readers(&registry, &cur_snap_readers, &qsreaders);
+       wait_for_readers(&registry, &cur_snap_readers, &qsreaders, &acquire_group);
 
        /*
         * Must finish waiting for quiescent state for original parity
 
        /*
         * Must finish waiting for quiescent state for original parity
@@ -302,7 +299,8 @@ void urcu_qsbr_synchronize_rcu(void)
        cmm_smp_mb();
 
        /* Switch parity: 0 -> 1, 1 -> 0 */
        cmm_smp_mb();
 
        /* Switch parity: 0 -> 1, 1 -> 0 */
-       CMM_STORE_SHARED(urcu_qsbr_gp.ctr, urcu_qsbr_gp.ctr ^ URCU_QSBR_GP_CTR);
+       cmm_annotate_group_mem_release(&release_group, &urcu_qsbr_gp.ctr);
+       uatomic_store(&urcu_qsbr_gp.ctr, urcu_qsbr_gp.ctr ^ URCU_QSBR_GP_CTR, CMM_RELAXED);
 
        /*
         * Must commit urcu_qsbr_gp.ctr update to memory before waiting for
 
        /*
         * Must commit urcu_qsbr_gp.ctr update to memory before waiting for
@@ -323,9 +321,9 @@ void urcu_qsbr_synchronize_rcu(void)
        /*
         * Wait for readers to observe new parity or be quiescent.
         * wait_for_readers() can release and grab again rcu_registry_lock
        /*
         * Wait for readers to observe new parity or be quiescent.
         * wait_for_readers() can release and grab again rcu_registry_lock
-        * interally.
+        * internally.
         */
         */
-       wait_for_readers(&cur_snap_readers, NULL, &qsreaders);
+       wait_for_readers(&cur_snap_readers, NULL, &qsreaders, &acquire_group);
 
        /*
         * Put quiescent reader list back into registry.
 
        /*
         * Put quiescent reader list back into registry.
@@ -340,6 +338,8 @@ gp_end:
         * Finish waiting for reader threads before letting the old ptr being
         * freed.
         */
         * Finish waiting for reader threads before letting the old ptr being
         * freed.
         */
+       cmm_annotate_group_mb_acquire(&acquire_group);
+
        if (was_online)
                urcu_qsbr_thread_online();
        else
        if (was_online)
                urcu_qsbr_thread_online();
        else
@@ -348,6 +348,8 @@ gp_end:
 #else /* !(CAA_BITS_PER_LONG < 64) */
 void urcu_qsbr_synchronize_rcu(void)
 {
 #else /* !(CAA_BITS_PER_LONG < 64) */
 void urcu_qsbr_synchronize_rcu(void)
 {
+       cmm_annotate_define(acquire_group);
+       cmm_annotate_define(release_group);
        CDS_LIST_HEAD(qsreaders);
        unsigned long was_online;
        DEFINE_URCU_WAIT_NODE(wait, URCU_WAIT_WAITING);
        CDS_LIST_HEAD(qsreaders);
        unsigned long was_online;
        DEFINE_URCU_WAIT_NODE(wait, URCU_WAIT_WAITING);
@@ -364,6 +366,7 @@ void urcu_qsbr_synchronize_rcu(void)
                urcu_qsbr_thread_offline();
        else
                cmm_smp_mb();
                urcu_qsbr_thread_offline();
        else
                cmm_smp_mb();
+       cmm_annotate_group_mb_release(&release_group);
 
        /*
         * Add ourself to gp_waiters queue of threads awaiting to wait
 
        /*
         * Add ourself to gp_waiters queue of threads awaiting to wait
@@ -391,7 +394,8 @@ void urcu_qsbr_synchronize_rcu(void)
                goto out;
 
        /* Increment current G.P. */
                goto out;
 
        /* Increment current G.P. */
-       CMM_STORE_SHARED(urcu_qsbr_gp.ctr, urcu_qsbr_gp.ctr + URCU_QSBR_GP_CTR);
+       cmm_annotate_group_mem_release(&release_group, &urcu_qsbr_gp.ctr);
+       uatomic_store(&urcu_qsbr_gp.ctr, urcu_qsbr_gp.ctr + URCU_QSBR_GP_CTR, CMM_RELAXED);
 
        /*
         * Must commit urcu_qsbr_gp.ctr update to memory before waiting for
 
        /*
         * Must commit urcu_qsbr_gp.ctr update to memory before waiting for
@@ -412,9 +416,9 @@ void urcu_qsbr_synchronize_rcu(void)
        /*
         * Wait for readers to observe new count of be quiescent.
         * wait_for_readers() can release and grab again rcu_registry_lock
        /*
         * Wait for readers to observe new count of be quiescent.
         * wait_for_readers() can release and grab again rcu_registry_lock
-        * interally.
+        * internally.
         */
         */
-       wait_for_readers(&registry, NULL, &qsreaders);
+       wait_for_readers(&registry, NULL, &qsreaders, &acquire_group);
 
        /*
         * Put quiescent reader list back into registry.
 
        /*
         * Put quiescent reader list back into registry.
@@ -429,10 +433,10 @@ gp_end:
                urcu_qsbr_thread_online();
        else
                cmm_smp_mb();
                urcu_qsbr_thread_online();
        else
                cmm_smp_mb();
+
+       cmm_annotate_group_mb_acquire(&acquire_group);
 }
 #endif  /* !(CAA_BITS_PER_LONG < 64) */
 }
 #endif  /* !(CAA_BITS_PER_LONG < 64) */
-URCU_ATTR_ALIAS("urcu_qsbr_synchronize_rcu")
-void synchronize_rcu_qsbr();
 
 /*
  * library wrappers to be used by non-LGPL compatible source code.
 
 /*
  * library wrappers to be used by non-LGPL compatible source code.
@@ -442,56 +446,47 @@ void urcu_qsbr_read_lock(void)
 {
        _urcu_qsbr_read_lock();
 }
 {
        _urcu_qsbr_read_lock();
 }
-URCU_ATTR_ALIAS("urcu_qsbr_read_lock") void rcu_read_lock_qsbr();
 
 void urcu_qsbr_read_unlock(void)
 {
        _urcu_qsbr_read_unlock();
 }
 
 void urcu_qsbr_read_unlock(void)
 {
        _urcu_qsbr_read_unlock();
 }
-URCU_ATTR_ALIAS("urcu_qsbr_read_unlock") void rcu_read_unlock_qsbr();
 
 int urcu_qsbr_read_ongoing(void)
 {
        return _urcu_qsbr_read_ongoing();
 }
 
 int urcu_qsbr_read_ongoing(void)
 {
        return _urcu_qsbr_read_ongoing();
 }
-URCU_ATTR_ALIAS("urcu_qsbr_read_ongoing")
 void rcu_read_ongoing_qsbr();
 
 void urcu_qsbr_quiescent_state(void)
 {
        _urcu_qsbr_quiescent_state();
 }
 void rcu_read_ongoing_qsbr();
 
 void urcu_qsbr_quiescent_state(void)
 {
        _urcu_qsbr_quiescent_state();
 }
-URCU_ATTR_ALIAS("urcu_qsbr_quiescent_state")
 void rcu_quiescent_state_qsbr();
 
 void urcu_qsbr_thread_offline(void)
 {
        _urcu_qsbr_thread_offline();
 }
 void rcu_quiescent_state_qsbr();
 
 void urcu_qsbr_thread_offline(void)
 {
        _urcu_qsbr_thread_offline();
 }
-URCU_ATTR_ALIAS("urcu_qsbr_thread_offline")
 void rcu_thread_offline_qsbr();
 
 void urcu_qsbr_thread_online(void)
 {
        _urcu_qsbr_thread_online();
 }
 void rcu_thread_offline_qsbr();
 
 void urcu_qsbr_thread_online(void)
 {
        _urcu_qsbr_thread_online();
 }
-URCU_ATTR_ALIAS("urcu_qsbr_thread_online")
-void rcu_thread_online_qsbr();
 
 void urcu_qsbr_register_thread(void)
 {
        URCU_TLS(urcu_qsbr_reader).tid = pthread_self();
 
 void urcu_qsbr_register_thread(void)
 {
        URCU_TLS(urcu_qsbr_reader).tid = pthread_self();
-       assert(URCU_TLS(urcu_qsbr_reader).ctr == 0);
+       urcu_posix_assert(URCU_TLS(urcu_qsbr_reader).ctr == 0);
 
        mutex_lock(&rcu_registry_lock);
 
        mutex_lock(&rcu_registry_lock);
-       assert(!URCU_TLS(urcu_qsbr_reader).registered);
+       urcu_posix_assert(!URCU_TLS(urcu_qsbr_reader).registered);
        URCU_TLS(urcu_qsbr_reader).registered = 1;
        cds_list_add(&URCU_TLS(urcu_qsbr_reader).node, &registry);
        mutex_unlock(&rcu_registry_lock);
        _urcu_qsbr_thread_online();
 }
        URCU_TLS(urcu_qsbr_reader).registered = 1;
        cds_list_add(&URCU_TLS(urcu_qsbr_reader).node, &registry);
        mutex_unlock(&rcu_registry_lock);
        _urcu_qsbr_thread_online();
 }
-URCU_ATTR_ALIAS("urcu_qsbr_register_thread")
-void rcu_register_thread_qsbr();
 
 void urcu_qsbr_unregister_thread(void)
 {
 
 void urcu_qsbr_unregister_thread(void)
 {
@@ -500,27 +495,25 @@ void urcu_qsbr_unregister_thread(void)
         * with a waiting writer.
         */
        _urcu_qsbr_thread_offline();
         * with a waiting writer.
         */
        _urcu_qsbr_thread_offline();
-       assert(URCU_TLS(urcu_qsbr_reader).registered);
+       urcu_posix_assert(URCU_TLS(urcu_qsbr_reader).registered);
        URCU_TLS(urcu_qsbr_reader).registered = 0;
        mutex_lock(&rcu_registry_lock);
        cds_list_del(&URCU_TLS(urcu_qsbr_reader).node);
        mutex_unlock(&rcu_registry_lock);
 }
        URCU_TLS(urcu_qsbr_reader).registered = 0;
        mutex_lock(&rcu_registry_lock);
        cds_list_del(&URCU_TLS(urcu_qsbr_reader).node);
        mutex_unlock(&rcu_registry_lock);
 }
-URCU_ATTR_ALIAS("urcu_qsbr_unregister_thread")
-void rcu_unregister_thread_qsbr();
 
 void urcu_qsbr_exit(void)
 {
        /*
         * Assertion disabled because call_rcu threads are now rcu
         * readers, and left running at exit.
 
 void urcu_qsbr_exit(void)
 {
        /*
         * Assertion disabled because call_rcu threads are now rcu
         * readers, and left running at exit.
-        * assert(cds_list_empty(&registry));
+        * urcu_posix_assert(cds_list_empty(&registry));
         */
         */
+       urcu_call_rcu_exit();
 }
 }
-URCU_ATTR_ALIAS("urcu_qsbr_exit") void rcu_exit_qsbr();
 
 DEFINE_RCU_FLAVOR(rcu_flavor);
 
 DEFINE_RCU_FLAVOR(rcu_flavor);
-DEFINE_RCU_FLAVOR_ALIAS(rcu_flavor, alias_rcu_flavor);
 
 #include "urcu-call-rcu-impl.h"
 #include "urcu-defer-impl.h"
 
 #include "urcu-call-rcu-impl.h"
 #include "urcu-defer-impl.h"
+#include "urcu-poll-impl.h"
index 407f42e07e6fd078d247e707a3058f3aa6cb9dff..face6552215540f332ae8920a0a64cee5dc17984 100644 (file)
@@ -1,28 +1,16 @@
+// SPDX-FileCopyrightText: 2018 Michael Jeanson <mjeanson@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_UTILS_H
 #define _URCU_UTILS_H
 
 /*
 #ifndef _URCU_UTILS_H
 #define _URCU_UTILS_H
 
 /*
- * urcu-utils.h
- *
  * Userspace RCU library internal utils
  * Userspace RCU library internal utils
- *
- * Copyright (c) 2018 Michael Jeanson <mjeanson@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
  */
 
+#include <urcu/config.h>
+
 #define urcu_stringify(a) _urcu_stringify(a)
 #define _urcu_stringify(a) #a
 
 #define urcu_stringify(a) _urcu_stringify(a)
 #define _urcu_stringify(a) #a
 
                __min1 <= __min2 ? __min1: __min2;      \
        })
 
                __min1 <= __min2 ? __min1: __min2;      \
        })
 
-/* There is no concept of symbol aliases on MacOS */
-#ifdef __APPLE__
-#define URCU_ATTR_ALIAS(x)
-#else
-#define URCU_ATTR_ALIAS(x) __attribute__((alias(x)))
-#endif
-
-#ifdef CONFIG_RCU_TLS
-#define DEFINE_URCU_TLS_ALIAS_1(type, name, alias)             \
-       URCU_ATTR_ALIAS(#name)                                  \
-       extern type alias
-
-#else
-#define DEFINE_URCU_TLS_ALIAS_1(type, name, alias)             \
-       URCU_ATTR_ALIAS("*__tls_access_" #name)                 \
-       type *__tls_access_ ## alias()
-#endif
-
-#define DEFINE_URCU_TLS_ALIAS(type, name, alias)               \
-       DEFINE_URCU_TLS_ALIAS_1(type, name, alias)
-
 #endif /* _URCU_UTILS_H */
 #endif /* _URCU_UTILS_H */
index 47ac5eb35884f437ca299e48cf656e2c301557f7..d77282bd55defc12e9dc78a797ab80c54777829b 100644 (file)
@@ -1,30 +1,18 @@
+// SPDX-FileCopyrightText: 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_WAIT_H
 #define _URCU_WAIT_H
 
 /*
 #ifndef _URCU_WAIT_H
 #define _URCU_WAIT_H
 
 /*
- * urcu-wait.h
- *
  * Userspace RCU library wait/wakeup management
  * Userspace RCU library wait/wakeup management
- *
- * Copyright (c) 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
  */
 
+#include <urcu/assert.h>
 #include <urcu/uatomic.h>
 #include <urcu/wfstack.h>
 #include <urcu/uatomic.h>
 #include <urcu/wfstack.h>
+#include <urcu/futex.h>
 #include "urcu-die.h"
 
 /*
 #include "urcu-die.h"
 
 /*
@@ -48,7 +36,7 @@ struct urcu_wait_node {
 };
 
 #define URCU_WAIT_NODE_INIT(name, _state)              \
 };
 
 #define URCU_WAIT_NODE_INIT(name, _state)              \
-       { .state = _state }
+       { .node = { .next = NULL }, .state = _state }
 
 #define DEFINE_URCU_WAIT_NODE(name, state)             \
        struct urcu_wait_node name = URCU_WAIT_NODE_INIT(name, state)
 
 #define DEFINE_URCU_WAIT_NODE(name, state)             \
        struct urcu_wait_node name = URCU_WAIT_NODE_INIT(name, state)
@@ -125,16 +113,15 @@ void urcu_wait_node_init(struct urcu_wait_node *node,
 static inline
 void urcu_adaptative_wake_up(struct urcu_wait_node *wait)
 {
 static inline
 void urcu_adaptative_wake_up(struct urcu_wait_node *wait)
 {
-       cmm_smp_mb();
-       assert(uatomic_read(&wait->state) == URCU_WAIT_WAITING);
-       uatomic_set(&wait->state, URCU_WAIT_WAKEUP);
+       urcu_posix_assert(uatomic_read(&wait->state) == URCU_WAIT_WAITING);
+       uatomic_store(&wait->state, URCU_WAIT_WAKEUP, CMM_RELEASE);
        if (!(uatomic_read(&wait->state) & URCU_WAIT_RUNNING)) {
                if (futex_noasync(&wait->state, FUTEX_WAKE, 1,
                                NULL, NULL, 0) < 0)
                        urcu_die(errno);
        }
        /* Allow teardown of struct urcu_wait memory. */
        if (!(uatomic_read(&wait->state) & URCU_WAIT_RUNNING)) {
                if (futex_noasync(&wait->state, FUTEX_WAKE, 1,
                                NULL, NULL, 0) < 0)
                        urcu_die(errno);
        }
        /* Allow teardown of struct urcu_wait memory. */
-       uatomic_or(&wait->state, URCU_WAIT_TEARDOWN);
+       uatomic_or_mo(&wait->state, URCU_WAIT_TEARDOWN, CMM_RELEASE);
 }
 
 /*
 }
 
 /*
@@ -149,19 +136,30 @@ void urcu_adaptative_busy_wait(struct urcu_wait_node *wait)
        /* Load and test condition before read state */
        cmm_smp_rmb();
        for (i = 0; i < URCU_WAIT_ATTEMPTS; i++) {
        /* Load and test condition before read state */
        cmm_smp_rmb();
        for (i = 0; i < URCU_WAIT_ATTEMPTS; i++) {
-               if (uatomic_read(&wait->state) != URCU_WAIT_WAITING)
+               if (uatomic_load(&wait->state, CMM_ACQUIRE) != URCU_WAIT_WAITING)
                        goto skip_futex_wait;
                caa_cpu_relax();
        }
                        goto skip_futex_wait;
                caa_cpu_relax();
        }
-       while (futex_noasync(&wait->state, FUTEX_WAIT, URCU_WAIT_WAITING,
-                       NULL, NULL, 0)) {
+       while (uatomic_load(&wait->state, CMM_ACQUIRE) == URCU_WAIT_WAITING) {
+               if (!futex_noasync(&wait->state, FUTEX_WAIT, URCU_WAIT_WAITING, NULL, NULL, 0)) {
+                       /*
+                        * Prior queued wakeups queued by unrelated code
+                        * using the same address can cause futex wait to
+                        * return 0 even through the futex value is still
+                        * URCU_WAIT_WAITING (spurious wakeups). Check
+                        * the value again in user-space to validate
+                        * whether it really differs from
+                        * URCU_WAIT_WAITING.
+                        */
+                       continue;
+               }
                switch (errno) {
                switch (errno) {
-               case EWOULDBLOCK:
+               case EAGAIN:
                        /* Value already changed. */
                        goto skip_futex_wait;
                case EINTR:
                        /* Retry if interrupted by signal. */
                        /* Value already changed. */
                        goto skip_futex_wait;
                case EINTR:
                        /* Retry if interrupted by signal. */
-                       break;  /* Get out of switch. */
+                       break;  /* Get out of switch. Check again. */
                default:
                        /* Unexpected error. */
                        urcu_die(errno);
                default:
                        /* Unexpected error. */
                        urcu_die(errno);
@@ -177,13 +175,13 @@ skip_futex_wait:
         * memory allocated for struct urcu_wait.
         */
        for (i = 0; i < URCU_WAIT_ATTEMPTS; i++) {
         * memory allocated for struct urcu_wait.
         */
        for (i = 0; i < URCU_WAIT_ATTEMPTS; i++) {
-               if (uatomic_read(&wait->state) & URCU_WAIT_TEARDOWN)
+               if (uatomic_load(&wait->state, CMM_RELAXED) & URCU_WAIT_TEARDOWN)
                        break;
                caa_cpu_relax();
        }
                        break;
                caa_cpu_relax();
        }
-       while (!(uatomic_read(&wait->state) & URCU_WAIT_TEARDOWN))
+       while (!(uatomic_load(&wait->state, CMM_ACQUIRE) & URCU_WAIT_TEARDOWN))
                poll(NULL, 0, 10);
                poll(NULL, 0, 10);
-       assert(uatomic_read(&wait->state) & URCU_WAIT_TEARDOWN);
+       urcu_posix_assert(uatomic_read(&wait->state) & URCU_WAIT_TEARDOWN);
 }
 
 static inline
 }
 
 static inline
@@ -197,7 +195,7 @@ void urcu_wake_all_waiters(struct urcu_waiters *waiters)
                        caa_container_of(iter, struct urcu_wait_node, node);
 
                /* Don't wake already running threads */
                        caa_container_of(iter, struct urcu_wait_node, node);
 
                /* Don't wake already running threads */
-               if (wait_node->state & URCU_WAIT_RUNNING)
+               if (uatomic_load(&wait_node->state, CMM_RELAXED) & URCU_WAIT_RUNNING)
                        continue;
                urcu_adaptative_wake_up(wait_node);
        }
                        continue;
                urcu_adaptative_wake_up(wait_node);
        }
index f6ca5f829db62b92d56a0c0ae184b1908b0539a5..5f4a7d71c2fad83e414e5c32f09ff884aac13488 100644 (file)
@@ -1,25 +1,11 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * urcu.c
- *
  * Userspace RCU library
  *
  * Userspace RCU library
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
@@ -30,7 +16,6 @@
 #include <stdio.h>
 #include <pthread.h>
 #include <signal.h>
 #include <stdio.h>
 #include <pthread.h>
 #include <signal.h>
-#include <assert.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include <string.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include <string.h>
@@ -38,6 +23,9 @@
 #include <stdbool.h>
 #include <poll.h>
 
 #include <stdbool.h>
 #include <poll.h>
 
+#include <urcu/config.h>
+#include <urcu/annotate.h>
+#include <urcu/assert.h>
 #include <urcu/arch.h>
 #include <urcu/wfcqueue.h>
 #include <urcu/map/urcu.h>
 #include <urcu/arch.h>
 #include <urcu/wfcqueue.h>
 #include <urcu/map/urcu.h>
@@ -93,27 +81,19 @@ static int urcu_memb_has_sys_membarrier_private_expedited;
  * uninitialized variable.
  */
 int urcu_memb_has_sys_membarrier = 0;
  * uninitialized variable.
  */
 int urcu_memb_has_sys_membarrier = 0;
-URCU_ATTR_ALIAS("urcu_memb_has_sys_membarrier")
-extern int rcu_has_sys_membarrier_memb;
 #endif
 
 void __attribute__((constructor)) rcu_init(void);
 #endif
 
 #endif
 
 void __attribute__((constructor)) rcu_init(void);
 #endif
 
-#ifdef RCU_MB
+#if defined(RCU_MB)
 void rcu_init(void)
 {
 }
 void rcu_init(void)
 {
 }
-URCU_ATTR_ALIAS(urcu_stringify(rcu_init))
-void alias_rcu_init(void);
 #endif
 
 #endif
 
-#ifdef RCU_SIGNAL
-static int init_done;
-
-void __attribute__((constructor)) rcu_init(void);
 void __attribute__((destructor)) rcu_exit(void);
 void __attribute__((destructor)) rcu_exit(void);
-#endif
+static void urcu_call_rcu_exit(void);
 
 /*
  * rcu_gp_lock ensures mutual exclusion between threads calling
 
 /*
  * rcu_gp_lock ensures mutual exclusion between threads calling
@@ -131,15 +111,12 @@ static pthread_mutex_t rcu_gp_lock = PTHREAD_MUTEX_INITIALIZER;
  */
 static pthread_mutex_t rcu_registry_lock = PTHREAD_MUTEX_INITIALIZER;
 struct urcu_gp rcu_gp = { .ctr = URCU_GP_COUNT };
  */
 static pthread_mutex_t rcu_registry_lock = PTHREAD_MUTEX_INITIALIZER;
 struct urcu_gp rcu_gp = { .ctr = URCU_GP_COUNT };
-URCU_ATTR_ALIAS(urcu_stringify(rcu_gp))
-extern struct urcu_gp alias_rcu_gp;
 
 /*
  * Written to only by each individual reader. Read by both the reader and the
  * writers.
  */
 DEFINE_URCU_TLS(struct urcu_reader, rcu_reader);
 
 /*
  * Written to only by each individual reader. Read by both the reader and the
  * writers.
  */
 DEFINE_URCU_TLS(struct urcu_reader, rcu_reader);
-DEFINE_URCU_TLS_ALIAS(struct urcu_reader, rcu_reader, alias_rcu_reader);
 
 static CDS_LIST_HEAD(registry);
 
 
 static CDS_LIST_HEAD(registry);
 
@@ -194,62 +171,13 @@ static void smp_mb_master(void)
 }
 #endif
 
 }
 #endif
 
-#ifdef RCU_MB
+#if defined(RCU_MB)
 static void smp_mb_master(void)
 {
        cmm_smp_mb();
 }
 #endif
 
 static void smp_mb_master(void)
 {
        cmm_smp_mb();
 }
 #endif
 
-#ifdef RCU_SIGNAL
-static void force_mb_all_readers(void)
-{
-       struct urcu_reader *index;
-
-       /*
-        * Ask for each threads to execute a cmm_smp_mb() so we can consider the
-        * compiler barriers around rcu read lock as real memory barriers.
-        */
-       if (cds_list_empty(&registry))
-               return;
-       /*
-        * pthread_kill has a cmm_smp_mb(). But beware, we assume it performs
-        * a cache flush on architectures with non-coherent cache. Let's play
-        * safe and don't assume anything : we use cmm_smp_mc() to make sure the
-        * cache flush is enforced.
-        */
-       cds_list_for_each_entry(index, &registry, node) {
-               CMM_STORE_SHARED(index->need_mb, 1);
-               pthread_kill(index->tid, SIGRCU);
-       }
-       /*
-        * Wait for sighandler (and thus mb()) to execute on every thread.
-        *
-        * Note that the pthread_kill() will never be executed on systems
-        * that correctly deliver signals in a timely manner.  However, it
-        * is not uncommon for kernels to have bugs that can result in
-        * lost or unduly delayed signals.
-        *
-        * If you are seeing the below pthread_kill() executing much at
-        * all, we suggest testing the underlying kernel and filing the
-        * relevant bug report.  For Linux kernels, we recommend getting
-        * the Linux Test Project (LTP).
-        */
-       cds_list_for_each_entry(index, &registry, node) {
-               while (CMM_LOAD_SHARED(index->need_mb)) {
-                       pthread_kill(index->tid, SIGRCU);
-                       (void) poll(NULL, 0, 1);
-               }
-       }
-       cmm_smp_mb();   /* read ->need_mb before ending the barrier */
-}
-
-static void smp_mb_master(void)
-{
-       force_mb_all_readers();
-}
-#endif /* #ifdef RCU_SIGNAL */
-
 /*
  * synchronize_rcu() waiting. Single thread.
  * Always called with rcu_registry lock held. Releases this lock and
 /*
  * synchronize_rcu() waiting. Single thread.
  * Always called with rcu_registry lock held. Releases this lock and
@@ -258,24 +186,30 @@ static void smp_mb_master(void)
 static void wait_gp(void)
 {
        /*
 static void wait_gp(void)
 {
        /*
-        * Read reader_gp before read futex. smp_mb_master() needs to
-        * be called with the rcu registry lock held in RCU_SIGNAL
-        * flavor.
+        * Read reader_gp before read futex.
         */
        smp_mb_master();
        /* Temporarily unlock the registry lock. */
        mutex_unlock(&rcu_registry_lock);
         */
        smp_mb_master();
        /* Temporarily unlock the registry lock. */
        mutex_unlock(&rcu_registry_lock);
-       if (uatomic_read(&rcu_gp.futex) != -1)
-               goto end;
-       while (futex_async(&rcu_gp.futex, FUTEX_WAIT, -1,
-                       NULL, NULL, 0)) {
+       while (uatomic_read(&rcu_gp.futex) == -1) {
+               if (!futex_async(&rcu_gp.futex, FUTEX_WAIT, -1, NULL, NULL, 0)) {
+                       /*
+                        * Prior queued wakeups queued by unrelated code
+                        * using the same address can cause futex wait to
+                        * return 0 even through the futex value is still
+                        * -1 (spurious wakeups). Check the value again
+                        * in user-space to validate whether it really
+                        * differs from -1.
+                        */
+                       continue;
+               }
                switch (errno) {
                switch (errno) {
-               case EWOULDBLOCK:
+               case EAGAIN:
                        /* Value already changed. */
                        goto end;
                case EINTR:
                        /* Retry if interrupted by signal. */
                        /* Value already changed. */
                        goto end;
                case EINTR:
                        /* Retry if interrupted by signal. */
-                       break;  /* Get out of switch. */
+                       break;  /* Get out of switch. Check again. */
                default:
                        /* Unexpected error. */
                        urcu_die(errno);
                default:
                        /* Unexpected error. */
                        urcu_die(errno);
@@ -294,7 +228,8 @@ end:
  */
 static void wait_for_readers(struct cds_list_head *input_readers,
                        struct cds_list_head *cur_snap_readers,
  */
 static void wait_for_readers(struct cds_list_head *input_readers,
                        struct cds_list_head *cur_snap_readers,
-                       struct cds_list_head *qsreaders)
+                       struct cds_list_head *qsreaders,
+                       cmm_annotate_t *group)
 {
        unsigned int wait_loops = 0;
        struct urcu_reader *index, *tmp;
 {
        unsigned int wait_loops = 0;
        struct urcu_reader *index, *tmp;
@@ -317,7 +252,7 @@ static void wait_for_readers(struct cds_list_head *input_readers,
                }
 
                cds_list_for_each_entry_safe(index, tmp, input_readers, node) {
                }
 
                cds_list_for_each_entry_safe(index, tmp, input_readers, node) {
-                       switch (urcu_common_reader_state(&rcu_gp, &index->ctr)) {
+                       switch (urcu_common_reader_state(&rcu_gp, &index->ctr, group)) {
                        case URCU_READER_ACTIVE_CURRENT:
                                if (cur_snap_readers) {
                                        cds_list_move(&index->node,
                        case URCU_READER_ACTIVE_CURRENT:
                                if (cur_snap_readers) {
                                        cds_list_move(&index->node,
@@ -401,6 +336,8 @@ static void wait_for_readers(struct cds_list_head *input_readers,
 
 void synchronize_rcu(void)
 {
 
 void synchronize_rcu(void)
 {
+       cmm_annotate_define(acquire_group);
+       cmm_annotate_define(release_group);
        CDS_LIST_HEAD(cur_snap_readers);
        CDS_LIST_HEAD(qsreaders);
        DEFINE_URCU_WAIT_NODE(wait, URCU_WAIT_WAITING);
        CDS_LIST_HEAD(cur_snap_readers);
        CDS_LIST_HEAD(qsreaders);
        DEFINE_URCU_WAIT_NODE(wait, URCU_WAIT_WAITING);
@@ -415,10 +352,11 @@ void synchronize_rcu(void)
         * queue before their insertion into the wait queue.
         */
        if (urcu_wait_add(&gp_waiters, &wait) != 0) {
         * queue before their insertion into the wait queue.
         */
        if (urcu_wait_add(&gp_waiters, &wait) != 0) {
-               /* Not first in queue: will be awakened by another thread. */
+               /*
+                * Not first in queue: will be awakened by another thread.
+                * Implies a memory barrier after grace period.
+                */
                urcu_adaptative_busy_wait(&wait);
                urcu_adaptative_busy_wait(&wait);
-               /* Order following memory accesses after grace period. */
-               cmm_smp_mb();
                return;
        }
        /* We won't need to wake ourself up */
                return;
        }
        /* We won't need to wake ourself up */
@@ -443,13 +381,14 @@ void synchronize_rcu(void)
         */
        /* Write new ptr before changing the qparity */
        smp_mb_master();
         */
        /* Write new ptr before changing the qparity */
        smp_mb_master();
+       cmm_annotate_group_mb_release(&release_group);
 
        /*
         * Wait for readers to observe original parity or be quiescent.
         * wait_for_readers() can release and grab again rcu_registry_lock
 
        /*
         * Wait for readers to observe original parity or be quiescent.
         * wait_for_readers() can release and grab again rcu_registry_lock
-        * interally.
+        * internally.
         */
         */
-       wait_for_readers(&registry, &cur_snap_readers, &qsreaders);
+       wait_for_readers(&registry, &cur_snap_readers, &qsreaders, &acquire_group);
 
        /*
         * Must finish waiting for quiescent state for original parity before
 
        /*
         * Must finish waiting for quiescent state for original parity before
@@ -468,7 +407,8 @@ void synchronize_rcu(void)
        cmm_smp_mb();
 
        /* Switch parity: 0 -> 1, 1 -> 0 */
        cmm_smp_mb();
 
        /* Switch parity: 0 -> 1, 1 -> 0 */
-       CMM_STORE_SHARED(rcu_gp.ctr, rcu_gp.ctr ^ URCU_GP_CTR_PHASE);
+       cmm_annotate_group_mem_release(&release_group, &rcu_gp.ctr);
+       uatomic_store(&rcu_gp.ctr, rcu_gp.ctr ^ URCU_GP_CTR_PHASE, CMM_RELAXED);
 
        /*
         * Must commit rcu_gp.ctr update to memory before waiting for quiescent
 
        /*
         * Must commit rcu_gp.ctr update to memory before waiting for quiescent
@@ -489,9 +429,9 @@ void synchronize_rcu(void)
        /*
         * Wait for readers to observe new parity or be quiescent.
         * wait_for_readers() can release and grab again rcu_registry_lock
        /*
         * Wait for readers to observe new parity or be quiescent.
         * wait_for_readers() can release and grab again rcu_registry_lock
-        * interally.
+        * internally.
         */
         */
-       wait_for_readers(&cur_snap_readers, NULL, &qsreaders);
+       wait_for_readers(&cur_snap_readers, NULL, &qsreaders, &acquire_group);
 
        /*
         * Put quiescent reader list back into registry.
 
        /*
         * Put quiescent reader list back into registry.
@@ -504,6 +444,7 @@ void synchronize_rcu(void)
         * iterates on reader threads.
         */
        smp_mb_master();
         * iterates on reader threads.
         */
        smp_mb_master();
+       cmm_annotate_group_mb_acquire(&acquire_group);
 out:
        mutex_unlock(&rcu_registry_lock);
        mutex_unlock(&rcu_gp_lock);
 out:
        mutex_unlock(&rcu_registry_lock);
        mutex_unlock(&rcu_gp_lock);
@@ -515,8 +456,6 @@ out:
         */
        urcu_wake_all_waiters(&waiters);
 }
         */
        urcu_wake_all_waiters(&waiters);
 }
-URCU_ATTR_ALIAS(urcu_stringify(synchronize_rcu))
-void alias_synchronize_rcu();
 
 /*
  * library wrappers to be used by non-LGPL compatible source code.
 
 /*
  * library wrappers to be used by non-LGPL compatible source code.
@@ -526,49 +465,39 @@ void rcu_read_lock(void)
 {
        _rcu_read_lock();
 }
 {
        _rcu_read_lock();
 }
-URCU_ATTR_ALIAS(urcu_stringify(rcu_read_lock))
-void alias_rcu_read_lock();
 
 void rcu_read_unlock(void)
 {
        _rcu_read_unlock();
 }
 
 void rcu_read_unlock(void)
 {
        _rcu_read_unlock();
 }
-URCU_ATTR_ALIAS(urcu_stringify(rcu_read_unlock))
-void alias_rcu_read_unlock();
 
 int rcu_read_ongoing(void)
 {
        return _rcu_read_ongoing();
 }
 
 int rcu_read_ongoing(void)
 {
        return _rcu_read_ongoing();
 }
-URCU_ATTR_ALIAS(urcu_stringify(rcu_read_ongoing))
-void alias_rcu_read_ongoing();
 
 void rcu_register_thread(void)
 {
        URCU_TLS(rcu_reader).tid = pthread_self();
 
 void rcu_register_thread(void)
 {
        URCU_TLS(rcu_reader).tid = pthread_self();
-       assert(URCU_TLS(rcu_reader).need_mb == 0);
-       assert(!(URCU_TLS(rcu_reader).ctr & URCU_GP_CTR_NEST_MASK));
+       urcu_posix_assert(URCU_TLS(rcu_reader).need_mb == 0);
+       urcu_posix_assert(!(URCU_TLS(rcu_reader).ctr & URCU_GP_CTR_NEST_MASK));
 
        mutex_lock(&rcu_registry_lock);
 
        mutex_lock(&rcu_registry_lock);
-       assert(!URCU_TLS(rcu_reader).registered);
+       urcu_posix_assert(!URCU_TLS(rcu_reader).registered);
        URCU_TLS(rcu_reader).registered = 1;
        rcu_init();     /* In case gcc does not support constructor attribute */
        cds_list_add(&URCU_TLS(rcu_reader).node, &registry);
        mutex_unlock(&rcu_registry_lock);
 }
        URCU_TLS(rcu_reader).registered = 1;
        rcu_init();     /* In case gcc does not support constructor attribute */
        cds_list_add(&URCU_TLS(rcu_reader).node, &registry);
        mutex_unlock(&rcu_registry_lock);
 }
-URCU_ATTR_ALIAS(urcu_stringify(rcu_register_thread))
-void alias_rcu_register_thread();
 
 void rcu_unregister_thread(void)
 {
        mutex_lock(&rcu_registry_lock);
 
 void rcu_unregister_thread(void)
 {
        mutex_lock(&rcu_registry_lock);
-       assert(URCU_TLS(rcu_reader).registered);
+       urcu_posix_assert(URCU_TLS(rcu_reader).registered);
        URCU_TLS(rcu_reader).registered = 0;
        cds_list_del(&URCU_TLS(rcu_reader).node);
        mutex_unlock(&rcu_registry_lock);
 }
        URCU_TLS(rcu_reader).registered = 0;
        cds_list_del(&URCU_TLS(rcu_reader).node);
        mutex_unlock(&rcu_registry_lock);
 }
-URCU_ATTR_ALIAS(urcu_stringify(rcu_unregister_thread))
-void alias_rcu_unregister_thread();
 
 #ifdef RCU_MEMBARRIER
 
 
 #ifdef RCU_MEMBARRIER
 
@@ -616,68 +545,15 @@ void rcu_init(void)
        init_done = 1;
        rcu_sys_membarrier_init();
 }
        init_done = 1;
        rcu_sys_membarrier_init();
 }
-URCU_ATTR_ALIAS(urcu_stringify(rcu_init))
-void alias_rcu_init(void);
 #endif
 
 #endif
 
-#ifdef RCU_SIGNAL
-static void sigrcu_handler(int signo, siginfo_t *siginfo, void *context)
-{
-       /*
-        * Executing this cmm_smp_mb() is the only purpose of this signal handler.
-        * It punctually promotes cmm_barrier() into cmm_smp_mb() on every thread it is
-        * executed on.
-        */
-       cmm_smp_mb();
-       _CMM_STORE_SHARED(URCU_TLS(rcu_reader).need_mb, 0);
-       cmm_smp_mb();
-}
-
-/*
- * rcu_init constructor. Called when the library is linked, but also when
- * reader threads are calling rcu_register_thread().
- * Should only be called by a single thread at a given time. This is ensured by
- * holing the rcu_registry_lock from rcu_register_thread() or by running
- * at library load time, which should not be executed by multiple
- * threads nor concurrently with rcu_register_thread() anyway.
- */
-void rcu_init(void)
-{
-       struct sigaction act;
-       int ret;
-
-       if (init_done)
-               return;
-       init_done = 1;
-
-       act.sa_sigaction = sigrcu_handler;
-       act.sa_flags = SA_SIGINFO | SA_RESTART;
-       sigemptyset(&act.sa_mask);
-       ret = sigaction(SIGRCU, &act, NULL);
-       if (ret)
-               urcu_die(errno);
-}
-URCU_ATTR_ALIAS(urcu_stringify(rcu_init))
-void alias_rcu_init(void);
-
 void rcu_exit(void)
 {
 void rcu_exit(void)
 {
-       /*
-        * Don't unregister the SIGRCU signal handler anymore, because
-        * call_rcu threads could still be using it shortly before the
-        * application exits.
-        * Assertion disabled because call_rcu threads are now rcu
-        * readers, and left running at exit.
-        * assert(cds_list_empty(&registry));
-        */
+       urcu_call_rcu_exit();
 }
 }
-URCU_ATTR_ALIAS(urcu_stringify(rcu_exit))
-void alias_rcu_exit(void);
-
-#endif /* #ifdef RCU_SIGNAL */
 
 DEFINE_RCU_FLAVOR(rcu_flavor);
 
 DEFINE_RCU_FLAVOR(rcu_flavor);
-DEFINE_RCU_FLAVOR_ALIAS(rcu_flavor, alias_rcu_flavor);
 
 #include "urcu-call-rcu-impl.h"
 #include "urcu-defer-impl.h"
 
 #include "urcu-call-rcu-impl.h"
 #include "urcu-defer-impl.h"
+#include "urcu-poll-impl.h"
index 85de8ecf9b29531b6cd1245dda4ca06cc8fde310..ff05510bd29d0f87aba4632bfcf92b8c34c43cc9 100644 (file)
@@ -1,24 +1,10 @@
+// SPDX-FileCopyrightText: 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2011-2012 Lai Jiangshan <laijs@cn.fujitsu.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * wfcqueue.c
- *
  * Userspace RCU library - Concurrent Queue with Wait-Free Enqueue/Blocking Dequeue
  * Userspace RCU library - Concurrent Queue with Wait-Free Enqueue/Blocking Dequeue
- *
- * Copyright 2010-2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright 2011-2012 - Lai Jiangshan <laijs@cn.fujitsu.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 /* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
  */
 
 /* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
index 509f4f9c6275b1511916f7046c40ffbd978c99d7..062f8017ea9dd179bded32483416b9f128fa1459 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * wfqueue.c
- *
  * Userspace RCU library - Queue with Wait-Free Enqueue/Blocking Dequeue
  * Userspace RCU library - Queue with Wait-Free Enqueue/Blocking Dequeue
- *
- * Copyright 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 /* Remove deprecation warnings from LGPL wrapper build. */
  */
 
 /* Remove deprecation warnings from LGPL wrapper build. */
index 46300f92ce061176a4b2fe9339a85891c5d8f0e7..8fddaecf32a9c1d2e1f3326947f0f7e5c71ed2ef 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * wfstack.c
- *
  * Userspace RCU library - Stack with wait-free push, blocking traversal.
  * Userspace RCU library - Stack with wait-free push, blocking traversal.
- *
- * Copyright 2010-2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 /* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
  */
 
 /* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
index 59eb21d534e9446df3f477795062e9dba4ec2abc..10b9fdee5df22155875edda1ccf4fff77adf3f0f 100644 (file)
@@ -1,31 +1,16 @@
+// SPDX-FileCopyrightText: 2010 Paul E. McKenney <paulmck@linux.vnet.ibm.com>
+// SPDX-FileCopyrightText: 2017 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * workqueue.c
- *
  * Userspace RCU library - Userspace workqeues
  * Userspace RCU library - Userspace workqeues
- *
- * Copyright (c) 2010 Paul E. McKenney <paulmck@linux.vnet.ibm.com>
- * Copyright (c) 2017 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #define _LGPL_SOURCE
 #include <stdio.h>
 #include <pthread.h>
 #include <signal.h>
  */
 
 #define _LGPL_SOURCE
 #include <stdio.h>
 #include <pthread.h>
 #include <signal.h>
-#include <assert.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include <string.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include <string.h>
@@ -36,6 +21,7 @@
 #include <sched.h>
 
 #include "compat-getcpu.h"
 #include <sched.h>
 
 #include "compat-getcpu.h"
+#include <urcu/assert.h>
 #include <urcu/wfcqueue.h>
 #include <urcu/pointer.h>
 #include <urcu/list.h>
 #include <urcu/wfcqueue.h>
 #include <urcu/pointer.h>
 #include <urcu/list.h>
@@ -92,7 +78,7 @@ struct urcu_workqueue_completion_work {
  * Losing affinity can be caused by CPU hotunplug/hotplug, or by
  * cpuset(7).
  */
  * Losing affinity can be caused by CPU hotunplug/hotplug, or by
  * cpuset(7).
  */
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
 static int set_thread_cpu_affinity(struct urcu_workqueue *workqueue)
 {
        cpu_set_t mask;
 static int set_thread_cpu_affinity(struct urcu_workqueue *workqueue)
 {
        cpu_set_t mask;
@@ -107,11 +93,8 @@ static int set_thread_cpu_affinity(struct urcu_workqueue *workqueue)
 
        CPU_ZERO(&mask);
        CPU_SET(workqueue->cpu_affinity, &mask);
 
        CPU_ZERO(&mask);
        CPU_SET(workqueue->cpu_affinity, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       ret = sched_setaffinity(0, &mask);
-#else
        ret = sched_setaffinity(0, sizeof(mask), &mask);
        ret = sched_setaffinity(0, sizeof(mask), &mask);
-#endif
+
        /*
         * EINVAL is fine: can be caused by hotunplugged CPUs, or by
         * cpuset(7). This is why we should always retry if we detect
        /*
         * EINVAL is fine: can be caused by hotunplugged CPUs, or by
         * cpuset(7). This is why we should always retry if we detect
@@ -124,7 +107,7 @@ static int set_thread_cpu_affinity(struct urcu_workqueue *workqueue)
        return ret;
 }
 #else
        return ret;
 }
 #else
-static int set_thread_cpu_affinity(struct urcu_workqueue *workqueue)
+static int set_thread_cpu_affinity(struct urcu_workqueue *workqueue __attribute__((unused)))
 {
        return 0;
 }
 {
        return 0;
 }
@@ -134,16 +117,25 @@ static void futex_wait(int32_t *futex)
 {
        /* Read condition before read futex */
        cmm_smp_mb();
 {
        /* Read condition before read futex */
        cmm_smp_mb();
-       if (uatomic_read(futex) != -1)
-               return;
-       while (futex_async(futex, FUTEX_WAIT, -1, NULL, NULL, 0)) {
+       while (uatomic_read(futex) == -1) {
+               if (!futex_async(futex, FUTEX_WAIT, -1, NULL, NULL, 0)) {
+                       /*
+                        * Prior queued wakeups queued by unrelated code
+                        * using the same address can cause futex wait to
+                        * return 0 even through the futex value is still
+                        * -1 (spurious wakeups). Check the value again
+                        * in user-space to validate whether it really
+                        * differs from -1.
+                        */
+                       continue;
+               }
                switch (errno) {
                switch (errno) {
-               case EWOULDBLOCK:
+               case EAGAIN:
                        /* Value already changed. */
                        return;
                case EINTR:
                        /* Retry if interrupted by signal. */
                        /* Value already changed. */
                        return;
                case EINTR:
                        /* Retry if interrupted by signal. */
-                       break;  /* Get out of switch. */
+                       break;  /* Get out of switch. Check again. */
                default:
                        /* Unexpected error. */
                        urcu_die(errno);
                default:
                        /* Unexpected error. */
                        urcu_die(errno);
@@ -213,8 +205,8 @@ static void *workqueue_thread(void *arg)
                cds_wfcq_init(&cbs_tmp_head, &cbs_tmp_tail);
                splice_ret = __cds_wfcq_splice_blocking(&cbs_tmp_head,
                        &cbs_tmp_tail, &workqueue->cbs_head, &workqueue->cbs_tail);
                cds_wfcq_init(&cbs_tmp_head, &cbs_tmp_tail);
                splice_ret = __cds_wfcq_splice_blocking(&cbs_tmp_head,
                        &cbs_tmp_tail, &workqueue->cbs_head, &workqueue->cbs_tail);
-               assert(splice_ret != CDS_WFCQ_RET_WOULDBLOCK);
-               assert(splice_ret != CDS_WFCQ_RET_DEST_NON_EMPTY);
+               urcu_posix_assert(splice_ret != CDS_WFCQ_RET_WOULDBLOCK);
+               urcu_posix_assert(splice_ret != CDS_WFCQ_RET_DEST_NON_EMPTY);
                if (splice_ret != CDS_WFCQ_RET_SRC_EMPTY) {
                        if (workqueue->grace_period_fct)
                                workqueue->grace_period_fct(workqueue, workqueue->priv);
                if (splice_ret != CDS_WFCQ_RET_SRC_EMPTY) {
                        if (workqueue->grace_period_fct)
                                workqueue->grace_period_fct(workqueue, workqueue->priv);
@@ -278,6 +270,7 @@ struct urcu_workqueue *urcu_workqueue_create(unsigned long flags,
 {
        struct urcu_workqueue *workqueue;
        int ret;
 {
        struct urcu_workqueue *workqueue;
        int ret;
+       sigset_t newmask, oldmask;
 
        workqueue = malloc(sizeof(*workqueue));
        if (workqueue == NULL)
 
        workqueue = malloc(sizeof(*workqueue));
        if (workqueue == NULL)
@@ -298,10 +291,20 @@ struct urcu_workqueue *urcu_workqueue_create(unsigned long flags,
        workqueue->cpu_affinity = cpu_affinity;
        workqueue->loop_count = 0;
        cmm_smp_mb();  /* Structure initialized before pointer is planted. */
        workqueue->cpu_affinity = cpu_affinity;
        workqueue->loop_count = 0;
        cmm_smp_mb();  /* Structure initialized before pointer is planted. */
+
+       ret = sigfillset(&newmask);
+       urcu_posix_assert(!ret);
+       ret = pthread_sigmask(SIG_BLOCK, &newmask, &oldmask);
+       urcu_posix_assert(!ret);
+
        ret = pthread_create(&workqueue->tid, NULL, workqueue_thread, workqueue);
        if (ret) {
                urcu_die(ret);
        }
        ret = pthread_create(&workqueue->tid, NULL, workqueue_thread, workqueue);
        if (ret) {
                urcu_die(ret);
        }
+
+       ret = pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
+       urcu_posix_assert(!ret);
+
        return workqueue;
 }
 
        return workqueue;
 }
 
@@ -339,7 +342,7 @@ void urcu_workqueue_destroy(struct urcu_workqueue *workqueue)
        if (urcu_workqueue_destroy_worker(workqueue)) {
                urcu_die(errno);
        }
        if (urcu_workqueue_destroy_worker(workqueue)) {
                urcu_die(errno);
        }
-       assert(cds_wfcq_empty(&workqueue->cbs_head, &workqueue->cbs_tail));
+       urcu_posix_assert(cds_wfcq_empty(&workqueue->cbs_head, &workqueue->cbs_tail));
        free(workqueue);
 }
 
        free(workqueue);
 }
 
@@ -381,7 +384,7 @@ struct urcu_workqueue_completion *urcu_workqueue_create_completion(void)
 {
        struct urcu_workqueue_completion *completion;
 
 {
        struct urcu_workqueue_completion *completion;
 
-       completion = calloc(sizeof(*completion), 1);
+       completion = calloc(1, sizeof(*completion));
        if (!completion)
                urcu_die(errno);
        urcu_ref_set(&completion->ref, 1);
        if (!completion)
                urcu_die(errno);
        urcu_ref_set(&completion->ref, 1);
@@ -412,7 +415,7 @@ void urcu_workqueue_queue_completion(struct urcu_workqueue *workqueue,
 {
        struct urcu_workqueue_completion_work *work;
 
 {
        struct urcu_workqueue_completion_work *work;
 
-       work = calloc(sizeof(*work), 1);
+       work = calloc(1, sizeof(*work));
        if (!work)
                urcu_die(errno);
        work->completion = completion;
        if (!work)
                urcu_die(errno);
        work->completion = completion;
@@ -458,13 +461,23 @@ void urcu_workqueue_resume_worker(struct urcu_workqueue *workqueue)
 void urcu_workqueue_create_worker(struct urcu_workqueue *workqueue)
 {
        int ret;
 void urcu_workqueue_create_worker(struct urcu_workqueue *workqueue)
 {
        int ret;
+       sigset_t newmask, oldmask;
 
        /* Clear workqueue state from parent. */
        workqueue->flags &= ~URCU_WORKQUEUE_PAUSED;
        workqueue->flags &= ~URCU_WORKQUEUE_PAUSE;
        workqueue->tid = 0;
 
        /* Clear workqueue state from parent. */
        workqueue->flags &= ~URCU_WORKQUEUE_PAUSED;
        workqueue->flags &= ~URCU_WORKQUEUE_PAUSE;
        workqueue->tid = 0;
+
+       ret = sigfillset(&newmask);
+       urcu_posix_assert(!ret);
+       ret = pthread_sigmask(SIG_BLOCK, &newmask, &oldmask);
+       urcu_posix_assert(!ret);
+
        ret = pthread_create(&workqueue->tid, NULL, workqueue_thread, workqueue);
        if (ret) {
                urcu_die(ret);
        }
        ret = pthread_create(&workqueue->tid, NULL, workqueue_thread, workqueue);
        if (ret) {
                urcu_die(ret);
        }
+
+       ret = pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
+       urcu_posix_assert(!ret);
 }
 }
index 52b69731003ad322f7272a7d52c41d2325070373..ed391da7743d062f6d7c5d4009614d4db1fb8f71 100644 (file)
@@ -1,27 +1,13 @@
+// SPDX-FileCopyrightText: 2009,2017 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef _URCU_WORKQUEUE_H
 #define _URCU_WORKQUEUE_H
 
 /*
 #ifndef _URCU_WORKQUEUE_H
 #define _URCU_WORKQUEUE_H
 
 /*
- * workqueue.h
- *
  * Userspace RCU header - Userspace workqueues
  * Userspace RCU header - Userspace workqueues
- *
- * Copyright (c) 2009,2017 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <stdlib.h>
  */
 
 #include <stdlib.h>
index 8e0e6d14d397a434555ad175842768c6b4fedfb7..c4f4afa11a73c8c8011dfe8cd9cc554584c273d2 100644 (file)
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
+
 SUBDIRS = utils common unit benchmark regression
 
 .PHONY: short_bench long_bench regtest check-loop
 SUBDIRS = utils common unit benchmark regression
 
 .PHONY: short_bench long_bench regtest check-loop
index 5068d0eead0643e1d18f28074f9614ef7aa630fb..e5ce2e9860bb6c8560d1665ab33b4dff9026b04b 100644 (file)
@@ -1,14 +1,20 @@
-AM_CFLAGS += -I$(top_srcdir)/include -I$(top_builddir)/include -I$(top_srcdir)/src -I$(top_srcdir)/tests/common -g
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
+
+AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/tests/common
+AM_CPPFLAGS += -include $(top_srcdir)/tests/benchmark/common-states.h
 
 TEST_EXTENSIONS = .tap
 TAP_LOG_DRIVER_FLAGS = --merge --comments
 
 TEST_EXTENSIONS = .tap
 TAP_LOG_DRIVER_FLAGS = --merge --comments
-TAP_LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \
-       $(top_srcdir)/config/tap-driver.sh
+TAP_LOG_DRIVER = env AM_TAP_AWK='$(AWK)' \
+       URCU_TESTS_SRCDIR='$(abs_top_srcdir)/tests' \
+       URCU_TESTS_BUILDDIR='$(abs_top_builddir)/tests' \
+       $(SHELL) $(top_srcdir)/tests/utils/tap-driver.sh
 
 
-SCRIPT_LIST = common.sh \
-       run-urcu-tests.sh \
-       runhash.sh \
-       runtests.sh \
+noinst_HEADERS = common-states.h
+
+SCRIPT_LIST = \
        runpaul-phase1.sh \
        runpaul-phase2.sh \
        runpaul-phase3.sh \
        runpaul-phase1.sh \
        runpaul-phase2.sh \
        runpaul-phase3.sh \
@@ -16,10 +22,14 @@ SCRIPT_LIST = common.sh \
        runpaul-phase5.sh \
        runpaul-phase6.sh \
        runpaul-phase7.sh \
        runpaul-phase5.sh \
        runpaul-phase6.sh \
        runpaul-phase7.sh \
-       runtests-batch.sh \
        subphase4.sh
 
        subphase4.sh
 
-dist_noinst_SCRIPTS = $(SCRIPT_LIST)
+dist_noinst_SCRIPTS = \
+       runhash.sh \
+       runtests-batch.sh \
+       runtests.sh \
+       run-urcu-tests.sh \
+       $(SCRIPT_LIST)
 
 dist_noinst_DATA = \
        hashtable_1_seconds.tap \
 
 dist_noinst_DATA = \
        hashtable_1_seconds.tap \
@@ -30,13 +40,12 @@ dist_noinst_DATA = \
        urcu_30_seconds.tap
 
 noinst_PROGRAMS = test_urcu test_urcu_dynamic_link test_urcu_timing \
        urcu_30_seconds.tap
 
 noinst_PROGRAMS = test_urcu test_urcu_dynamic_link test_urcu_timing \
-       test_urcu_signal test_urcu_signal_dynamic_link test_urcu_signal_timing \
         test_rwlock_timing test_rwlock test_perthreadlock_timing \
         test_rwlock_timing test_rwlock test_perthreadlock_timing \
-        test_perthreadlock test_urcu_yield test_urcu_signal_yield test_urcu_mb \
+        test_perthreadlock test_urcu_yield test_urcu_mb \
         test_urcu_qsbr_timing test_urcu_qsbr \
         test_urcu_qsbr_timing test_urcu_qsbr \
-       test_mutex test_looplen test_urcu_gc test_urcu_signal_gc \
+       test_mutex test_looplen test_urcu_gc \
        test_urcu_lgc \
        test_urcu_lgc \
-        test_urcu_mb_gc test_urcu_qsbr_gc test_urcu_qsbr_lgc test_urcu_signal_lgc \
+        test_urcu_mb_gc test_urcu_qsbr_gc test_urcu_qsbr_lgc \
         test_urcu_mb_lgc test_urcu_qsbr_dynamic_link test_urcu_defer \
         test_urcu_assign test_urcu_assign_dynamic_link \
         test_urcu_bp test_urcu_bp_dynamic_link test_cycles_per_loop \
         test_urcu_mb_lgc test_urcu_qsbr_dynamic_link test_urcu_defer \
         test_urcu_assign test_urcu_assign_dynamic_link \
         test_urcu_bp test_urcu_bp_dynamic_link test_cycles_per_loop \
@@ -52,182 +61,156 @@ URCU_COMMON_LIB=$(top_builddir)/src/liburcu-common.la
 URCU_LIB=$(top_builddir)/src/liburcu.la
 URCU_QSBR_LIB=$(top_builddir)/src/liburcu-qsbr.la
 URCU_MB_LIB=$(top_builddir)/src/liburcu-mb.la
 URCU_LIB=$(top_builddir)/src/liburcu.la
 URCU_QSBR_LIB=$(top_builddir)/src/liburcu-qsbr.la
 URCU_MB_LIB=$(top_builddir)/src/liburcu-mb.la
-URCU_SIGNAL_LIB=$(top_builddir)/src/liburcu-signal.la
 URCU_BP_LIB=$(top_builddir)/src/liburcu-bp.la
 URCU_CDS_LIB=$(top_builddir)/src/liburcu-cds.la
 
 DEBUG_YIELD_LIB=$(builddir)/../common/libdebug-yield.la
 
 URCU_BP_LIB=$(top_builddir)/src/liburcu-bp.la
 URCU_CDS_LIB=$(top_builddir)/src/liburcu-cds.la
 
 DEBUG_YIELD_LIB=$(builddir)/../common/libdebug-yield.la
 
-test_urcu_SOURCES = test_urcu.c
+test_urcu_SOURCES = test_urcu.c common-states.c
 test_urcu_LDADD = $(URCU_LIB)
 
 test_urcu_LDADD = $(URCU_LIB)
 
-test_urcu_dynamic_link_SOURCES = test_urcu.c
+test_urcu_dynamic_link_SOURCES = test_urcu.c common-states.c
 test_urcu_dynamic_link_LDADD = $(URCU_LIB)
 test_urcu_dynamic_link_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 
 test_urcu_dynamic_link_LDADD = $(URCU_LIB)
 test_urcu_dynamic_link_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 
-test_urcu_timing_SOURCES = test_urcu_timing.c
+test_urcu_timing_SOURCES = test_urcu_timing.c common-states.c
 test_urcu_timing_LDADD = $(URCU_LIB)
 
 test_urcu_timing_LDADD = $(URCU_LIB)
 
-test_urcu_yield_SOURCES = test_urcu.c
+test_urcu_yield_SOURCES = test_urcu.c common-states.c
 test_urcu_yield_LDADD = $(URCU_LIB) $(DEBUG_YIELD_LIB)
 test_urcu_yield_CFLAGS = -DDEBUG_YIELD $(AM_CFLAGS)
 
 
 test_urcu_yield_LDADD = $(URCU_LIB) $(DEBUG_YIELD_LIB)
 test_urcu_yield_CFLAGS = -DDEBUG_YIELD $(AM_CFLAGS)
 
 
-test_urcu_qsbr_SOURCES = test_urcu_qsbr.c
+test_urcu_qsbr_SOURCES = test_urcu_qsbr.c common-states.c
 test_urcu_qsbr_LDADD = $(URCU_QSBR_LIB)
 
 test_urcu_qsbr_LDADD = $(URCU_QSBR_LIB)
 
-test_urcu_qsbr_timing_SOURCES = test_urcu_qsbr_timing.c
+test_urcu_qsbr_timing_SOURCES = test_urcu_qsbr_timing.c common-states.c
 test_urcu_qsbr_timing_LDADD = $(URCU_QSBR_LIB)
 
 
 test_urcu_qsbr_timing_LDADD = $(URCU_QSBR_LIB)
 
 
-test_urcu_mb_SOURCES = test_urcu.c
+test_urcu_mb_SOURCES = test_urcu.c common-states.c
 test_urcu_mb_LDADD = $(URCU_MB_LIB)
 test_urcu_mb_CFLAGS = -DRCU_MB $(AM_CFLAGS)
 
 
 test_urcu_mb_LDADD = $(URCU_MB_LIB)
 test_urcu_mb_CFLAGS = -DRCU_MB $(AM_CFLAGS)
 
 
-test_urcu_signal_SOURCES = test_urcu.c
-test_urcu_signal_LDADD = $(URCU_SIGNAL_LIB)
-test_urcu_signal_CFLAGS = -DRCU_SIGNAL $(AM_CFLAGS)
-
-test_urcu_signal_dynamic_link_SOURCES = test_urcu.c
-test_urcu_signal_dynamic_link_LDADD = $(URCU_SIGNAL_LIB)
-test_urcu_signal_dynamic_link_CFLAGS = -DRCU_SIGNAL -DDYNAMIC_LINK_TEST \
-                                       $(AM_CFLAGS)
-
-test_urcu_signal_timing_SOURCES = test_urcu_timing.c
-test_urcu_signal_timing_LDADD = $(URCU_SIGNAL_LIB)
-test_urcu_signal_timing_CFLAGS= -DRCU_SIGNAL $(AM_CFLAGS)
+test_rwlock_timing_SOURCES = test_rwlock_timing.c common-states.c
+test_rwlock_timing_LDADD = $(URCU_LIB)
 
 
-test_urcu_signal_yield_SOURCES = test_urcu.c
-test_urcu_signal_yield_LDADD = $(URCU_SIGNAL_LIB) $(DEBUG_YIELD_LIB)
-test_urcu_signal_yield_CFLAGS = -DRCU_SIGNAL -DDEBUG_YIELD $(AM_CFLAGS)
+test_rwlock_SOURCES = test_rwlock.c common-states.c
+test_rwlock_LDADD = $(URCU_LIB)
 
 
-test_rwlock_timing_SOURCES = test_rwlock_timing.c
-test_rwlock_timing_LDADD = $(URCU_SIGNAL_LIB)
+test_perthreadlock_timing_SOURCES = test_perthreadlock_timing.c common-states.c
+test_perthreadlock_timing_LDADD = $(URCU_LIB)
 
 
-test_rwlock_SOURCES = test_rwlock.c
-test_rwlock_LDADD = $(URCU_SIGNAL_LIB)
+test_perthreadlock_SOURCES = test_perthreadlock.c common-states.c
+test_perthreadlock_LDADD = $(URCU_LIB)
 
 
-test_perthreadlock_timing_SOURCES = test_perthreadlock_timing.c
-test_perthreadlock_timing_LDADD = $(URCU_SIGNAL_LIB)
+test_mutex_SOURCES = test_mutex.c common-states.c
 
 
-test_perthreadlock_SOURCES = test_perthreadlock.c
-test_perthreadlock_LDADD = $(URCU_SIGNAL_LIB)
+test_looplen_SOURCES = test_looplen.c common-states.c
 
 
-test_mutex_SOURCES = test_mutex.c
-
-test_looplen_SOURCES = test_looplen.c
-
-test_urcu_gc_SOURCES = test_urcu_gc.c
+test_urcu_gc_SOURCES = test_urcu_gc.c common-states.c
 test_urcu_gc_LDADD = $(URCU_LIB)
 
 test_urcu_gc_LDADD = $(URCU_LIB)
 
-test_urcu_signal_gc_SOURCES = test_urcu_gc.c
-test_urcu_signal_gc_LDADD = $(URCU_SIGNAL_LIB)
-test_urcu_signal_gc_CFLAGS = -DRCU_SIGNAL $(AM_CFLAGS)
-
-test_urcu_mb_gc_SOURCES = test_urcu_gc.c
+test_urcu_mb_gc_SOURCES = test_urcu_gc.c common-states.c
 test_urcu_mb_gc_LDADD = $(URCU_MB_LIB)
 test_urcu_mb_gc_CFLAGS = -DRCU_MB $(AM_CFLAGS)
 
 test_urcu_mb_gc_LDADD = $(URCU_MB_LIB)
 test_urcu_mb_gc_CFLAGS = -DRCU_MB $(AM_CFLAGS)
 
-test_urcu_qsbr_gc_SOURCES = test_urcu_qsbr_gc.c
+test_urcu_qsbr_gc_SOURCES = test_urcu_qsbr_gc.c common-states.c
 test_urcu_qsbr_gc_LDADD = $(URCU_QSBR_LIB)
 
 test_urcu_qsbr_gc_LDADD = $(URCU_QSBR_LIB)
 
-test_urcu_qsbr_lgc_SOURCES = test_urcu_qsbr_gc.c
+test_urcu_qsbr_lgc_SOURCES = test_urcu_qsbr_gc.c common-states.c
 test_urcu_qsbr_lgc_LDADD = $(URCU_QSBR_LIB)
 test_urcu_qsbr_lgc_CFLAGS = -DTEST_LOCAL_GC $(AM_CFLAGS)
 
 test_urcu_qsbr_lgc_LDADD = $(URCU_QSBR_LIB)
 test_urcu_qsbr_lgc_CFLAGS = -DTEST_LOCAL_GC $(AM_CFLAGS)
 
-test_urcu_lgc_SOURCES = test_urcu_gc.c
+test_urcu_lgc_SOURCES = test_urcu_gc.c common-states.c
 test_urcu_lgc_LDADD = $(URCU_LIB)
 test_urcu_lgc_CFLAGS = -DTEST_LOCAL_GC $(AM_CFLAGS)
 
 test_urcu_lgc_LDADD = $(URCU_LIB)
 test_urcu_lgc_CFLAGS = -DTEST_LOCAL_GC $(AM_CFLAGS)
 
-test_urcu_signal_lgc_SOURCES = test_urcu_gc.c
-test_urcu_signal_lgc_LDADD = $(URCU_SIGNAL_LIB)
-test_urcu_signal_lgc_CFLAGS = -DRCU_SIGNAL -DTEST_LOCAL_GC $(AM_CFLAGS)
-
-test_urcu_mb_lgc_SOURCES = test_urcu_gc.c
+test_urcu_mb_lgc_SOURCES = test_urcu_gc.c common-states.c
 test_urcu_mb_lgc_LDADD = $(URCU_MB_LIB)
 test_urcu_mb_lgc_CFLAGS = -DTEST_LOCAL_GC -DRCU_MB $(AM_CFLAGS)
 
 test_urcu_mb_lgc_LDADD = $(URCU_MB_LIB)
 test_urcu_mb_lgc_CFLAGS = -DTEST_LOCAL_GC -DRCU_MB $(AM_CFLAGS)
 
-test_urcu_qsbr_dynamic_link_SOURCES = test_urcu_qsbr.c
+test_urcu_qsbr_dynamic_link_SOURCES = test_urcu_qsbr.c common-states.c
 test_urcu_qsbr_dynamic_link_LDADD = $(URCU_QSBR_LIB)
 test_urcu_qsbr_dynamic_link_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 
 test_urcu_qsbr_dynamic_link_LDADD = $(URCU_QSBR_LIB)
 test_urcu_qsbr_dynamic_link_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 
-test_urcu_defer_SOURCES = test_urcu_defer.c
+test_urcu_defer_SOURCES = test_urcu_defer.c common-states.c
 test_urcu_defer_LDADD = $(URCU_LIB)
 
 test_cycles_per_loop_SOURCES = test_cycles_per_loop.c
 
 test_urcu_defer_LDADD = $(URCU_LIB)
 
 test_cycles_per_loop_SOURCES = test_cycles_per_loop.c
 
-test_urcu_assign_SOURCES = test_urcu_assign.c
+test_urcu_assign_SOURCES = test_urcu_assign.c common-states.c
 test_urcu_assign_LDADD = $(URCU_LIB)
 
 test_urcu_assign_LDADD = $(URCU_LIB)
 
-test_urcu_assign_dynamic_link_SOURCES = test_urcu_assign.c
+test_urcu_assign_dynamic_link_SOURCES = test_urcu_assign.c common-states.c
 test_urcu_assign_dynamic_link_LDADD = $(URCU_LIB)
 test_urcu_assign_dynamic_link_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 
 test_urcu_assign_dynamic_link_LDADD = $(URCU_LIB)
 test_urcu_assign_dynamic_link_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 
-test_urcu_bp_SOURCES = test_urcu_bp.c
+test_urcu_bp_SOURCES = test_urcu_bp.c common-states.c
 test_urcu_bp_LDADD = $(URCU_BP_LIB)
 
 test_urcu_bp_LDADD = $(URCU_BP_LIB)
 
-test_urcu_bp_dynamic_link_SOURCES = test_urcu_bp.c
+test_urcu_bp_dynamic_link_SOURCES = test_urcu_bp.c common-states.c
 test_urcu_bp_dynamic_link_LDADD = $(URCU_BP_LIB)
 test_urcu_bp_dynamic_link_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 
 test_urcu_bp_dynamic_link_LDADD = $(URCU_BP_LIB)
 test_urcu_bp_dynamic_link_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 
-test_urcu_lfq_SOURCES = test_urcu_lfq.c
+test_urcu_lfq_SOURCES = test_urcu_lfq.c common-states.c
 test_urcu_lfq_LDADD = $(URCU_LIB) $(URCU_CDS_LIB)
 
 test_urcu_lfq_LDADD = $(URCU_LIB) $(URCU_CDS_LIB)
 
-test_urcu_lfq_dynlink_SOURCES = test_urcu_lfq.c
+test_urcu_lfq_dynlink_SOURCES = test_urcu_lfq.c common-states.c
 test_urcu_lfq_dynlink_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 test_urcu_lfq_dynlink_LDADD = $(URCU_LIB) $(URCU_CDS_LIB)
 
 test_urcu_lfq_dynlink_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 test_urcu_lfq_dynlink_LDADD = $(URCU_LIB) $(URCU_CDS_LIB)
 
-test_urcu_wfq_SOURCES = test_urcu_wfq.c
+test_urcu_wfq_SOURCES = test_urcu_wfq.c common-states.c
 test_urcu_wfq_LDADD = $(URCU_COMMON_LIB)
 
 test_urcu_wfq_LDADD = $(URCU_COMMON_LIB)
 
-test_urcu_wfq_dynlink_SOURCES = test_urcu_wfq.c
+test_urcu_wfq_dynlink_SOURCES = test_urcu_wfq.c common-states.c
 test_urcu_wfq_dynlink_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 test_urcu_wfq_dynlink_LDADD = $(URCU_COMMON_LIB)
 
 test_urcu_wfq_dynlink_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 test_urcu_wfq_dynlink_LDADD = $(URCU_COMMON_LIB)
 
-test_urcu_wfcq_SOURCES = test_urcu_wfcq.c
+test_urcu_wfcq_SOURCES = test_urcu_wfcq.c common-states.c
 test_urcu_wfcq_LDADD = $(URCU_COMMON_LIB)
 
 test_urcu_wfcq_LDADD = $(URCU_COMMON_LIB)
 
-test_urcu_wfcq_dynlink_SOURCES = test_urcu_wfcq.c
+test_urcu_wfcq_dynlink_SOURCES = test_urcu_wfcq.c common-states.c
 test_urcu_wfcq_dynlink_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 test_urcu_wfcq_dynlink_LDADD = $(URCU_COMMON_LIB)
 
 test_urcu_wfcq_dynlink_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 test_urcu_wfcq_dynlink_LDADD = $(URCU_COMMON_LIB)
 
-test_urcu_lfs_SOURCES = test_urcu_lfs.c
+test_urcu_lfs_SOURCES = test_urcu_lfs.c common-states.c
 test_urcu_lfs_LDADD = $(URCU_LIB) $(URCU_CDS_LIB)
 
 test_urcu_lfs_LDADD = $(URCU_LIB) $(URCU_CDS_LIB)
 
-test_urcu_lfs_rcu_SOURCES = test_urcu_lfs_rcu.c
+test_urcu_lfs_rcu_SOURCES = test_urcu_lfs_rcu.c common-states.c
 test_urcu_lfs_rcu_LDADD = $(URCU_LIB) $(URCU_CDS_LIB)
 
 test_urcu_lfs_rcu_LDADD = $(URCU_LIB) $(URCU_CDS_LIB)
 
-test_urcu_lfs_dynlink_SOURCES = test_urcu_lfs.c
+test_urcu_lfs_dynlink_SOURCES = test_urcu_lfs.c common-states.c
 test_urcu_lfs_dynlink_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 test_urcu_lfs_dynlink_LDADD = $(URCU_LIB) $(URCU_CDS_LIB)
 
 test_urcu_lfs_dynlink_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 test_urcu_lfs_dynlink_LDADD = $(URCU_LIB) $(URCU_CDS_LIB)
 
-test_urcu_lfs_rcu_dynlink_SOURCES = test_urcu_lfs_rcu.c
+test_urcu_lfs_rcu_dynlink_SOURCES = test_urcu_lfs_rcu.c common-states.c
 test_urcu_lfs_rcu_dynlink_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 test_urcu_lfs_rcu_dynlink_LDADD = $(URCU_LIB) $(URCU_CDS_LIB)
 
 test_urcu_lfs_rcu_dynlink_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 test_urcu_lfs_rcu_dynlink_LDADD = $(URCU_LIB) $(URCU_CDS_LIB)
 
-test_urcu_wfs_SOURCES = test_urcu_wfs.c
+test_urcu_wfs_SOURCES = test_urcu_wfs.c common-states.c
 test_urcu_wfs_LDADD = $(URCU_COMMON_LIB)
 
 test_urcu_wfs_LDADD = $(URCU_COMMON_LIB)
 
-test_urcu_wfs_dynlink_SOURCES = test_urcu_wfs.c
+test_urcu_wfs_dynlink_SOURCES = test_urcu_wfs.c common-states.c
 test_urcu_wfs_dynlink_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 test_urcu_wfs_dynlink_LDADD = $(URCU_COMMON_LIB)
 
 test_urcu_hash_SOURCES = test_urcu_hash.c test_urcu_hash.h \
 test_urcu_wfs_dynlink_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 test_urcu_wfs_dynlink_LDADD = $(URCU_COMMON_LIB)
 
 test_urcu_hash_SOURCES = test_urcu_hash.c test_urcu_hash.h \
-               test_urcu_hash_rw.c test_urcu_hash_unique.c
+               test_urcu_hash_rw.c test_urcu_hash_unique.c common-states.c
 test_urcu_hash_CFLAGS = -DRCU_QSBR $(AM_CFLAGS)
 test_urcu_hash_LDADD = $(URCU_QSBR_LIB) $(URCU_COMMON_LIB) $(URCU_CDS_LIB)
 
 all-local:
        @if [ x"$(srcdir)" != x"$(builddir)" ]; then \
 test_urcu_hash_CFLAGS = -DRCU_QSBR $(AM_CFLAGS)
 test_urcu_hash_LDADD = $(URCU_QSBR_LIB) $(URCU_COMMON_LIB) $(URCU_CDS_LIB)
 
 all-local:
        @if [ x"$(srcdir)" != x"$(builddir)" ]; then \
-               for script in $(SCRIPT_LIST) $(TEST_LIST); do \
+               for script in $(SCRIPT_LIST); do \
                        cp -f $(srcdir)/$$script $(builddir); \
                done; \
        fi
 
 clean-local:
        @if [ x"$(srcdir)" != x"$(builddir)" ]; then \
                        cp -f $(srcdir)/$$script $(builddir); \
                done; \
        fi
 
 clean-local:
        @if [ x"$(srcdir)" != x"$(builddir)" ]; then \
-               for script in $(SCRIPT_LIST) $(TEST_LIST); do \
+               for script in $(SCRIPT_LIST); do \
                        rm -f $(builddir)/$$script; \
                done; \
        fi
                        rm -f $(builddir)/$$script; \
                done; \
        fi
diff --git a/tests/benchmark/common-states.c b/tests/benchmark/common-states.c
new file mode 100644 (file)
index 0000000..4a7f719
--- /dev/null
@@ -0,0 +1,5 @@
+// SPDX-FileCopyrightText: 2023 Olivier Dion <odion@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+volatile int _test_go = 0, _test_stop = 0;
diff --git a/tests/benchmark/common-states.h b/tests/benchmark/common-states.h
new file mode 100644 (file)
index 0000000..d46fd38
--- /dev/null
@@ -0,0 +1,55 @@
+// SPDX-FileCopyrightText: 2023 Olivier Dion <odion@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+/* Common states for benchmarks. */
+
+#include <unistd.h>
+
+#include <urcu/uatomic.h>
+
+extern volatile int _test_go, _test_stop;
+
+static inline void complete_sleep(unsigned int seconds)
+{
+       while (seconds != 0) {
+               seconds = sleep(seconds);
+       }
+}
+
+static inline void begin_test(void)
+{
+       uatomic_store(&_test_go, 1, CMM_RELEASE);
+}
+
+static inline void end_test(void)
+{
+       uatomic_store(&_test_stop, 1, CMM_RELAXED);
+}
+
+static inline void test_for(unsigned int duration)
+{
+       begin_test();
+       complete_sleep(duration);
+       end_test();
+}
+
+static inline void wait_until_go(void)
+{
+       while (!uatomic_load(&_test_go, CMM_ACQUIRE))
+       {
+       }
+}
+
+/*
+ * returns 0 if test should end.
+ */
+static inline int test_duration_write(void)
+{
+       return !uatomic_load(&_test_stop, CMM_RELAXED);
+}
+
+static inline int test_duration_read(void)
+{
+       return !uatomic_load(&_test_stop, CMM_RELAXED);
+}
diff --git a/tests/benchmark/common.sh b/tests/benchmark/common.sh
deleted file mode 100755 (executable)
index 4dbc567..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-#
-# This file is meant to be sourced from other tests scripts.
-#
-
-cleanup() {
-       if [ x"$TMPFILE" != "x" ]; then
-               rm -f "$TMPFILE"
-       fi
-
-       # Call the tap.sh exit cleanup code
-       _exit
-}
-
-xseq() {
-       i=$1
-       while [[ "$i" -le "$2" ]]; do
-               echo "$i"
-               i=$(( i + 1 ))
-       done
-}
-
-# Set TEST_TIME_BIN
-if [ -x "$URCU_TEST_TIME_BIN" ]; then
-       TEST_TIME_BIN="$URCU_TEST_TIME_BIN"
-elif [ -x "/usr/bin/time" ]; then
-       TEST_TIME_BIN="/usr/bin/time"
-else
-       TEST_TIME_BIN=""
-fi
-export TEST_TIME_BIN
-
-# Create a temporary file for tests output
-TMPFILE=$(mktemp)
-
-# Set traps to delete the temporary file on exit
-trap cleanup EXIT
index 48c4adb9457c08b921251222c99d13e7f3ce94bb..d71cc3f43877a57cc826551aebb494bff50efb76 100755 (executable)
@@ -1 +1,18 @@
-./runhash.sh 1
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"$URCU_TESTS_SRCDIR/benchmark/runhash.sh" 1
index 0c40ef8e429ff72081c5bb9c4c509c1c156a4920..49ad0e6a8755f592adc24f456187eacf1b0e3faf 100755 (executable)
@@ -1 +1,18 @@
-./runhash.sh 30
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"$URCU_TESTS_SRCDIR/benchmark/runhash.sh" 30
index 031aa77dfcc4c96fbe423fbe84d6383ff4a1431b..c63618b3705d88ca3b8b64ac9f78ced405241aba 100755 (executable)
@@ -1 +1,18 @@
-./runhash.sh 3
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"$URCU_TESTS_SRCDIR/benchmark/runhash.sh" 3
index 751514a7a6525069ea56a8c315e56431c9a3f980..13347ee1ce159843326564a3dcc6e04083a756de 100755 (executable)
@@ -1,6 +1,24 @@
-#!/bin/bash
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# Enable TAP
+SH_TAP=1
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
 
 
-#first parameter: seconds per test
+
+# First parameter: seconds per test
 DURATION=$1
 
 if [ "x${DURATION}" = "x" ]; then
 DURATION=$1
 
 if [ "x${DURATION}" = "x" ]; then
@@ -8,29 +26,23 @@ if [ "x${DURATION}" = "x" ]; then
        exit 1
 fi
 
        exit 1
 fi
 
-. ../utils/tap.sh
-. ./common.sh
-
-NUM_CPUS="1"
-for i in nproc gnproc; do
-       NUM_CPUS=$($i 2>/dev/null)
-       if [ "$?" -eq "0" ]; then
-               break
-       else
-               NUM_CPUS="1"
-       fi
-done
+# Create a temporary file for tests output
+TMPFILE=$(mktemp)
+
+# Set trap to delete the temporary file on exit and call tap.sh '_exit'
+trap 'rm -f "$TMPFILE"; _exit' EXIT
 
 
-#set to number of active CPUS
+# Set to number of active CPUS
+NUM_CPUS="$(urcu_nproc)"
 if [[ ${NUM_CPUS} -lt 4 ]]; then
        NUM_CPUS=4      # Floor at 4 due to following assumptions.
 fi
 
 # batch: 19 * 1 = 19
 if [[ ${NUM_CPUS} -lt 4 ]]; then
        NUM_CPUS=4      # Floor at 4 due to following assumptions.
 fi
 
 # batch: 19 * 1 = 19
-# fraction: 15 * 29 =
-# scalabilit NUM_CPUS * 15
-# reader 15 * 23 =
-NUM_TESTS=$(( 19 + 435 + ( NUM_CPUS * 15 ) + 345 ))
+# fraction: 12 * 29 =
+# scalabilit NUM_CPUS * 12
+# reader 12 * 23 =
+NUM_TESTS=$(( 19 + 348 + ( NUM_CPUS * 12 ) + 276 ))
 
 plan_tests     ${NUM_TESTS}
 
 
 plan_tests     ${NUM_TESTS}
 
@@ -56,6 +68,7 @@ diag "Executing URCU tests"
 #x: vary update fraction from 0 to 0.0001
   #fix number of readers and reader C.S. length, vary delay between updates
 #y: ops/s
 #x: vary update fraction from 0 to 0.0001
   #fix number of readers and reader C.S. length, vary delay between updates
 #y: ops/s
+EXTRA_OPTS=""
 
 
 diag "Executing batch RCU test"
 
 
 diag "Executing batch RCU test"
@@ -69,17 +82,17 @@ NR_READERS=$((NUM_CPUS - NR_WRITERS))
 
 for BATCH_SIZE in ${BATCH_ARRAY}; do
        for TEST in ${BATCH_TEST_ARRAY}; do
 
 for BATCH_SIZE in ${BATCH_ARRAY}; do
        for TEST in ${BATCH_TEST_ARRAY}; do
-               okx ${TEST_TIME_BIN} ./"${TEST}" "${NR_READERS}" "${NR_WRITERS}" "${DURATION}" \
+               okx ${URCU_TESTS_TIME_BIN} "${URCU_TESTS_BUILDDIR}/benchmark/${TEST}" "${NR_READERS}" "${NR_WRITERS}" "${DURATION}" \
                        -d 0 -b "${BATCH_SIZE}" ${EXTRA_OPTS} 2>"${TMPFILE}"
                        -d 0 -b "${BATCH_SIZE}" ${EXTRA_OPTS} 2>"${TMPFILE}"
-               while read line; do
+               while read -r line; do
                        echo "## $line"
                done <"${TMPFILE}"
        done
 done
 
                        echo "## $line"
                done <"${TMPFILE}"
        done
 done
 
-TEST_ARRAY="test_urcu_gc test_urcu_signal_gc test_urcu_mb_gc test_urcu_qsbr_gc
-            test_urcu_lgc test_urcu_signal_lgc test_urcu_mb_lgc test_urcu_qsbr_lgc
-            test_urcu test_urcu_signal test_urcu_mb test_urcu_qsbr
+TEST_ARRAY="test_urcu_gc test_urcu_mb_gc test_urcu_qsbr_gc
+            test_urcu_lgc test_urcu_mb_lgc test_urcu_qsbr_lgc
+            test_urcu test_urcu_mb test_urcu_qsbr
             test_rwlock test_perthreadlock test_mutex"
 
 #setting gc each 32768. ** UPDATE FOR YOUR ARCHITECTURE BASED ON TEST ABOVE **
             test_rwlock test_perthreadlock test_mutex"
 
 #setting gc each 32768. ** UPDATE FOR YOUR ARCHITECTURE BASED ON TEST ABOVE **
@@ -95,9 +108,9 @@ NR_READERS=$((NUM_CPUS - NR_WRITERS))
 
 for WDELAY in ${WDELAY_ARRAY}; do
        for TEST in ${TEST_ARRAY}; do
 
 for WDELAY in ${WDELAY_ARRAY}; do
        for TEST in ${TEST_ARRAY}; do
-               okx ${TEST_TIME_BIN} ./"${TEST}" "${NR_READERS}" "${NR_WRITERS}" "${DURATION}" \
+               okx ${URCU_TESTS_TIME_BIN} "${URCU_TESTS_BUILDDIR}/benchmark/${TEST}" "${NR_READERS}" "${NR_WRITERS}" "${DURATION}" \
                        -d "${WDELAY}" ${EXTRA_OPTS} 2>"${TMPFILE}"
                        -d "${WDELAY}" ${EXTRA_OPTS} 2>"${TMPFILE}"
-               while read line; do
+               while read -r line; do
                        echo "## $line"
                done <"${TMPFILE}"
        done
                        echo "## $line"
                done <"${TMPFILE}"
        done
@@ -112,11 +125,11 @@ diag "Executing scalability test"
 
 NR_WRITERS=0
 
 
 NR_WRITERS=0
 
-for NR_READERS in $(xseq 1 ${NUM_CPUS}); do
+for NR_READERS in $(urcu_xseq 1 ${NUM_CPUS}); do
        for TEST in ${TEST_ARRAY}; do
        for TEST in ${TEST_ARRAY}; do
-               okx ${TEST_TIME_BIN} ./"${TEST}" "${NR_READERS}" "${NR_WRITERS}" "${DURATION}" \
+               okx ${URCU_TESTS_TIME_BIN} "${URCU_TESTS_BUILDDIR}/benchmark/${TEST}" "${NR_READERS}" "${NR_WRITERS}" "${DURATION}" \
                        ${EXTRA_OPTS} 2>"${TMPFILE}"
                        ${EXTRA_OPTS} 2>"${TMPFILE}"
-               while read line; do
+               while read -r line; do
                        echo "## $line"
                done <"${TMPFILE}"
        done
                        echo "## $line"
                done <"${TMPFILE}"
        done
@@ -137,9 +150,9 @@ READERCSLEN_ARRAY="0 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 3276
 
 for READERCSLEN in ${READERCSLEN_ARRAY}; do
        for TEST in ${TEST_ARRAY}; do
 
 for READERCSLEN in ${READERCSLEN_ARRAY}; do
        for TEST in ${TEST_ARRAY}; do
-               okx ${TEST_TIME_BIN} ./"${TEST}" "${NR_READERS}" "${NR_WRITERS}" "${DURATION}" \
+               okx ${URCU_TESTS_TIME_BIN} "${URCU_TESTS_BUILDDIR}/benchmark/${TEST}" "${NR_READERS}" "${NR_WRITERS}" "${DURATION}" \
                        -c "${READERCSLEN}" ${EXTRA_OPTS} 2>"${TMPFILE}"
                        -c "${READERCSLEN}" ${EXTRA_OPTS} 2>"${TMPFILE}"
-               while read line; do
+               while read -r line; do
                        echo "## $line"
                done <"${TMPFILE}"
        done
                        echo "## $line"
                done <"${TMPFILE}"
        done
index 4f693d1c61bcd44570c31e39c9fc8b96fea0f878..c3f42ebe327bb231e9a7bf503afe4ac6117ecec9 100755 (executable)
@@ -1,4 +1,22 @@
-#!/bin/bash
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# Enable TAP
+SH_TAP=1
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
 
 # 1st parameter: seconds per test
 DURATION=$1
 
 # 1st parameter: seconds per test
 DURATION=$1
@@ -8,8 +26,6 @@ if [ "x${DURATION}" = "x" ]; then
        exit 1
 fi
 
        exit 1
 fi
 
-source ../utils/tap.sh
-
 NUM_TESTS=17
 
 plan_tests      ${NUM_TESTS}
 NUM_TESTS=17
 
 plan_tests      ${NUM_TESTS}
@@ -21,19 +37,10 @@ diag "Executing Hash table test"
 #   add/remove/random
 # - validate that "nr_leaked" is always 0 in SUMMARY for all tests
 
 #   add/remove/random
 # - validate that "nr_leaked" is always 0 in SUMMARY for all tests
 
-TESTPROG=./test_urcu_hash
-
-NUM_CPUS="1"
-for i in nproc gnproc; do
-       NUM_CPUS=$($i 2>/dev/null)
-       if [ "$?" -eq "0" ]; then
-               break
-       else
-               NUM_CPUS="1"
-       fi
-done
+TESTPROG="${URCU_TESTS_BUILDDIR}/benchmark/test_urcu_hash"
 
 #thread multiplier: number of processors divided by 4.
 
 #thread multiplier: number of processors divided by 4.
+NUM_CPUS="$(urcu_nproc)"
 if [[ ${NUM_CPUS} -lt 4 ]]; then
        NUM_CPUS=4      # Floor at 4 due to following assumptions.
 fi
 if [[ ${NUM_CPUS} -lt 4 ]]; then
        NUM_CPUS=4      # Floor at 4 due to following assumptions.
 fi
@@ -46,19 +53,19 @@ EXTRA_PARAMS=-v
 
 # rw test, single key, replace and del randomly, 4 threads, auto resize.
 # key range: init, lookup, and update: 0 to 0
 
 # rw test, single key, replace and del randomly, 4 threads, auto resize.
 # key range: init, lookup, and update: 0 to 0
-okx ${TESTPROG} 0 $((4*THREAD_MUL)) "${DURATION}" -A -s -M 1 -N 1 -O 1 ${EXTRA_PARAMS}
+okx "${TESTPROG}" 0 $((4*THREAD_MUL)) "${DURATION}" -A -s -M 1 -N 1 -O 1 ${EXTRA_PARAMS}
 
 # rw test, single key, add unique and del randomly, 4 threads, auto resize.
 # key range: init, lookup, and update: 0 to 0
 
 # rw test, single key, add unique and del randomly, 4 threads, auto resize.
 # key range: init, lookup, and update: 0 to 0
-okx ${TESTPROG} 0 $((4*THREAD_MUL)) "${DURATION}" -A -u -M 1 -N 1 -O 1 ${EXTRA_PARAMS}
+okx "${TESTPROG}" 0 $((4*THREAD_MUL)) "${DURATION}" -A -u -M 1 -N 1 -O 1 ${EXTRA_PARAMS}
 
 # rw test, single key, replace and del randomly, 2 lookup threads, 2 update threads, auto resize.
 # key range: init, lookup, and update: 0 to 0
 
 # rw test, single key, replace and del randomly, 2 lookup threads, 2 update threads, auto resize.
 # key range: init, lookup, and update: 0 to 0
-okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A -s -M 1 -N 1 -O 1 ${EXTRA_PARAMS}
+okx "${TESTPROG}" $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A -s -M 1 -N 1 -O 1 ${EXTRA_PARAMS}
 
 # rw test, single key, add and del randomly, 2 lookup threads, 2 update threads, auto resize.
 # key range: init, lookup, and update: 0 to 0
 
 # rw test, single key, add and del randomly, 2 lookup threads, 2 update threads, auto resize.
 # key range: init, lookup, and update: 0 to 0
-okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A -M 1 -N 1 -O 1 ${EXTRA_PARAMS}
+okx "${TESTPROG}" $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A -M 1 -N 1 -O 1 ${EXTRA_PARAMS}
 
 
 # ** test updates vs lookups with default table
 
 
 # ** test updates vs lookups with default table
@@ -66,17 +73,17 @@ okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A -M 1 -N 1 -
 # rw test, 2 lookup, 2 update threads, add and del randomly, auto resize.
 # max 1048576 buckets
 # key range: init, lookup, and update: 0 to 999999
 # rw test, 2 lookup, 2 update threads, add and del randomly, auto resize.
 # max 1048576 buckets
 # key range: init, lookup, and update: 0 to 999999
-okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A ${EXTRA_PARAMS}
+okx "${TESTPROG}" $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A ${EXTRA_PARAMS}
 
 # rw test, 2 lookup, 2 update threads, add_replace and del randomly, auto resize.
 # max 1048576 buckets
 # key range: init, lookup, and update: 0 to 999999
 
 # rw test, 2 lookup, 2 update threads, add_replace and del randomly, auto resize.
 # max 1048576 buckets
 # key range: init, lookup, and update: 0 to 999999
-okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A -s ${EXTRA_PARAMS}
+okx "${TESTPROG}" $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A -s ${EXTRA_PARAMS}
 
 # rw test, 2 lookup, 2 update threads, add_unique and del randomly, auto resize.
 # max 1048576 buckets
 # key range: init, lookup, and update: 0 to 999999
 
 # rw test, 2 lookup, 2 update threads, add_unique and del randomly, auto resize.
 # max 1048576 buckets
 # key range: init, lookup, and update: 0 to 999999
-okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A -u ${EXTRA_PARAMS}
+okx "${TESTPROG}" $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A -u ${EXTRA_PARAMS}
 
 
 # test memory management backends
 
 
 # test memory management backends
@@ -85,21 +92,21 @@ okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A -u ${EXTRA_
 # max buckets: 1048576
 # key range: init, lookup, and update: 0 to 99999999
 # mm backend: "order"
 # max buckets: 1048576
 # key range: init, lookup, and update: 0 to 99999999
 # mm backend: "order"
-okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A -m 1 -n 1048576 -i \
+okx "${TESTPROG}" $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A -m 1 -n 1048576 -i \
        -M 100000000 -N 100000000 -O 100000000 -B order ${EXTRA_PARAMS}
 
 # rw test, 2 lookup, 2 update threads, add only, auto resize.
 # max buckets: 1048576
 # key range: init, lookup, and update: 0 to 99999999
 # mm backend: "chunk"
        -M 100000000 -N 100000000 -O 100000000 -B order ${EXTRA_PARAMS}
 
 # rw test, 2 lookup, 2 update threads, add only, auto resize.
 # max buckets: 1048576
 # key range: init, lookup, and update: 0 to 99999999
 # mm backend: "chunk"
-okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A -m 1 -n 1048576 -i \
+okx "${TESTPROG}" $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A -m 1 -n 1048576 -i \
        -M 100000000 -N 100000000 -O 100000000 -B chunk ${EXTRA_PARAMS}
 
 # rw test, 2 lookup, 2 update threads, add only, auto resize.
 # max buckets: 1048576
 # key range: init, lookup, and update: 0 to 99999999
 # mm backend: "mmap"
        -M 100000000 -N 100000000 -O 100000000 -B chunk ${EXTRA_PARAMS}
 
 # rw test, 2 lookup, 2 update threads, add only, auto resize.
 # max buckets: 1048576
 # key range: init, lookup, and update: 0 to 99999999
 # mm backend: "mmap"
-okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A -m 1 -n 1048576 -i \
+okx "${TESTPROG}" $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A -m 1 -n 1048576 -i \
        -M 100000000 -N 100000000 -O 100000000 -B mmap ${EXTRA_PARAMS}
 
 
        -M 100000000 -N 100000000 -O 100000000 -B mmap ${EXTRA_PARAMS}
 
 
@@ -111,7 +118,7 @@ okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A -m 1 -n 104
 # key range: lookup: 1000000 to 1999999
 # NOTE: reader threads in this test should never have a successful
 # lookup. TODO
 # key range: lookup: 1000000 to 1999999
 # NOTE: reader threads in this test should never have a successful
 # lookup. TODO
-okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A \
+okx "${TESTPROG}" $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A \
        -R 1000000 ${EXTRA_PARAMS}
 
 # ** small key range
        -R 1000000 ${EXTRA_PARAMS}
 
 # ** small key range
@@ -119,19 +126,19 @@ okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A \
 # rw test, 2 lookup, 2 update threads, add and del randomly, auto resize.
 # max 1048576 buckets
 # key range: init, update, and lookups: 0 to 9
 # rw test, 2 lookup, 2 update threads, add and del randomly, auto resize.
 # max 1048576 buckets
 # key range: init, update, and lookups: 0 to 9
-okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A \
+okx "${TESTPROG}" $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A \
        -M 10 -N 10 -O 10 ${EXTRA_PARAMS}
 
 # rw test, 2 lookup, 2 update threads, add_unique and del randomly, auto resize.
 # max 1048576 buckets
 # key range: init, update, and lookups: 0 to 9
        -M 10 -N 10 -O 10 ${EXTRA_PARAMS}
 
 # rw test, 2 lookup, 2 update threads, add_unique and del randomly, auto resize.
 # max 1048576 buckets
 # key range: init, update, and lookups: 0 to 9
-okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A \
+okx "${TESTPROG}" $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A \
        -M 10 -N 10 -O 10 -u ${EXTRA_PARAMS}
 
 # rw test, 2 lookup, 2 update threads, add_replace and del randomly, auto resize.
 # max 1048576 buckets
 # key range: init, update, and lookups: 0 to 9
        -M 10 -N 10 -O 10 -u ${EXTRA_PARAMS}
 
 # rw test, 2 lookup, 2 update threads, add_replace and del randomly, auto resize.
 # max 1048576 buckets
 # key range: init, update, and lookups: 0 to 9
-okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A \
+okx "${TESTPROG}" $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A \
        -M 10 -N 10 -O 10 -s ${EXTRA_PARAMS}
 
 # ** lookup for known keys
        -M 10 -N 10 -O 10 -s ${EXTRA_PARAMS}
 
 # ** lookup for known keys
@@ -143,7 +150,7 @@ okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A \
 # key range: updates: 10 to 19
 # NOTE: reader threads in this test should always have successful
 # lookups. TODO
 # key range: updates: 10 to 19
 # NOTE: reader threads in this test should always have successful
 # lookups. TODO
-okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A \
+okx "${TESTPROG}" $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A \
        -M 10 -N 10 -O 10 -R 0 -T 0 -S 10 -k 10 -s ${EXTRA_PARAMS}
 
 # ** Uniqueness test
        -M 10 -N 10 -O 10 -R 0 -T 0 -S 10 -k 10 -s ${EXTRA_PARAMS}
 
 # ** Uniqueness test
@@ -152,12 +159,12 @@ okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A \
 # max 1048576 buckets
 # asserts that no duplicates are observed by reader threads
 # standard length hash chains
 # max 1048576 buckets
 # asserts that no duplicates are observed by reader threads
 # standard length hash chains
-okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A \
+okx "${TESTPROG}" $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A \
        -U ${EXTRA_PARAMS}
 
 # rw test, 2 lookup, 2 update threads, add_unique, add_replace and del randomly, auto resize.
 # max 1048576 buckets
 # asserts that no duplicates are observed by reader threads
 # create long hash chains: using modulo 4 on keys as hash
        -U ${EXTRA_PARAMS}
 
 # rw test, 2 lookup, 2 update threads, add_unique, add_replace and del randomly, auto resize.
 # max 1048576 buckets
 # asserts that no duplicates are observed by reader threads
 # create long hash chains: using modulo 4 on keys as hash
-okx ${TESTPROG} $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A \
+okx "${TESTPROG}" $((2*THREAD_MUL)) $((2*THREAD_MUL)) "${DURATION}" -A \
        -U -C 4 ${EXTRA_PARAMS}
        -U -C 4 ${EXTRA_PARAMS}
index d2c8649132a056977e62f0bf6b1fb59836e80069..4ebea56ec52542ff65fcb918fe1b7a29c2ea9a08 100755 (executable)
@@ -1,5 +1,9 @@
 #!/bin/sh
 
 #!/bin/sh
 
+# SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
 #run all tests
 
 #set to number of active CPUS
 #run all tests
 
 #set to number of active CPUS
index bba9e3e06e66c9e926db673617342905fb1d54e7..74fbd5b3f524592f3e31325837b57abc427f30a9 100755 (executable)
@@ -1,5 +1,9 @@
 #!/bin/sh
 
 #!/bin/sh
 
+# SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
 #run all tests
 
 #set to number of active CPUS
 #run all tests
 
 #set to number of active CPUS
index 7c5f055c15349cce93340ccd547601a182bd8c81..4618c3c53642fcd5d0f8c650f21b68fe837d17c8 100755 (executable)
@@ -1,5 +1,9 @@
 #!/bin/sh
 
 #!/bin/sh
 
+# SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
 #run all tests
 
 #set to number of active CPUS
 #run all tests
 
 #set to number of active CPUS
index ede402c7d981b797181cefca885717cf035068e9..4edddc469152b39a26e4723bfe1d527221f162f9 100755 (executable)
@@ -1,5 +1,9 @@
 #!/bin/sh
 
 #!/bin/sh
 
+# SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
 #run all tests
 
 #set to number of active CPUS
 #run all tests
 
 #set to number of active CPUS
index bb4bfe7b35922b47652e987d6a6be008549c2d93..5d462ec543068e57ff42f676001f9579c1fd203a 100755 (executable)
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
 # test run after write-size update
 
 sh runpaul-phase1.sh
 # test run after write-size update
 
 sh runpaul-phase1.sh
index 5f650725eb685389b02808c8f42c7b3ed1eca84c..647749b3db8a66cd8eee406bccb8adbe29eb5cf2 100755 (executable)
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
 sh runpaul-phase1.sh
 mkdir runpaul-phase1
 mv *.log runpaul-phase1/
 sh runpaul-phase1.sh
 mkdir runpaul-phase1
 mv *.log runpaul-phase1/
index 4c301dac9f96fccdda0087abb4dc630430a497e6..83afd50bc9b25c55eecab728b77d43988254c2f9 100755 (executable)
@@ -1,5 +1,9 @@
 #!/bin/sh
 
 #!/bin/sh
 
+# SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
 #run all tests
 
 #set to number of active CPUS
 #run all tests
 
 #set to number of active CPUS
index f030de6e6e75617314761ca3e8a0628b72861310..93af6d4596d055422ceed26f6b96aefa7e093c5e 100755 (executable)
@@ -1,7 +1,29 @@
-#!/bin/bash
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# Enable TAP
+SH_TAP=1
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+# Create a temporary file for tests output
+TMPFILE=$(mktemp)
+
+# Set trap to delete the temporary file on exit and call tap.sh '_exit'
+trap 'rm -f "$TMPFILE"; _exit' EXIT
 
 
-. ../utils/tap.sh
-. ./common.sh
 
 NUM_TESTS=1
 
 
 NUM_TESTS=1
 
@@ -9,6 +31,6 @@ plan_tests     ${NUM_TESTS}
 
 #for a in test_urcu_gc test_urcu_gc_mb test_urcu_qsbr_gc; do
 for a in test_urcu_gc; do
 
 #for a in test_urcu_gc test_urcu_gc_mb test_urcu_qsbr_gc; do
 for a in test_urcu_gc; do
-       okx "${TEST_TIME_BIN}" ./"${a}" "$@" 2>"${TMPFILE}"
+       okx "${URCU_TESTS_TIME_BIN}" "${URCU_TESTS_BUILDDIR}/benchmark/${a}" "$@" 2>"${TMPFILE}"
        diag "time: $(cat "${TMPFILE}")"
 done
        diag "time: $(cat "${TMPFILE}")"
 done
index dd5d6624bae6c470d68f5895dc9b26b20a918e80..761a5476b5c0f2f6db614624b94e9f585c04a7df 100755 (executable)
@@ -1,16 +1,38 @@
-#!/bin/bash
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
 
 
-. ../utils/tap.sh
-. ./common.sh
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
 
 
-NUM_TESTS=15
+# Enable TAP
+SH_TAP=1
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+# Create a temporary file for tests output
+TMPFILE=$(mktemp)
+
+# Set trap to delete the temporary file on exit and call tap.sh '_exit'
+trap 'rm -f "$TMPFILE"; _exit' EXIT
+
+
+NUM_TESTS=12
 
 plan_tests     ${NUM_TESTS}
 
 
 plan_tests     ${NUM_TESTS}
 
-for a in test_urcu_gc test_urcu_signal_gc test_urcu_mb_gc test_urcu_qsbr_gc \
-       test_urcu_lgc test_urcu_signal_lgc test_urcu_mb_lgc test_urcu_qsbr_lgc \
-       test_urcu test_urcu_signal test_urcu_mb test_urcu_qsbr \
+for a in test_urcu_gc test_urcu_mb_gc test_urcu_qsbr_gc \
+       test_urcu_lgc test_urcu_mb_lgc test_urcu_qsbr_lgc \
+       test_urcu test_urcu_mb test_urcu_qsbr \
        test_rwlock test_perthreadlock test_mutex; do
        test_rwlock test_perthreadlock test_mutex; do
-       okx ${TEST_TIME_BIN} ./"${a}" "$@" 2>"${TMPFILE}"
+       okx ${URCU_TESTS_TIME_BIN} "$URCU_TESTS_BUILDDIR/benchmark/${a}" "$@" 2>"${TMPFILE}"
        diag "time: $(cat "${TMPFILE}")"
 done
        diag "time: $(cat "${TMPFILE}")"
 done
index d0d7587d66a04a28fc2b4956b161ecfc10270b77..95f39e1542f5a5312bb83ef1f582e63c7e713464 100755 (executable)
@@ -1,5 +1,9 @@
 #!/bin/sh
 
 #!/bin/sh
 
+# SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
 #run all tests
 
 #set to number of active CPUS
 #run all tests
 
 #set to number of active CPUS
index ca66ffaf7b44f7c4ef5cf6a3efdb7a4331596fcb..7fec92cb8af50279addde6897944337cf997912b 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_cycles_per_loop.c
- *
  * Userspace RCU library - test cycles per loop
  * Userspace RCU library - test cycles per loop
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <urcu/arch.h>
  */
 
 #include <urcu/arch.h>
index 76430a323e46a7b4dac5cc4162dad9c8e50fe7d7..b743828979f138dfee737639021c6a464f5b5401 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_looplen.c
- *
  * Userspace RCU library - test program
  * Userspace RCU library - test program
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <sched.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <sched.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 
 #ifndef DYNAMIC_LINK_TEST
 #define _LGPL_SOURCE
 
 #ifndef DYNAMIC_LINK_TEST
 #define _LGPL_SOURCE
@@ -50,7 +36,7 @@ static inline void loop_sleep(unsigned long loops)
 #define LOOPS 1048576
 #define TESTS 10
 
 #define LOOPS 1048576
 #define TESTS 10
 
-int main(int argc, char **argv)
+int main(void)
 {
        unsigned long i;
        caa_cycles_t time1, time2;
 {
        unsigned long i;
        caa_cycles_t time1, time2;
index 19eb7c4f929b8cb84d5cea95040f4669a7bcd81f..6254e15c4cf0dee0bbf50f826eb8d0e1b91d295f 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu.c
- *
  * Userspace RCU library - test program
  * Userspace RCU library - test program
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 #include <urcu/tls-compat.h>
 #include <urcu/tls-compat.h>
-#include "cpuset.h"
 #include "thread-id.h"
 
 /* hardcoded number of CPUs */
 #include "thread-id.h"
 
 /* hardcoded number of CPUs */
@@ -50,8 +35,6 @@ struct test_array {
 
 static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
 
 
 static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
 
-static volatile int test_go, test_stop;
-
 static unsigned long wdelay;
 
 static volatile struct test_array test_array = { 8 };
 static unsigned long wdelay;
 
 static volatile struct test_array test_array = { 8 };
@@ -86,7 +69,7 @@ pthread_mutex_t affinity_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static void set_affinity(void)
 {
 
 static void set_affinity(void)
 {
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
@@ -94,7 +77,7 @@ static void set_affinity(void)
        if (!use_affinity)
                return;
 
        if (!use_affinity)
                return;
 
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
@@ -108,27 +91,10 @@ static void set_affinity(void)
        }
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
        }
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       sched_setaffinity(0, &mask);
-#else
        sched_setaffinity(0, sizeof(mask), &mask);
        sched_setaffinity(0, sizeof(mask), &mask);
-#endif
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
-/*
- * returns 0 if test should end.
- */
-static int test_duration_write(void)
-{
-       return !test_stop;
-}
-
-static int test_duration_read(void)
-{
-       return !test_stop;
-}
-
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
@@ -142,27 +108,7 @@ static unsigned int nr_writers;
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
-void rcu_copy_mutex_lock(void)
-{
-       int ret;
-       ret = pthread_mutex_lock(&rcu_copy_mutex);
-       if (ret) {
-               perror("Error in pthread mutex lock");
-               exit(-1);
-       }
-}
-
-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);
-       }
-}
-
+static
 void *thr_reader(void *data)
 {
        unsigned long tidx = (unsigned long)data;
 void *thr_reader(void *data)
 {
        unsigned long tidx = (unsigned long)data;
@@ -172,16 +118,14 @@ void *thr_reader(void *data)
 
        set_affinity();
 
 
        set_affinity();
 
-       while (!test_go)
-       {
-       }
+       wait_until_go();
 
        for (;;) {
                int v;
 
                pthread_mutex_lock(&lock);
                v = test_array.a;
 
        for (;;) {
                int v;
 
                pthread_mutex_lock(&lock);
                v = test_array.a;
-               assert(v == 8);
+               urcu_posix_assert(v == 8);
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
                pthread_mutex_unlock(&lock);
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
                pthread_mutex_unlock(&lock);
@@ -197,6 +141,7 @@ void *thr_reader(void *data)
 
 }
 
 
 }
 
+static
 void *thr_writer(void *data)
 {
        unsigned long wtidx = (unsigned long)data;
 void *thr_writer(void *data)
 {
        unsigned long wtidx = (unsigned long)data;
@@ -206,10 +151,7 @@ void *thr_writer(void *data)
 
        set_affinity();
 
 
        set_affinity();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                pthread_mutex_lock(&lock);
 
        for (;;) {
                pthread_mutex_lock(&lock);
@@ -231,7 +173,8 @@ void *thr_writer(void *data)
        return ((void*)2);
 }
 
        return ((void*)2);
 }
 
-void show_usage(int argc, char **argv)
+static
+void show_usage(char **argv)
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
@@ -255,26 +198,26 @@ int main(int argc, char **argv)
        unsigned int i_thr;
 
        if (argc < 4) {
        unsigned int i_thr;
 
        if (argc < 4) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
        cmm_smp_mb();
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
                return -1;
        }
        cmm_smp_mb();
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
                return -1;
        }
 
@@ -284,7 +227,7 @@ int main(int argc, char **argv)
                switch (argv[i][1]) {
                case 'a':
                        if (argc < i + 2) {
                switch (argv[i][1]) {
                case 'a':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        a = atoi(argv[++i]);
                                return -1;
                        }
                        a = atoi(argv[++i]);
@@ -294,21 +237,21 @@ int main(int argc, char **argv)
                        break;
                case 'c':
                        if (argc < i + 2) {
                        break;
                case 'c':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
@@ -348,13 +291,7 @@ int main(int argc, char **argv)
                        exit(1);
        }
 
                        exit(1);
        }
 
-       cmm_smp_mb();
-
-       test_go = 1;
-
-       sleep(duration);
-
-       test_stop = 1;
+       test_for(duration);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
index f02e00b43e8db6144911dd4512a3f49875c9ac41..2cc50d1d13b296400bfea0b0afa2572e75c399dc 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu.c
- *
  * Userspace RCU library - test program
  * Userspace RCU library - test program
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 #include <urcu/tls-compat.h>
 #include <urcu/tls-compat.h>
-#include "cpuset.h"
 #include "thread-id.h"
 
 /* hardcoded number of CPUs */
 #include "thread-id.h"
 
 /* hardcoded number of CPUs */
@@ -54,8 +39,6 @@ struct per_thread_lock {
 
 static struct per_thread_lock *per_thread_lock;
 
 
 static struct per_thread_lock *per_thread_lock;
 
-static volatile int test_go, test_stop;
-
 static unsigned long wdelay;
 
 static volatile struct test_array test_array = { 8 };
 static unsigned long wdelay;
 
 static volatile struct test_array test_array = { 8 };
@@ -90,7 +73,7 @@ pthread_mutex_t affinity_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static void set_affinity(void)
 {
 
 static void set_affinity(void)
 {
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
@@ -98,7 +81,7 @@ static void set_affinity(void)
        if (!use_affinity)
                return;
 
        if (!use_affinity)
                return;
 
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                errno = ret;
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                errno = ret;
@@ -114,27 +97,10 @@ static void set_affinity(void)
        }
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
        }
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       sched_setaffinity(0, &mask);
-#else
        sched_setaffinity(0, sizeof(mask), &mask);
        sched_setaffinity(0, sizeof(mask), &mask);
-#endif
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
-/*
- * returns 0 if test should end.
- */
-static int test_duration_write(void)
-{
-       return !test_stop;
-}
-
-static int test_duration_read(void)
-{
-       return !test_stop;
-}
-
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
@@ -170,6 +136,7 @@ static void urcu_mutex_unlock(pthread_mutex_t *lock)
        }
 }
 
        }
 }
 
+static
 void *thr_reader(void *data)
 {
        unsigned long tidx = (unsigned long)data;
 void *thr_reader(void *data)
 {
        unsigned long tidx = (unsigned long)data;
@@ -179,16 +146,14 @@ void *thr_reader(void *data)
 
        set_affinity();
 
 
        set_affinity();
 
-       while (!test_go)
-       {
-       }
+       wait_until_go();
 
        for (;;) {
                int v;
 
                urcu_mutex_lock(&per_thread_lock[tidx].lock);
                v = test_array.a;
 
        for (;;) {
                int v;
 
                urcu_mutex_lock(&per_thread_lock[tidx].lock);
                v = test_array.a;
-               assert(v == 8);
+               urcu_posix_assert(v == 8);
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
                urcu_mutex_unlock(&per_thread_lock[tidx].lock);
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
                urcu_mutex_unlock(&per_thread_lock[tidx].lock);
@@ -204,6 +169,7 @@ void *thr_reader(void *data)
 
 }
 
 
 }
 
+static
 void *thr_writer(void *data)
 {
        unsigned long wtidx = (unsigned long)data;
 void *thr_writer(void *data)
 {
        unsigned long wtidx = (unsigned long)data;
@@ -214,10 +180,7 @@ void *thr_writer(void *data)
 
        set_affinity();
 
 
        set_affinity();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                for (tidx = 0; tidx < (long)nr_readers; tidx++) {
 
        for (;;) {
                for (tidx = 0; tidx < (long)nr_readers; tidx++) {
@@ -243,7 +206,8 @@ void *thr_writer(void *data)
        return ((void*)2);
 }
 
        return ((void*)2);
 }
 
-void show_usage(int argc, char **argv)
+static
+void show_usage(char **argv)
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
@@ -266,26 +230,26 @@ int main(int argc, char **argv)
        unsigned int i_thr;
 
        if (argc < 4) {
        unsigned int i_thr;
 
        if (argc < 4) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
        cmm_smp_mb();
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
                return -1;
        }
        cmm_smp_mb();
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
                return -1;
        }
 
@@ -295,7 +259,7 @@ int main(int argc, char **argv)
                switch (argv[i][1]) {
                case 'a':
                        if (argc < i + 2) {
                switch (argv[i][1]) {
                case 'a':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        a = atoi(argv[++i]);
                                return -1;
                        }
                        a = atoi(argv[++i]);
@@ -305,21 +269,21 @@ int main(int argc, char **argv)
                        break;
                case 'c':
                        if (argc < i + 2) {
                        break;
                case 'c':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
@@ -361,13 +325,7 @@ int main(int argc, char **argv)
                        exit(1);
        }
 
                        exit(1);
        }
 
-       cmm_smp_mb();
-
-       test_go = 1;
-
-       sleep(duration);
-
-       test_stop = 1;
+       test_for(duration);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
index ca2953d0d43fdd705f42db6b766f5226d4f39a09..78222750302dd6e46a4d5fd1a60dbe36fd05f2c6 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_perthreadloc_timing.c
- *
  * Per thread locks - test program
  * Per thread locks - test program
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <pthread.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <pthread.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 
 #include "thread-id.h"
 
 
 #include "thread-id.h"
 
@@ -67,6 +53,7 @@ static int num_write;
 static caa_cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *reader_time;
 static caa_cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *writer_time;
 
 static caa_cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *reader_time;
 static caa_cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *writer_time;
 
+static
 void *thr_reader(void *arg)
 {
        caa_cycles_t time1, time2;
 void *thr_reader(void *arg)
 {
        caa_cycles_t time1, time2;
@@ -86,7 +73,7 @@ void *thr_reader(void *arg)
                                perror("Error in pthread mutex lock");
                                exit(-1);
                        }
                                perror("Error in pthread mutex lock");
                                exit(-1);
                        }
-                       assert(test_array.a == 8);
+                       urcu_posix_assert(test_array.a == 8);
                        ret = pthread_mutex_unlock(&per_thread_lock[tidx].lock);
                        if (ret) {
                                perror("Error in pthread mutex unlock");
                        ret = pthread_mutex_unlock(&per_thread_lock[tidx].lock);
                        if (ret) {
                                perror("Error in pthread mutex unlock");
@@ -105,6 +92,7 @@ void *thr_reader(void *arg)
 
 }
 
 
 }
 
+static
 void *thr_writer(void *arg)
 {
        caa_cycles_t time1, time2;
 void *thr_writer(void *arg)
 {
        caa_cycles_t time1, time2;
index 4628080e3ba30846ad65a11fcbbec6c0329dfca4..b275f78a51deb4f67afe134b63d1c0cff9b2545e 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu.c
- *
  * Userspace RCU library - test program
  * Userspace RCU library - test program
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 #include <urcu/tls-compat.h>
 #include <urcu/tls-compat.h>
-#include "cpuset.h"
 #include "thread-id.h"
 
 /* hardcoded number of CPUs */
 #include "thread-id.h"
 
 /* hardcoded number of CPUs */
@@ -54,8 +39,6 @@ struct test_array {
  */
 pthread_rwlock_t lock;
 
  */
 pthread_rwlock_t lock;
 
-static volatile int test_go, test_stop;
-
 static unsigned long wdelay;
 
 static volatile struct test_array test_array = { 8 };
 static unsigned long wdelay;
 
 static volatile struct test_array test_array = { 8 };
@@ -90,7 +73,7 @@ pthread_mutex_t affinity_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static void set_affinity(void)
 {
 
 static void set_affinity(void)
 {
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
@@ -98,7 +81,7 @@ static void set_affinity(void)
        if (!use_affinity)
                return;
 
        if (!use_affinity)
                return;
 
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
@@ -113,27 +96,10 @@ static void set_affinity(void)
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       sched_setaffinity(0, &mask);
-#else
        sched_setaffinity(0, sizeof(mask), &mask);
        sched_setaffinity(0, sizeof(mask), &mask);
-#endif
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
-/*
- * returns 0 if test should end.
- */
-static int test_duration_write(void)
-{
-       return !test_stop;
-}
-
-static int test_duration_read(void)
-{
-       return !test_stop;
-}
-
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
@@ -142,27 +108,7 @@ static unsigned int nr_writers;
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
-void rcu_copy_mutex_lock(void)
-{
-       int ret;
-       ret = pthread_mutex_lock(&rcu_copy_mutex);
-       if (ret) {
-               perror("Error in pthread mutex lock");
-               exit(-1);
-       }
-}
-
-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);
-       }
-}
-
+static
 void *thr_reader(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_reader(void *_count)
 {
        unsigned long long *count = _count;
@@ -172,9 +118,7 @@ void *thr_reader(void *_count)
 
        set_affinity();
 
 
        set_affinity();
 
-       while (!test_go)
-       {
-       }
+       wait_until_go();
 
        for (;;) {
                int a, ret;
 
        for (;;) {
                int a, ret;
@@ -186,7 +130,7 @@ void *thr_reader(void *_count)
                }
 
                a = test_array.a;
                }
 
                a = test_array.a;
-               assert(a == 8);
+               urcu_posix_assert(a == 8);
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
 
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
 
@@ -209,6 +153,7 @@ void *thr_reader(void *_count)
 
 }
 
 
 }
 
+static
 void *thr_writer(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_writer(void *_count)
 {
        unsigned long long *count = _count;
@@ -218,10 +163,7 @@ void *thr_writer(void *_count)
 
        set_affinity();
 
 
        set_affinity();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                int ret;
 
        for (;;) {
                int ret;
@@ -256,7 +198,8 @@ void *thr_writer(void *_count)
        return ((void*)2);
 }
 
        return ((void*)2);
 }
 
-void show_usage(int argc, char **argv)
+static
+void show_usage(char **argv)
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
@@ -280,26 +223,26 @@ int main(int argc, char **argv)
        unsigned int i_thr;
 
        if (argc < 4) {
        unsigned int i_thr;
 
        if (argc < 4) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
        cmm_smp_mb();
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
                return -1;
        }
        cmm_smp_mb();
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
        
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
                return -1;
        }
        
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
                return -1;
        }
 
@@ -309,7 +252,7 @@ int main(int argc, char **argv)
                switch (argv[i][1]) {
                case 'a':
                        if (argc < i + 2) {
                switch (argv[i][1]) {
                case 'a':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        a = atoi(argv[++i]);
                                return -1;
                        }
                        a = atoi(argv[++i]);
@@ -319,21 +262,21 @@ int main(int argc, char **argv)
                        break;
                case 'c':
                        if (argc < i + 2) {
                        break;
                case 'c':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
@@ -378,13 +321,7 @@ int main(int argc, char **argv)
                        exit(1);
        }
 
                        exit(1);
        }
 
-       cmm_smp_mb();
-
-       test_go = 1;
-
-       sleep(duration);
-
-       test_stop = 1;
+       test_for(duration);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
index 0cc5253b7085c3426704ad9d5a2656d46bc51c9c..2bae56ca275b676bfff217a7ec226f093ca42bee 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu.c
- *
  * Userspace RCU library - test program
  * Userspace RCU library - test program
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <pthread.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <pthread.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 
 #include "thread-id.h"
 
 
 #include "thread-id.h"
 
@@ -67,6 +53,7 @@ static int num_write;
 static caa_cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *reader_time;
 static caa_cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *writer_time;
 
 static caa_cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *reader_time;
 static caa_cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *writer_time;
 
+static
 void *thr_reader(void *arg)
 {
        unsigned int i, j;
 void *thr_reader(void *arg)
 {
        unsigned int i, j;
@@ -86,7 +73,7 @@ void *thr_reader(void *arg)
                                abort();
                        }
 
                                abort();
                        }
 
-                       assert(test_array.a == 8);
+                       urcu_posix_assert(test_array.a == 8);
 
                        ret = pthread_rwlock_unlock(&lock);
                        if (ret) {
 
                        ret = pthread_rwlock_unlock(&lock);
                        if (ret) {
@@ -106,6 +93,7 @@ void *thr_reader(void *arg)
 
 }
 
 
 }
 
+static
 void *thr_writer(void *arg)
 {
        unsigned int i, j;
 void *thr_writer(void *arg)
 {
        unsigned int i, j;
index 24758a763d022b6c9eb9cbdfe48767d718ef0347..053993ae940349c7f0ae8a559bdf1f7180fd167a 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu.c
- *
  * Userspace RCU library - test program
  * Userspace RCU library - test program
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 
 #include <errno.h>
 
+#include <urcu/assert.h>
 #include <urcu/arch.h>
 #include <urcu/tls-compat.h>
 #include <urcu/arch.h>
 #include <urcu/tls-compat.h>
-#include "cpuset.h"
 #include "thread-id.h"
 #include <../common/debug-yield.h>
 
 #include "thread-id.h"
 #include <../common/debug-yield.h>
 
@@ -45,8 +30,6 @@
 #endif
 #include <urcu.h>
 
 #endif
 #include <urcu.h>
 
-static volatile int test_go, test_stop;
-
 static unsigned long wdelay;
 
 static int *test_rcu_pointer;
 static unsigned long wdelay;
 
 static int *test_rcu_pointer;
@@ -81,7 +64,7 @@ pthread_mutex_t affinity_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static void set_affinity(void)
 {
 
 static void set_affinity(void)
 {
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
@@ -89,7 +72,7 @@ static void set_affinity(void)
        if (!use_affinity)
                return;
 
        if (!use_affinity)
                return;
 
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
@@ -104,27 +87,10 @@ static void set_affinity(void)
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       sched_setaffinity(0, &mask);
-#else
        sched_setaffinity(0, sizeof(mask), &mask);
        sched_setaffinity(0, sizeof(mask), &mask);
-#endif
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
-/*
- * returns 0 if test should end.
- */
-static int test_duration_write(void)
-{
-       return !test_stop;
-}
-
-static int test_duration_read(void)
-{
-       return !test_stop;
-}
-
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
@@ -133,27 +99,7 @@ static unsigned int nr_writers;
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
-void rcu_copy_mutex_lock(void)
-{
-       int ret;
-       ret = pthread_mutex_lock(&rcu_copy_mutex);
-       if (ret) {
-               perror("Error in pthread mutex lock");
-               exit(-1);
-       }
-}
-
-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);
-       }
-}
-
+static
 void *thr_reader(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_reader(void *_count)
 {
        unsigned long long *count = _count;
@@ -165,20 +111,17 @@ void *thr_reader(void *_count)
        set_affinity();
 
        rcu_register_thread();
        set_affinity();
 
        rcu_register_thread();
-       assert(!rcu_read_ongoing());
+       urcu_posix_assert(!rcu_read_ongoing());
 
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                rcu_read_lock();
 
        for (;;) {
                rcu_read_lock();
-               assert(rcu_read_ongoing());
+               urcu_posix_assert(rcu_read_ongoing());
                local_ptr = rcu_dereference(test_rcu_pointer);
                rcu_debug_yield_read();
                if (local_ptr)
                local_ptr = rcu_dereference(test_rcu_pointer);
                rcu_debug_yield_read();
                if (local_ptr)
-                       assert(*local_ptr == 8);
+                       urcu_posix_assert(*local_ptr == 8);
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
                rcu_read_unlock();
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
                rcu_read_unlock();
@@ -200,6 +143,7 @@ void *thr_reader(void *_count)
 
 }
 
 
 }
 
+static
 void *thr_writer(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_writer(void *_count)
 {
        unsigned long long *count = _count;
@@ -210,14 +154,11 @@ void *thr_writer(void *_count)
 
        set_affinity();
 
 
        set_affinity();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                new = malloc(sizeof(int));
 
        for (;;) {
                new = malloc(sizeof(int));
-               assert(new);
+               urcu_posix_assert(new);
                *new = 8;
                old = rcu_xchg_pointer(&test_rcu_pointer, new);
                if (caa_unlikely(wduration))
                *new = 8;
                old = rcu_xchg_pointer(&test_rcu_pointer, new);
                if (caa_unlikely(wduration))
@@ -239,7 +180,8 @@ void *thr_writer(void *_count)
        return ((void*)2);
 }
 
        return ((void*)2);
 }
 
-void show_usage(int argc, char **argv)
+static
+void show_usage(char **argv)
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
@@ -264,25 +206,25 @@ int main(int argc, char **argv)
        unsigned int i_thr;
 
        if (argc < 4) {
        unsigned int i_thr;
 
        if (argc < 4) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
                return -1;
        }
 
@@ -298,7 +240,7 @@ int main(int argc, char **argv)
                        break;
                case 'a':
                        if (argc < i + 2) {
                        break;
                case 'a':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        a = atoi(argv[++i]);
                                return -1;
                        }
                        a = atoi(argv[++i]);
@@ -308,21 +250,21 @@ int main(int argc, char **argv)
                        break;
                case 'c':
                        if (argc < i + 2) {
                        break;
                case 'c':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
@@ -360,13 +302,7 @@ int main(int argc, char **argv)
                        exit(1);
        }
 
                        exit(1);
        }
 
-       cmm_smp_mb();
-
-       test_go = 1;
-
-       sleep(duration);
-
-       test_stop = 1;
+       test_for(duration);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
index eaa04b32e416e2ee20ad276d029e0544bf1ef31f..d0272a7b2bf07939af4dce3643b31d736446b95c 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_assign.c
- *
  * Userspace RCU library - test program
  * Userspace RCU library - test program
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 #include <urcu/tls-compat.h>
 #include <urcu/tls-compat.h>
-#include "cpuset.h"
 #include "thread-id.h"
 #include "../common/debug-yield.h"
 
 #include "thread-id.h"
 #include "../common/debug-yield.h"
 
@@ -49,8 +34,6 @@ struct test_array {
        int a;
 };
 
        int a;
 };
 
-static volatile int test_go, test_stop;
-
 static unsigned long wdelay;
 
 static struct test_array *test_rcu_pointer;
 static unsigned long wdelay;
 
 static struct test_array *test_rcu_pointer;
@@ -85,7 +68,7 @@ pthread_mutex_t affinity_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static void set_affinity(void)
 {
 
 static void set_affinity(void)
 {
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
@@ -93,7 +76,7 @@ static void set_affinity(void)
        if (!use_affinity)
                return;
 
        if (!use_affinity)
                return;
 
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
@@ -108,27 +91,10 @@ static void set_affinity(void)
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       sched_setaffinity(0, &mask);
-#else
        sched_setaffinity(0, sizeof(mask), &mask);
        sched_setaffinity(0, sizeof(mask), &mask);
-#endif
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
-/*
- * returns 0 if test should end.
- */
-static int test_duration_write(void)
-{
-       return !test_stop;
-}
-
-static int test_duration_read(void)
-{
-       return !test_stop;
-}
-
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
@@ -137,6 +103,7 @@ static unsigned int nr_writers;
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
+static
 void rcu_copy_mutex_lock(void)
 {
        int ret;
 void rcu_copy_mutex_lock(void)
 {
        int ret;
@@ -147,6 +114,7 @@ void rcu_copy_mutex_lock(void)
        }
 }
 
        }
 }
 
+static
 void rcu_copy_mutex_unlock(void)
 {
        int ret;
 void rcu_copy_mutex_unlock(void)
 {
        int ret;
@@ -175,7 +143,7 @@ static struct test_array *test_array_alloc(void)
        int index;
 
        index = array_index % ARRAY_SIZE;
        int index;
 
        index = array_index % ARRAY_SIZE;
-       assert(test_array[index].a == ARRAY_POISON ||
+       urcu_posix_assert(test_array[index].a == ARRAY_POISON ||
                test_array[index].a == 0);
        ret = &test_array[index];
        array_index++;
                test_array[index].a == 0);
        ret = &test_array[index];
        array_index++;
@@ -191,6 +159,7 @@ static void test_array_free(struct test_array *ptr)
        ptr->a = ARRAY_POISON;
 }
 
        ptr->a = ARRAY_POISON;
 }
 
+static
 void *thr_reader(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_reader(void *_count)
 {
        unsigned long long *count = _count;
@@ -203,17 +172,14 @@ void *thr_reader(void *_count)
 
        rcu_register_thread();
 
 
        rcu_register_thread();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                rcu_read_lock();
                local_ptr = rcu_dereference(test_rcu_pointer);
                rcu_debug_yield_read();
                if (local_ptr)
 
        for (;;) {
                rcu_read_lock();
                local_ptr = rcu_dereference(test_rcu_pointer);
                rcu_debug_yield_read();
                if (local_ptr)
-                       assert(local_ptr->a == 8);
+                       urcu_posix_assert(local_ptr->a == 8);
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
                rcu_read_unlock();
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
                rcu_read_unlock();
@@ -231,6 +197,7 @@ void *thr_reader(void *_count)
 
 }
 
 
 }
 
+static
 void *thr_writer(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_writer(void *_count)
 {
        unsigned long long *count = _count;
@@ -241,10 +208,7 @@ void *thr_writer(void *_count)
 
        set_affinity();
 
 
        set_affinity();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                rcu_copy_mutex_lock();
 
        for (;;) {
                rcu_copy_mutex_lock();
@@ -272,7 +236,8 @@ void *thr_writer(void *_count)
        return ((void*)2);
 }
 
        return ((void*)2);
 }
 
-void show_usage(int argc, char **argv)
+static
+void show_usage(char **argv)
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
@@ -297,25 +262,25 @@ int main(int argc, char **argv)
        unsigned int i_thr;
 
        if (argc < 4) {
        unsigned int i_thr;
 
        if (argc < 4) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
                return -1;
        }
 
@@ -331,7 +296,7 @@ int main(int argc, char **argv)
                        break;
                case 'a':
                        if (argc < i + 2) {
                        break;
                case 'a':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        a = atoi(argv[++i]);
                                return -1;
                        }
                        a = atoi(argv[++i]);
@@ -341,21 +306,21 @@ int main(int argc, char **argv)
                        break;
                case 'c':
                        if (argc < i + 2) {
                        break;
                case 'c':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
@@ -394,13 +359,7 @@ int main(int argc, char **argv)
                        exit(1);
        }
 
                        exit(1);
        }
 
-       cmm_smp_mb();
-
-       test_go = 1;
-
-       sleep(duration);
-
-       test_stop = 1;
+       test_for(duration);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
index 86b0b022245aadd18d7c306f08ff7ee460e58c95..5da71320db3692c7159bcde0dd9937868c15ece9 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu.c
- *
  * Userspace RCU library - test program
  * Userspace RCU library - test program
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 #include <urcu/tls-compat.h>
 #include <urcu/tls-compat.h>
-#include "cpuset.h"
 #include "thread-id.h"
 #include "../common/debug-yield.h"
 
 #include "thread-id.h"
 #include "../common/debug-yield.h"
 
@@ -45,8 +30,6 @@
 #endif
 #include <urcu-bp.h>
 
 #endif
 #include <urcu-bp.h>
 
-static volatile int test_go, test_stop;
-
 static unsigned long wdelay;
 
 static int *test_rcu_pointer;
 static unsigned long wdelay;
 
 static int *test_rcu_pointer;
@@ -81,7 +64,7 @@ pthread_mutex_t affinity_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static void set_affinity(void)
 {
 
 static void set_affinity(void)
 {
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
@@ -89,7 +72,7 @@ static void set_affinity(void)
        if (!use_affinity)
                return;
 
        if (!use_affinity)
                return;
 
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
@@ -104,27 +87,10 @@ static void set_affinity(void)
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       sched_setaffinity(0, &mask);
-#else
        sched_setaffinity(0, sizeof(mask), &mask);
        sched_setaffinity(0, sizeof(mask), &mask);
-#endif
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
-/*
- * returns 0 if test should end.
- */
-static int test_duration_write(void)
-{
-       return !test_stop;
-}
-
-static int test_duration_read(void)
-{
-       return !test_stop;
-}
-
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
@@ -133,27 +99,7 @@ static unsigned int nr_writers;
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
-void rcu_copy_mutex_lock(void)
-{
-       int ret;
-       ret = pthread_mutex_lock(&rcu_copy_mutex);
-       if (ret) {
-               perror("Error in pthread mutex lock");
-               exit(-1);
-       }
-}
-
-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);
-       }
-}
-
+static
 void *thr_reader(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_reader(void *_count)
 {
        unsigned long long *count = _count;
@@ -165,20 +111,17 @@ void *thr_reader(void *_count)
        set_affinity();
 
        rcu_register_thread();
        set_affinity();
 
        rcu_register_thread();
-       assert(!rcu_read_ongoing());
+       urcu_posix_assert(!rcu_read_ongoing());
 
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                rcu_read_lock();
 
        for (;;) {
                rcu_read_lock();
-               assert(rcu_read_ongoing());
+               urcu_posix_assert(rcu_read_ongoing());
                local_ptr = rcu_dereference(test_rcu_pointer);
                rcu_debug_yield_read();
                if (local_ptr)
                local_ptr = rcu_dereference(test_rcu_pointer);
                rcu_debug_yield_read();
                if (local_ptr)
-                       assert(*local_ptr == 8);
+                       urcu_posix_assert(*local_ptr == 8);
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
                rcu_read_unlock();
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
                rcu_read_unlock();
@@ -196,6 +139,7 @@ void *thr_reader(void *_count)
 
 }
 
 
 }
 
+static
 void *thr_writer(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_writer(void *_count)
 {
        unsigned long long *count = _count;
@@ -206,10 +150,7 @@ void *thr_writer(void *_count)
 
        set_affinity();
 
 
        set_affinity();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                new = malloc(sizeof(int));
 
        for (;;) {
                new = malloc(sizeof(int));
@@ -234,7 +175,8 @@ void *thr_writer(void *_count)
        return ((void*)2);
 }
 
        return ((void*)2);
 }
 
-void show_usage(int argc, char **argv)
+static
+void show_usage(char **argv)
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
@@ -259,25 +201,25 @@ int main(int argc, char **argv)
        unsigned int i_thr;
 
        if (argc < 4) {
        unsigned int i_thr;
 
        if (argc < 4) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
                return -1;
        }
 
@@ -293,7 +235,7 @@ int main(int argc, char **argv)
                        break;
                case 'a':
                        if (argc < i + 2) {
                        break;
                case 'a':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        a = atoi(argv[++i]);
                                return -1;
                        }
                        a = atoi(argv[++i]);
@@ -303,21 +245,21 @@ int main(int argc, char **argv)
                        break;
                case 'c':
                        if (argc < i + 2) {
                        break;
                case 'c':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
@@ -355,13 +297,7 @@ int main(int argc, char **argv)
                        exit(1);
        }
 
                        exit(1);
        }
 
-       cmm_smp_mb();
-
-       test_go = 1;
-
-       sleep(duration);
-
-       test_stop = 1;
+       test_for(duration);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
index df8e335ec898a396e6ed4958ac9e76e419a6038c..56ac28d419d2b38345c030e4b8535e981f347b69 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_defer.c
- *
  * Userspace RCU library - test program (with automatic reclamation)
  * Userspace RCU library - test program (with automatic reclamation)
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 #include <urcu/tls-compat.h>
 #include <urcu/tls-compat.h>
-#include "cpuset.h"
 #include "thread-id.h"
 #include "../common/debug-yield.h"
 
 #include "thread-id.h"
 #include "../common/debug-yield.h"
 
@@ -50,8 +35,6 @@ struct test_array {
        int a;
 };
 
        int a;
 };
 
-static volatile int test_go, test_stop;
-
 static unsigned long wdelay;
 
 static struct test_array *test_rcu_pointer;
 static unsigned long wdelay;
 
 static struct test_array *test_rcu_pointer;
@@ -86,7 +69,7 @@ pthread_mutex_t affinity_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static void set_affinity(void)
 {
 
 static void set_affinity(void)
 {
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
@@ -94,7 +77,7 @@ static void set_affinity(void)
        if (!use_affinity)
                return;
 
        if (!use_affinity)
                return;
 
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
@@ -109,27 +92,10 @@ static void set_affinity(void)
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       sched_setaffinity(0, &mask);
-#else
        sched_setaffinity(0, sizeof(mask), &mask);
        sched_setaffinity(0, sizeof(mask), &mask);
-#endif
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
-/*
- * returns 0 if test should end.
- */
-static int test_duration_write(void)
-{
-       return !test_stop;
-}
-
-static int test_duration_read(void)
-{
-       return !test_stop;
-}
-
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
@@ -141,27 +107,7 @@ static unsigned int nr_writers;
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
-void rcu_copy_mutex_lock(void)
-{
-       int ret;
-       ret = pthread_mutex_lock(&rcu_copy_mutex);
-       if (ret) {
-               perror("Error in pthread mutex lock");
-               exit(-1);
-       }
-}
-
-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);
-       }
-}
-
+static
 void *thr_reader(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_reader(void *_count)
 {
        unsigned long long *count = _count;
@@ -174,17 +120,14 @@ void *thr_reader(void *_count)
 
        rcu_register_thread();
 
 
        rcu_register_thread();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                rcu_read_lock();
                local_ptr = rcu_dereference(test_rcu_pointer);
                rcu_debug_yield_read();
                if (local_ptr)
 
        for (;;) {
                rcu_read_lock();
                local_ptr = rcu_dereference(test_rcu_pointer);
                rcu_debug_yield_read();
                if (local_ptr)
-                       assert(local_ptr->a == 8);
+                       urcu_posix_assert(local_ptr->a == 8);
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
                rcu_read_unlock();
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
                rcu_read_unlock();
@@ -202,14 +145,15 @@ void *thr_reader(void *_count)
 
 }
 
 
 }
 
-static void test_cb2(void *data)
+static void test_cb2(void *data __attribute__((unused)))
 {
 }
 
 {
 }
 
-static void test_cb1(void *data)
+static void test_cb1(void *data __attribute__((unused)))
 {
 }
 
 {
 }
 
+static
 void *thr_writer(void *data)
 {
        unsigned long wtidx = (unsigned long)data;
 void *thr_writer(void *data)
 {
        unsigned long wtidx = (unsigned long)data;
@@ -227,10 +171,7 @@ void *thr_writer(void *data)
                exit(-1);
        }
 
                exit(-1);
        }
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                new = malloc(sizeof(*new));
 
        for (;;) {
                new = malloc(sizeof(*new));
@@ -261,7 +202,8 @@ void *thr_writer(void *data)
        return ((void*)2);
 }
 
        return ((void*)2);
 }
 
-void show_usage(int argc, char **argv)
+static
+void show_usage(char **argv)
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
@@ -286,25 +228,25 @@ int main(int argc, char **argv)
        unsigned int i_thr;
 
        if (argc < 4) {
        unsigned int i_thr;
 
        if (argc < 4) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
                return -1;
        }
 
@@ -320,7 +262,7 @@ int main(int argc, char **argv)
                        break;
                case 'a':
                        if (argc < i + 2) {
                        break;
                case 'a':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        a = atoi(argv[++i]);
                                return -1;
                        }
                        a = atoi(argv[++i]);
@@ -330,21 +272,21 @@ int main(int argc, char **argv)
                        break;
                case 'c':
                        if (argc < i + 2) {
                        break;
                case 'c':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
@@ -382,13 +324,7 @@ int main(int argc, char **argv)
                        exit(1);
        }
 
                        exit(1);
        }
 
-       cmm_smp_mb();
-
-       test_go = 1;
-
-       sleep(duration);
-
-       test_stop = 1;
+       test_for(duration);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
index 34cf141f7a60cea458456958d4cdf095b9d15c51..d52a51df87278328e4c7995ded69f669bc7ceb49 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_gc.c
- *
  * Userspace RCU library - test program (with batch reclamation)
  * Userspace RCU library - test program (with batch reclamation)
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 #include <urcu/tls-compat.h>
 #include <urcu/tls-compat.h>
-#include "cpuset.h"
+#include <urcu/uatomic.h>
 #include "thread-id.h"
 #include "../common/debug-yield.h"
 
 #include "thread-id.h"
 #include "../common/debug-yield.h"
 
@@ -49,8 +35,6 @@ struct test_array {
        int a;
 };
 
        int a;
 };
 
-static volatile int test_go, test_stop;
-
 static unsigned long wdelay;
 
 static struct test_array *test_rcu_pointer;
 static unsigned long wdelay;
 
 static struct test_array *test_rcu_pointer;
@@ -94,7 +78,7 @@ pthread_mutex_t affinity_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static void set_affinity(void)
 {
 
 static void set_affinity(void)
 {
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
@@ -102,7 +86,7 @@ static void set_affinity(void)
        if (!use_affinity)
                return;
 
        if (!use_affinity)
                return;
 
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
@@ -117,27 +101,10 @@ static void set_affinity(void)
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       sched_setaffinity(0, &mask);
-#else
        sched_setaffinity(0, sizeof(mask), &mask);
        sched_setaffinity(0, sizeof(mask), &mask);
-#endif
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
-/*
- * returns 0 if test should end.
- */
-static int test_duration_write(void)
-{
-       return !test_stop;
-}
-
-static int test_duration_read(void)
-{
-       return !test_stop;
-}
-
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
@@ -149,27 +116,7 @@ static unsigned int nr_writers;
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
-void rcu_copy_mutex_lock(void)
-{
-       int ret;
-       ret = pthread_mutex_lock(&rcu_copy_mutex);
-       if (ret) {
-               perror("Error in pthread mutex lock");
-               exit(-1);
-       }
-}
-
-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);
-       }
-}
-
+static
 void *thr_reader(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_reader(void *_count)
 {
        unsigned long long *count = _count;
@@ -182,17 +129,14 @@ void *thr_reader(void *_count)
 
        rcu_register_thread();
 
 
        rcu_register_thread();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                rcu_read_lock();
                local_ptr = rcu_dereference(test_rcu_pointer);
                rcu_debug_yield_read();
                if (local_ptr)
 
        for (;;) {
                rcu_read_lock();
                local_ptr = rcu_dereference(test_rcu_pointer);
                rcu_debug_yield_read();
                if (local_ptr)
-                       assert(local_ptr->a == 8);
+                       urcu_posix_assert(local_ptr->a == 8);
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
                rcu_read_unlock();
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
                rcu_read_unlock();
@@ -241,6 +185,7 @@ static void rcu_gc_reclaim(unsigned long wtidx, void *old)
        rcu_gc_clear_queue(wtidx);
 }
 
        rcu_gc_clear_queue(wtidx);
 }
 
+static
 void *thr_writer(void *data)
 {
        unsigned long wtidx = (unsigned long)data;
 void *thr_writer(void *data)
 {
        unsigned long wtidx = (unsigned long)data;
@@ -255,10 +200,7 @@ void *thr_writer(void *data)
 
        set_affinity();
 
 
        set_affinity();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
 #ifndef TEST_LOCAL_GC
 
        for (;;) {
 #ifndef TEST_LOCAL_GC
@@ -282,7 +224,8 @@ void *thr_writer(void *data)
        return ((void*)2);
 }
 
        return ((void*)2);
 }
 
-void show_usage(int argc, char **argv)
+static
+void show_usage(char **argv)
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
@@ -307,25 +250,25 @@ int main(int argc, char **argv)
        unsigned int i_thr;
 
        if (argc < 4) {
        unsigned int i_thr;
 
        if (argc < 4) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
                return -1;
        }
 
@@ -341,7 +284,7 @@ int main(int argc, char **argv)
                        break;
                case 'a':
                        if (argc < i + 2) {
                        break;
                case 'a':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        a = atoi(argv[++i]);
                                return -1;
                        }
                        a = atoi(argv[++i]);
@@ -351,28 +294,28 @@ int main(int argc, char **argv)
                        break;
                case 'b':
                        if (argc < i + 2) {
                        break;
                case 'b':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        reclaim_batch = atol(argv[++i]);
                        break;
                case 'c':
                        if (argc < i + 2) {
                                return -1;
                        }
                        reclaim_batch = atol(argv[++i]);
                        break;
                case 'c':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
@@ -422,13 +365,7 @@ int main(int argc, char **argv)
                        exit(1);
        }
 
                        exit(1);
        }
 
-       cmm_smp_mb();
-
-       test_go = 1;
-
-       sleep(duration);
-
-       test_stop = 1;
+       test_for(duration);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
index 376f3b15075063653c1995d9eab1a690c28c7ccf..606851baf37ee1b5a84e63b9e8c3cbe3e2a74e48 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_hash.c
- *
  * Userspace RCU library - test program
  * Userspace RCU library - test program
- *
- * Copyright 2009-2012 - Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
- *
- * 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 "test_urcu_hash.h"
  */
 
 #include "test_urcu_hash.h"
@@ -56,26 +42,31 @@ struct test_hash_cb test_hash_cb[] = {
 
 static enum test_hash test_choice = TEST_HASH_RW;
 
 
 static enum test_hash test_choice = TEST_HASH_RW;
 
+static
 void (*get_sigusr1_cb(void))(int)
 {
        return test_hash_cb[test_choice].sigusr1;
 }
 
 void (*get_sigusr1_cb(void))(int)
 {
        return test_hash_cb[test_choice].sigusr1;
 }
 
+static
 void (*get_sigusr2_cb(void))(int)
 {
        return test_hash_cb[test_choice].sigusr2;
 }
 
 void (*get_sigusr2_cb(void))(int)
 {
        return test_hash_cb[test_choice].sigusr2;
 }
 
+static
 void *(*get_thr_reader_cb(void))(void *)
 {
        return test_hash_cb[test_choice].thr_reader;
 }
 
 void *(*get_thr_reader_cb(void))(void *)
 {
        return test_hash_cb[test_choice].thr_reader;
 }
 
+static
 void *(*get_thr_writer_cb(void))(void *)
 {
        return test_hash_cb[test_choice].thr_writer;
 }
 
 void *(*get_thr_writer_cb(void))(void *)
 {
        return test_hash_cb[test_choice].thr_writer;
 }
 
+static
 int (*get_populate_hash_cb(void))(void)
 {
        return test_hash_cb[test_choice].populate_hash;
 int (*get_populate_hash_cb(void))(void)
 {
        return test_hash_cb[test_choice].populate_hash;
@@ -91,8 +82,6 @@ DEFINE_URCU_TLS(unsigned long, lookup_ok);
 
 struct cds_lfht *test_ht;
 
 
 struct cds_lfht *test_ht;
 
-volatile int test_go, test_stop;
-
 unsigned long wdelay;
 
 unsigned long duration;
 unsigned long wdelay;
 
 unsigned long duration;
@@ -135,7 +124,7 @@ static pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 void set_affinity(void)
 {
 
 void set_affinity(void)
 {
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
@@ -143,7 +132,7 @@ void set_affinity(void)
        if (!use_affinity)
                return;
 
        if (!use_affinity)
                return;
 
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
@@ -157,11 +146,7 @@ void set_affinity(void)
        }
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
        }
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       sched_setaffinity(0, &mask);
-#else
        sched_setaffinity(0, sizeof(mask), &mask);
        sched_setaffinity(0, sizeof(mask), &mask);
-#endif
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
@@ -191,14 +176,15 @@ unsigned long test_compare(const void *key1, size_t key1_len,
 {
        if (caa_unlikely(key1_len != key2_len))
                return -1;
 {
        if (caa_unlikely(key1_len != key2_len))
                return -1;
-       assert(key1_len == sizeof(unsigned long));
+       urcu_posix_assert(key1_len == sizeof(unsigned long));
        if (key1 == key2)
                return 0;
        else
                return 1;
 }
 
        if (key1 == key2)
                return 0;
        else
                return 1;
 }
 
-void *thr_count(void *arg)
+static
+void *thr_count(void *arg __attribute__((unused)))
 {
        printf_verbose("thread_begin %s, tid %lu\n",
                        "counter", urcu_get_thread_id());
 {
        printf_verbose("thread_begin %s, tid %lu\n",
                        "counter", urcu_get_thread_id());
@@ -256,14 +242,15 @@ void test_delete_all_nodes(struct cds_lfht *ht)
                int ret;
 
                ret = cds_lfht_del(test_ht, cds_lfht_iter_get_node(&iter));
                int ret;
 
                ret = cds_lfht_del(test_ht, cds_lfht_iter_get_node(&iter));
-               assert(!ret);
+               urcu_posix_assert(!ret);
                call_rcu(&node->head, free_node_cb);
                count++;
        }
        printf("deleted %lu nodes.\n", count);
 }
 
                call_rcu(&node->head, free_node_cb);
                count++;
        }
        printf("deleted %lu nodes.\n", count);
 }
 
-void show_usage(int argc, char **argv)
+static
+void show_usage(char **argv)
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
@@ -316,28 +303,28 @@ int main(int argc, char **argv)
        long long nr_leaked;
 
        if (argc < 4) {
        long long nr_leaked;
 
        if (argc < 4) {
-               show_usage(argc, argv);
+               show_usage(argv);
                mainret = 1;
                goto end;
        }
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
                mainret = 1;
                goto end;
        }
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                mainret = 1;
                goto end;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
                mainret = 1;
                goto end;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                mainret = 1;
                goto end;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
                mainret = 1;
                goto end;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                mainret = 1;
                goto end;
        }
                mainret = 1;
                goto end;
        }
@@ -354,7 +341,7 @@ int main(int argc, char **argv)
                        break;
                case 'a':
                        if (argc < i + 2) {
                        break;
                case 'a':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                mainret = 1;
                                goto end;
                        }
                                mainret = 1;
                                goto end;
                        }
@@ -365,7 +352,7 @@ int main(int argc, char **argv)
                        break;
                case 'c':
                        if (argc < i + 2) {
                        break;
                case 'c':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                mainret = 1;
                                goto end;
                        }
                                mainret = 1;
                                goto end;
                        }
@@ -373,7 +360,7 @@ int main(int argc, char **argv)
                        break;
                case 'd':
                        if (argc < i + 2) {
                        break;
                case 'd':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                mainret = 1;
                                goto end;
                        }
                                mainret = 1;
                                goto end;
                        }
@@ -384,7 +371,7 @@ int main(int argc, char **argv)
                        break;
                case 'h':
                        if (argc < i + 2) {
                        break;
                case 'h':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                mainret = 1;
                                goto end;
                        }
                                mainret = 1;
                                goto end;
                        }
@@ -392,7 +379,7 @@ int main(int argc, char **argv)
                        break;
                case 'm':
                        if (argc < i + 2) {
                        break;
                case 'm':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                mainret = 1;
                                goto end;
                        }
                                mainret = 1;
                                goto end;
                        }
@@ -400,7 +387,7 @@ int main(int argc, char **argv)
                        break;
                case 'n':
                        if (argc < i + 2) {
                        break;
                case 'n':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                mainret = 1;
                                goto end;
                        }
                                mainret = 1;
                                goto end;
                        }
@@ -431,7 +418,7 @@ int main(int argc, char **argv)
                        break;
                case 'B':
                        if (argc < i + 2) {
                        break;
                case 'B':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                mainret = 1;
                                goto end;
                        }
                                mainret = 1;
                                goto end;
                        }
@@ -596,7 +583,7 @@ int main(int argc, char **argv)
         */
        rcu_register_thread();
        ret = (get_populate_hash_cb())();
         */
        rcu_register_thread();
        ret = (get_populate_hash_cb())();
-       assert(!ret);
+       urcu_posix_assert(!ret);
 
        rcu_thread_offline();
 
 
        rcu_thread_offline();
 
@@ -646,14 +633,14 @@ int main(int argc, char **argv)
 
        cmm_smp_mb();
 
 
        cmm_smp_mb();
 
-       test_go = 1;
+       begin_test();
 
        remain = duration;
        do {
                remain = sleep(remain);
        } while (remain > 0);
 
 
        remain = duration;
        do {
                remain = sleep(remain);
        } while (remain > 0);
 
-       test_stop = 1;
+       end_test();
 
 end_pthread_join:
        for (i_thr = 0; i_thr < nr_readers_created; i_thr++) {
 
 end_pthread_join:
        for (i_thr = 0; i_thr < nr_readers_created; i_thr++) {
@@ -688,11 +675,11 @@ end_pthread_join:
        }
        {
                char msg[1] = { 0x42 };
        }
        {
                char msg[1] = { 0x42 };
-               ssize_t ret;
+               ssize_t sret;
 
                do {
 
                do {
-                       ret = write(count_pipe[1], msg, 1);     /* wakeup thread */
-               } while (ret == -1L && errno == EINTR);
+                       sret = write(count_pipe[1], msg, 1);    /* wakeup thread */
+               } while (sret == -1L && errno == EINTR);
        }
        err = pthread_join(tid_count, &tret);
        if (err != 0) {
        }
        err = pthread_join(tid_count, &tret);
        if (err != 0) {
index 5e84aefb6743f4004d317d104b7210aa51dc28d4..0ecb781a129b2804b74a5ae8253ae2d7bd030b97 100644 (file)
@@ -1,26 +1,12 @@
+// SPDX-FileCopyrightText: 2009-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 #ifndef _TEST_URCU_HASH_H
 #define _TEST_URCU_HASH_H
 
 /*
 #ifndef _TEST_URCU_HASH_H
 #define _TEST_URCU_HASH_H
 
 /*
- * test_urcu_hash.h
- *
  * Userspace RCU library - test program
  * Userspace RCU library - test program
- *
- * Copyright 2009-2012 - Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 #include <signal.h>
 
 #include <errno.h>
 #include <signal.h>
 
+#include <urcu/assert.h>
 #include <urcu/tls-compat.h>
 #include <compat-rand.h>
 #include <urcu/tls-compat.h>
 #include <compat-rand.h>
-#include "cpuset.h"
 #include "thread-id.h"
 #include "../common/debug-yield.h"
 
 #include "thread-id.h"
 #include "../common/debug-yield.h"
 
@@ -126,8 +111,6 @@ cds_lfht_iter_get_test_node(struct cds_lfht_iter *iter)
        return to_test_node(cds_lfht_iter_get_node(iter));
 }
 
        return to_test_node(cds_lfht_iter_get_node(iter));
 }
 
-extern volatile int test_go, test_stop;
-
 extern unsigned long wdelay;
 
 extern unsigned long duration;
 extern unsigned long wdelay;
 
 extern unsigned long duration;
@@ -175,19 +158,6 @@ extern pthread_mutex_t affinity_mutex;
 
 void set_affinity(void);
 
 
 void set_affinity(void);
 
-/*
- * returns 0 if test should end.
- */
-static inline int test_duration_write(void)
-{
-       return !test_stop;
-}
-
-static inline int test_duration_read(void)
-{
-       return !test_stop;
-}
-
 extern DECLARE_URCU_TLS(unsigned long long, nr_writes);
 extern DECLARE_URCU_TLS(unsigned long long, nr_reads);
 
 extern DECLARE_URCU_TLS(unsigned long long, nr_writes);
 extern DECLARE_URCU_TLS(unsigned long long, nr_reads);
 
@@ -305,7 +275,7 @@ unsigned long test_hash_mix(const void *_key, size_t length, unsigned long seed)
 {
        unsigned int key = (unsigned int) _key;
 
 {
        unsigned int key = (unsigned int) _key;
 
-       assert(length == sizeof(unsigned int));
+       urcu_posix_assert(length == sizeof(unsigned int));
        return hash_u32(&key, 1, seed);
 }
 #else
        return hash_u32(&key, 1, seed);
 }
 #else
@@ -321,7 +291,7 @@ unsigned long test_hash_mix(const void *_key, size_t length, unsigned long seed)
                uint32_t v32[2];
        } key;
 
                uint32_t v32[2];
        } key;
 
-       assert(length == sizeof(unsigned long));
+       urcu_posix_assert(length == sizeof(unsigned long));
        v.v64 = (uint64_t) seed;
        key.v64 = (uint64_t) _key;
        hashword2(key.v32, 2, &v.v32[0], &v.v32[1]);
        v.v64 = (uint64_t) seed;
        key.v64 = (uint64_t) _key;
        hashword2(key.v32, 2, &v.v32[0], &v.v32[1]);
@@ -346,7 +316,7 @@ unsigned long test_hash(const void *_key, size_t length,
        } else {
                unsigned long v;
 
        } else {
                unsigned long v;
 
-               assert(length == sizeof(unsigned long));
+               urcu_posix_assert(length == sizeof(unsigned long));
                v = (unsigned long) _key;
                return v % nr_hash_chains;
        }
                v = (unsigned long) _key;
                return v % nr_hash_chains;
        }
@@ -368,7 +338,7 @@ static inline
 void cds_lfht_test_lookup(struct cds_lfht *ht, void *key, size_t key_len,
                struct cds_lfht_iter *iter)
 {
 void cds_lfht_test_lookup(struct cds_lfht *ht, void *key, size_t key_len,
                struct cds_lfht_iter *iter)
 {
-       assert(key_len == sizeof(unsigned long));
+       urcu_posix_assert(key_len == sizeof(unsigned long));
 
        cds_lfht_lookup(ht, test_hash(key, key_len, TEST_HASH_SEED),
                        test_match, key, iter);
 
        cds_lfht_lookup(ht, test_hash(key, key_len, TEST_HASH_SEED),
                        test_match, key, iter);
index f72e20b8210c727ca0af02b9cb94f6dc6aec07c9..b76603e6742db7f702ed38d46cd6c73fac4bfff3 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_hash_rw.c
- *
  * Userspace RCU library - test program
  * Userspace RCU library - test program
- *
- * Copyright 2009-2012 - Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
- *
- * 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 "test_urcu_hash.h"
  */
 
 #include "test_urcu_hash.h"
@@ -30,7 +16,7 @@ enum urcu_hash_addremove {
 
 static enum urcu_hash_addremove addremove; /* 1: add, -1 remove, 0: random */
 
 
 static enum urcu_hash_addremove addremove; /* 1: add, -1 remove, 0: random */
 
-void test_hash_rw_sigusr1_handler(int signo)
+void test_hash_rw_sigusr1_handler(int signo __attribute__((unused)))
 {
        switch (addremove) {
        case AR_ADD:
 {
        switch (addremove) {
        case AR_ADD:
@@ -48,7 +34,7 @@ void test_hash_rw_sigusr1_handler(int signo)
        }
 }
 
        }
 }
 
-void test_hash_rw_sigusr2_handler(int signo)
+void test_hash_rw_sigusr2_handler(int signo __attribute__((unused)))
 {
        char msg[1] = { 0x42 };
        ssize_t ret;
 {
        char msg[1] = { 0x42 };
        ssize_t ret;
@@ -73,10 +59,7 @@ void *test_hash_rw_thr_reader(void *_count)
 
        rcu_register_thread();
 
 
        rcu_register_thread();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                rcu_read_lock();
 
        for (;;) {
                rcu_read_lock();
@@ -133,10 +116,7 @@ void *test_hash_rw_thr_writer(void *_count)
 
        rcu_register_thread();
 
 
        rcu_register_thread();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                struct cds_lfht_node *ret_node = NULL;
 
        for (;;) {
                struct cds_lfht_node *ret_node = NULL;
index f03adfd6daa03477824618a60dc6bc9963b8abf5..487baa878e698cc01bad314cd34d5b77cb615fe0 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_hash_unique.c
- *
  * Userspace RCU library - test program
  * Userspace RCU library - test program
- *
- * Copyright 2009-2012 - Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
- *
- * 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 "test_urcu_hash.h"
  */
 
 #include "test_urcu_hash.h"
@@ -30,7 +16,7 @@ enum urcu_hash_addremove {
 
 static enum urcu_hash_addremove addremove; /* 1: add, -1 remove, 0: random */
 
 
 static enum urcu_hash_addremove addremove; /* 1: add, -1 remove, 0: random */
 
-void test_hash_unique_sigusr1_handler(int signo)
+void test_hash_unique_sigusr1_handler(int signo __attribute__((unused)))
 {
        switch (addremove) {
        case AR_ADD:
 {
        switch (addremove) {
        case AR_ADD:
@@ -48,7 +34,7 @@ void test_hash_unique_sigusr1_handler(int signo)
        }
 }
 
        }
 }
 
-void test_hash_unique_sigusr2_handler(int signo)
+void test_hash_unique_sigusr2_handler(int signo __attribute__((unused)))
 {
        char msg[1] = { 0x42 };
        ssize_t ret;
 {
        char msg[1] = { 0x42 };
        ssize_t ret;
@@ -71,10 +57,7 @@ void *test_hash_unique_thr_reader(void *_count)
 
        rcu_register_thread();
 
 
        rcu_register_thread();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                struct lfht_test_node *node;
 
        for (;;) {
                struct lfht_test_node *node;
@@ -136,10 +119,7 @@ void *test_hash_unique_thr_writer(void *_count)
 
        rcu_register_thread();
 
 
        rcu_register_thread();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                /*
 
        for (;;) {
                /*
index 26247b50022f8e3ecaf27acdc5f6d12fcfece758..66cf78ca36aa0e4668e663461cd2c84a7c12f8c6 100644 (file)
@@ -1,24 +1,10 @@
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2010 Paolo Bonzini <pbonzini@redhat.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_lfq.c
- *
  * Userspace RCU library - example RCU-based lock-free queue
  * Userspace RCU library - example RCU-based lock-free queue
- *
- * Copyright February 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright February 2010 - Paolo Bonzini <pbonzini@redhat.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 #include <urcu/tls-compat.h>
 #include <urcu/tls-compat.h>
-#include "cpuset.h"
 #include "thread-id.h"
 
 /* hardcoded number of CPUs */
 #include "thread-id.h"
 
 /* hardcoded number of CPUs */
@@ -48,8 +33,6 @@
 #include <urcu.h>
 #include <urcu/cds.h>
 
 #include <urcu.h>
 #include <urcu/cds.h>
 
-static volatile int test_go, test_stop;
-
 static unsigned long rduration;
 
 static unsigned long duration;
 static unsigned long rduration;
 
 static unsigned long duration;
@@ -79,7 +62,7 @@ pthread_mutex_t affinity_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static void set_affinity(void)
 {
 
 static void set_affinity(void)
 {
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
@@ -87,7 +70,7 @@ static void set_affinity(void)
        if (!use_affinity)
                return;
 
        if (!use_affinity)
                return;
 
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
@@ -102,11 +85,7 @@ static void set_affinity(void)
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       sched_setaffinity(0, &mask);
-#else
        sched_setaffinity(0, sizeof(mask), &mask);
        sched_setaffinity(0, sizeof(mask), &mask);
-#endif
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
@@ -115,12 +94,12 @@ static void set_affinity(void)
  */
 static int test_duration_dequeue(void)
 {
  */
 static int test_duration_dequeue(void)
 {
-       return !test_stop;
+       return test_duration_read();
 }
 
 static int test_duration_enqueue(void)
 {
 }
 
 static int test_duration_enqueue(void)
 {
-       return !test_stop;
+       return test_duration_write();
 }
 
 static DEFINE_URCU_TLS(unsigned long long, nr_dequeues);
 }
 
 static DEFINE_URCU_TLS(unsigned long long, nr_dequeues);
@@ -139,6 +118,7 @@ struct test {
 
 static struct cds_lfq_queue_rcu q;
 
 
 static struct cds_lfq_queue_rcu q;
 
+static
 void *thr_enqueuer(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_enqueuer(void *_count)
 {
        unsigned long long *count = _count;
@@ -150,10 +130,7 @@ void *thr_enqueuer(void *_count)
 
        rcu_register_thread();
 
 
        rcu_register_thread();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                struct test *node = malloc(sizeof(*node));
 
        for (;;) {
                struct test *node = malloc(sizeof(*node));
@@ -194,6 +171,7 @@ void free_node_cb(struct rcu_head *head)
        free(node);
 }
 
        free(node);
 }
 
+static
 void *thr_dequeuer(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_dequeuer(void *_count)
 {
        unsigned long long *count = _count;
@@ -205,10 +183,7 @@ void *thr_dequeuer(void *_count)
 
        rcu_register_thread();
 
 
        rcu_register_thread();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                struct cds_lfq_node_rcu *qnode;
 
        for (;;) {
                struct cds_lfq_node_rcu *qnode;
@@ -243,23 +218,25 @@ void *thr_dequeuer(void *_count)
        return ((void*)2);
 }
 
        return ((void*)2);
 }
 
-void test_end(struct cds_lfq_queue_rcu *q, unsigned long long *nr_dequeues)
+static
+void test_end(unsigned long long *nr_dequeues_l)
 {
        struct cds_lfq_node_rcu *snode;
 
        do {
 {
        struct cds_lfq_node_rcu *snode;
 
        do {
-               snode = cds_lfq_dequeue_rcu(q);
+               snode = cds_lfq_dequeue_rcu(&q);
                if (snode) {
                        struct test *node;
 
                        node = caa_container_of(snode, struct test, list);
                        free(node);     /* no more concurrent access */
                if (snode) {
                        struct test *node;
 
                        node = caa_container_of(snode, struct test, list);
                        free(node);     /* no more concurrent access */
-                       (*nr_dequeues)++;
+                       (*nr_dequeues_l)++;
                }
        } while (snode);
 }
 
                }
        } while (snode);
 }
 
-void show_usage(int argc, char **argv)
+static
+void show_usage(char **argv)
 {
        printf("Usage : %s nr_dequeuers nr_enqueuers duration (s) <OPTIONS>\n",
                argv[0]);
 {
        printf("Usage : %s nr_dequeuers nr_enqueuers duration (s) <OPTIONS>\n",
                argv[0]);
@@ -285,25 +262,25 @@ int main(int argc, char **argv)
        unsigned int i_thr;
 
        if (argc < 4) {
        unsigned int i_thr;
 
        if (argc < 4) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_dequeuers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_dequeuers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_enqueuers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_enqueuers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
                return -1;
        }
 
@@ -313,7 +290,7 @@ int main(int argc, char **argv)
                switch (argv[i][1]) {
                case 'a':
                        if (argc < i + 2) {
                switch (argv[i][1]) {
                case 'a':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        a = atoi(argv[++i]);
                                return -1;
                        }
                        a = atoi(argv[++i]);
@@ -323,14 +300,14 @@ int main(int argc, char **argv)
                        break;
                case 'c':
                        if (argc < i + 2) {
                        break;
                case 'c':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
@@ -376,7 +353,7 @@ int main(int argc, char **argv)
 
        cmm_smp_mb();
 
 
        cmm_smp_mb();
 
-       test_go = 1;
+       begin_test();
 
        for (i_thr = 0; i_thr < duration; i_thr++) {
                sleep(1);
 
        for (i_thr = 0; i_thr < duration; i_thr++) {
                sleep(1);
@@ -386,7 +363,7 @@ int main(int argc, char **argv)
                }
        }
 
                }
        }
 
-       test_stop = 1;
+       end_test();
 
        for (i_thr = 0; i_thr < nr_enqueuers; i_thr++) {
                err = pthread_join(tid_enqueuer[i_thr], &tret);
 
        for (i_thr = 0; i_thr < nr_enqueuers; i_thr++) {
                err = pthread_join(tid_enqueuer[i_thr], &tret);
@@ -403,9 +380,9 @@ int main(int argc, char **argv)
                tot_successful_dequeues += count_dequeuer[2 * i_thr + 1];
        }
 
                tot_successful_dequeues += count_dequeuer[2 * i_thr + 1];
        }
 
-       test_end(&q, &end_dequeues);
+       test_end(&end_dequeues);
        err = cds_lfq_destroy_rcu(&q);
        err = cds_lfq_destroy_rcu(&q);
-       assert(!err);
+       urcu_posix_assert(!err);
 
        printf_verbose("total number of enqueues : %llu, dequeues %llu\n",
                       tot_enqueues, tot_dequeues);
 
        printf_verbose("total number of enqueues : %llu, dequeues %llu\n",
                       tot_enqueues, tot_dequeues);
index 2f6ee25a4266c7af2372a5151144f2e9f8b526c0..933f0b37bfdb01c6ce8d8d618b4945569e983d61 100644 (file)
@@ -1,24 +1,10 @@
+// SPDX-FileCopyrightText: 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2010 Paolo Bonzini <pbonzini@redhat.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_lfs.c
- *
  * Userspace RCU library - example lock-free stack
  * Userspace RCU library - example lock-free stack
- *
- * Copyright 2010-2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright February 2010 - Paolo Bonzini <pbonzini@redhat.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 #include <urcu/tls-compat.h>
 #include <urcu/tls-compat.h>
-#include "cpuset.h"
 #include "thread-id.h"
 
 /* hardcoded number of CPUs */
 #include "thread-id.h"
 
 /* hardcoded number of CPUs */
@@ -60,8 +45,6 @@ enum test_sync {
 
 static enum test_sync test_sync;
 
 
 static enum test_sync test_sync;
 
-static volatile int test_go, test_stop;
-
 static unsigned long rduration;
 
 static unsigned long duration;
 static unsigned long rduration;
 
 static unsigned long duration;
@@ -93,7 +76,7 @@ pthread_mutex_t affinity_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static void set_affinity(void)
 {
 
 static void set_affinity(void)
 {
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
@@ -101,7 +84,7 @@ static void set_affinity(void)
        if (!use_affinity)
                return;
 
        if (!use_affinity)
                return;
 
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
@@ -116,11 +99,7 @@ static void set_affinity(void)
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       sched_setaffinity(0, &mask);
-#else
        sched_setaffinity(0, sizeof(mask), &mask);
        sched_setaffinity(0, sizeof(mask), &mask);
-#endif
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
@@ -129,12 +108,12 @@ static void set_affinity(void)
  */
 static int test_duration_dequeue(void)
 {
  */
 static int test_duration_dequeue(void)
 {
-       return !test_stop;
+       return test_duration_read();
 }
 
 static int test_duration_enqueue(void)
 {
 }
 
 static int test_duration_enqueue(void)
 {
-       return !test_stop;
+       return test_duration_write();
 }
 
 static DEFINE_URCU_TLS(unsigned long long, nr_dequeues);
 }
 
 static DEFINE_URCU_TLS(unsigned long long, nr_dequeues);
@@ -164,10 +143,7 @@ static void *thr_enqueuer(void *_count)
 
        rcu_register_thread();
 
 
        rcu_register_thread();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                struct test *node = malloc(sizeof(*node));
 
        for (;;) {
                struct test *node = malloc(sizeof(*node));
@@ -266,12 +242,9 @@ static void *thr_dequeuer(void *_count)
 
        rcu_register_thread();
 
 
        rcu_register_thread();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
 
-       assert(test_pop || test_pop_all);
+       urcu_posix_assert(test_pop || test_pop_all);
 
        for (;;) {
                if (test_pop && test_pop_all) {
 
        for (;;) {
                if (test_pop && test_pop_all) {
@@ -306,23 +279,23 @@ static void *thr_dequeuer(void *_count)
        return ((void*)2);
 }
 
        return ((void*)2);
 }
 
-static void test_end(struct cds_lfs_stack *s, unsigned long long *nr_dequeues)
+static void test_end(unsigned long long *nr_dequeues_l)
 {
        struct cds_lfs_node *snode;
 
        do {
 {
        struct cds_lfs_node *snode;
 
        do {
-               snode = __cds_lfs_pop(s);
+               snode = __cds_lfs_pop(&s);
                if (snode) {
                        struct test *node;
 
                        node = caa_container_of(snode, struct test, list);
                        free(node);
                if (snode) {
                        struct test *node;
 
                        node = caa_container_of(snode, struct test, list);
                        free(node);
-                       (*nr_dequeues)++;
+                       (*nr_dequeues_l)++;
                }
        } while (snode);
 }
 
                }
        } while (snode);
 }
 
-static void show_usage(int argc, char **argv)
+static void show_usage(char **argv)
 {
        printf("Usage : %s nr_dequeuers nr_enqueuers duration (s) <OPTIONS>\n",
                argv[0]);
 {
        printf("Usage : %s nr_dequeuers nr_enqueuers duration (s) <OPTIONS>\n",
                argv[0]);
@@ -352,25 +325,25 @@ int main(int argc, char **argv)
        unsigned int i_thr;
 
        if (argc < 4) {
        unsigned int i_thr;
 
        if (argc < 4) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_dequeuers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_dequeuers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_enqueuers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_enqueuers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
                return -1;
        }
 
@@ -380,7 +353,7 @@ int main(int argc, char **argv)
                switch (argv[i][1]) {
                case 'a':
                        if (argc < i + 2) {
                switch (argv[i][1]) {
                case 'a':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        a = atoi(argv[++i]);
                                return -1;
                        }
                        a = atoi(argv[++i]);
@@ -390,14 +363,14 @@ int main(int argc, char **argv)
                        break;
                case 'c':
                        if (argc < i + 2) {
                        break;
                case 'c':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
@@ -464,7 +437,7 @@ int main(int argc, char **argv)
 
        cmm_smp_mb();
 
 
        cmm_smp_mb();
 
-       test_go = 1;
+       begin_test();
 
        for (i_thr = 0; i_thr < duration; i_thr++) {
                sleep(1);
 
        for (i_thr = 0; i_thr < duration; i_thr++) {
                sleep(1);
@@ -474,7 +447,7 @@ int main(int argc, char **argv)
                }
        }
 
                }
        }
 
-       test_stop = 1;
+       end_test();
 
        for (i_thr = 0; i_thr < nr_enqueuers; i_thr++) {
                err = pthread_join(tid_enqueuer[i_thr], &tret);
 
        for (i_thr = 0; i_thr < nr_enqueuers; i_thr++) {
                err = pthread_join(tid_enqueuer[i_thr], &tret);
@@ -491,7 +464,7 @@ int main(int argc, char **argv)
                tot_successful_dequeues += count_dequeuer[2 * i_thr + 1];
        }
 
                tot_successful_dequeues += count_dequeuer[2 * i_thr + 1];
        }
 
-       test_end(&s, &end_dequeues);
+       test_end(&end_dequeues);
 
        printf_verbose("total number of enqueues : %llu, dequeues %llu\n",
                       tot_enqueues, tot_dequeues);
 
        printf_verbose("total number of enqueues : %llu, dequeues %llu\n",
                       tot_enqueues, tot_dequeues);
index d0e80db51b451de612ab3c247bb029011a8a637b..cb9236d87d05a0209b3392a1aa47a34345c612f9 100644 (file)
@@ -1,24 +1,10 @@
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2010 Paolo Bonzini <pbonzini@redhat.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_lfs_rcu.c
- *
  * Userspace RCU library - example RCU-based lock-free stack
  * Userspace RCU library - example RCU-based lock-free stack
- *
- * Copyright February 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright February 2010 - Paolo Bonzini <pbonzini@redhat.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 #include <urcu/tls-compat.h>
 #include <urcu/tls-compat.h>
-#include "cpuset.h"
 #include "thread-id.h"
 
 /* hardcoded number of CPUs */
 #include "thread-id.h"
 
 /* hardcoded number of CPUs */
@@ -52,8 +37,6 @@
 
 #include <urcu/cds.h>
 
 
 #include <urcu/cds.h>
 
-static volatile int test_go, test_stop;
-
 static unsigned long rduration;
 
 static unsigned long duration;
 static unsigned long rduration;
 
 static unsigned long duration;
@@ -83,7 +66,7 @@ pthread_mutex_t affinity_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static void set_affinity(void)
 {
 
 static void set_affinity(void)
 {
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
@@ -91,7 +74,7 @@ static void set_affinity(void)
        if (!use_affinity)
                return;
 
        if (!use_affinity)
                return;
 
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
@@ -106,11 +89,7 @@ static void set_affinity(void)
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       sched_setaffinity(0, &mask);
-#else
        sched_setaffinity(0, sizeof(mask), &mask);
        sched_setaffinity(0, sizeof(mask), &mask);
-#endif
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
@@ -119,12 +98,12 @@ static void set_affinity(void)
  */
 static int test_duration_dequeue(void)
 {
  */
 static int test_duration_dequeue(void)
 {
-       return !test_stop;
+       return test_duration_read();
 }
 
 static int test_duration_enqueue(void)
 {
 }
 
 static int test_duration_enqueue(void)
 {
-       return !test_stop;
+       return test_duration_write();
 }
 
 static DEFINE_URCU_TLS(unsigned long long, nr_dequeues);
 }
 
 static DEFINE_URCU_TLS(unsigned long long, nr_dequeues);
@@ -143,6 +122,7 @@ struct test {
 
 static struct cds_lfs_stack_rcu s;
 
 
 static struct cds_lfs_stack_rcu s;
 
+static
 void *thr_enqueuer(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_enqueuer(void *_count)
 {
        unsigned long long *count = _count;
@@ -154,10 +134,7 @@ void *thr_enqueuer(void *_count)
 
        rcu_register_thread();
 
 
        rcu_register_thread();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                struct test *node = malloc(sizeof(*node));
 
        for (;;) {
                struct test *node = malloc(sizeof(*node));
@@ -197,6 +174,7 @@ void free_node_cb(struct rcu_head *head)
        free(node);
 }
 
        free(node);
 }
 
+static
 void *thr_dequeuer(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_dequeuer(void *_count)
 {
        unsigned long long *count = _count;
@@ -208,10 +186,7 @@ void *thr_dequeuer(void *_count)
 
        rcu_register_thread();
 
 
        rcu_register_thread();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                struct cds_lfs_node_rcu *snode;
 
        for (;;) {
                struct cds_lfs_node_rcu *snode;
@@ -245,23 +220,25 @@ void *thr_dequeuer(void *_count)
        return ((void*)2);
 }
 
        return ((void*)2);
 }
 
-void test_end(struct cds_lfs_stack_rcu *s, unsigned long long *nr_dequeues)
+static
+void test_end(unsigned long long *nr_dequeues_l)
 {
        struct cds_lfs_node_rcu *snode;
 
        do {
 {
        struct cds_lfs_node_rcu *snode;
 
        do {
-               snode = cds_lfs_pop_rcu(s);
+               snode = cds_lfs_pop_rcu(&s);
                if (snode) {
                        struct test *node;
 
                        node = caa_container_of(snode, struct test, list);
                        free(node);
                if (snode) {
                        struct test *node;
 
                        node = caa_container_of(snode, struct test, list);
                        free(node);
-                       (*nr_dequeues)++;
+                       (*nr_dequeues_l)++;
                }
        } while (snode);
 }
 
                }
        } while (snode);
 }
 
-void show_usage(int argc, char **argv)
+static
+void show_usage(char **argv)
 {
        printf("Usage : %s nr_dequeuers nr_enqueuers duration (s) <OPTIONS>\n",
                argv[0]);
 {
        printf("Usage : %s nr_dequeuers nr_enqueuers duration (s) <OPTIONS>\n",
                argv[0]);
@@ -287,25 +264,25 @@ int main(int argc, char **argv)
        unsigned int i_thr;
 
        if (argc < 4) {
        unsigned int i_thr;
 
        if (argc < 4) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_dequeuers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_dequeuers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_enqueuers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_enqueuers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
                return -1;
        }
 
@@ -315,7 +292,7 @@ int main(int argc, char **argv)
                switch (argv[i][1]) {
                case 'a':
                        if (argc < i + 2) {
                switch (argv[i][1]) {
                case 'a':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        a = atoi(argv[++i]);
                                return -1;
                        }
                        a = atoi(argv[++i]);
@@ -325,14 +302,14 @@ int main(int argc, char **argv)
                        break;
                case 'c':
                        if (argc < i + 2) {
                        break;
                case 'c':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
@@ -378,7 +355,7 @@ int main(int argc, char **argv)
 
        cmm_smp_mb();
 
 
        cmm_smp_mb();
 
-       test_go = 1;
+       begin_test();
 
        for (i_thr = 0; i_thr < duration; i_thr++) {
                sleep(1);
 
        for (i_thr = 0; i_thr < duration; i_thr++) {
                sleep(1);
@@ -388,7 +365,7 @@ int main(int argc, char **argv)
                }
        }
 
                }
        }
 
-       test_stop = 1;
+       end_test();
 
        for (i_thr = 0; i_thr < nr_enqueuers; i_thr++) {
                err = pthread_join(tid_enqueuer[i_thr], &tret);
 
        for (i_thr = 0; i_thr < nr_enqueuers; i_thr++) {
                err = pthread_join(tid_enqueuer[i_thr], &tret);
@@ -405,7 +382,7 @@ int main(int argc, char **argv)
                tot_successful_dequeues += count_dequeuer[2 * i_thr + 1];
        }
 
                tot_successful_dequeues += count_dequeuer[2 * i_thr + 1];
        }
 
-       test_end(&s, &end_dequeues);
+       test_end(&end_dequeues);
 
        printf_verbose("total number of enqueues : %llu, dequeues %llu\n",
                       tot_enqueues, tot_dequeues);
 
        printf_verbose("total number of enqueues : %llu, dequeues %llu\n",
                       tot_enqueues, tot_dequeues);
index 962476c0be054ace287e229f4726dad2b361a2ea..a33dbd342df734baae3fc92678619a72f7116bb1 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu.c
- *
  * Userspace RCU library - test program
  * Userspace RCU library - test program
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 #include <urcu/tls-compat.h>
 #include <urcu/tls-compat.h>
-#include "cpuset.h"
 #include "thread-id.h"
 #include "../common/debug-yield.h"
 
 #include "thread-id.h"
 #include "../common/debug-yield.h"
 
@@ -45,8 +30,6 @@
 #endif
 #include "urcu-qsbr.h"
 
 #endif
 #include "urcu-qsbr.h"
 
-static volatile int test_go, test_stop;
-
 static unsigned long wdelay;
 
 static int *test_rcu_pointer;
 static unsigned long wdelay;
 
 static int *test_rcu_pointer;
@@ -81,7 +64,7 @@ pthread_mutex_t affinity_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static void set_affinity(void)
 {
 
 static void set_affinity(void)
 {
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
@@ -89,7 +72,7 @@ static void set_affinity(void)
        if (!use_affinity)
                return;
 
        if (!use_affinity)
                return;
 
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
@@ -103,27 +86,10 @@ static void set_affinity(void)
        }
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
        }
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       sched_setaffinity(0, &mask);
-#else
        sched_setaffinity(0, sizeof(mask), &mask);
        sched_setaffinity(0, sizeof(mask), &mask);
-#endif
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
-/*
- * returns 0 if test should end.
- */
-static int test_duration_write(void)
-{
-       return !test_stop;
-}
-
-static int test_duration_read(void)
-{
-       return !test_stop;
-}
-
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
@@ -132,27 +98,7 @@ static unsigned int nr_writers;
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
-void rcu_copy_mutex_lock(void)
-{
-       int ret;
-       ret = pthread_mutex_lock(&rcu_copy_mutex);
-       if (ret) {
-               perror("Error in pthread mutex lock");
-               exit(-1);
-       }
-}
-
-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);
-       }
-}
-
+static
 void *thr_reader(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_reader(void *_count)
 {
        unsigned long long *count = _count;
@@ -165,23 +111,20 @@ void *thr_reader(void *_count)
 
        rcu_register_thread();
 
 
        rcu_register_thread();
 
-       assert(rcu_read_ongoing());
+       urcu_posix_assert(rcu_read_ongoing());
        rcu_thread_offline();
        rcu_thread_offline();
-       assert(!rcu_read_ongoing());
+       urcu_posix_assert(!rcu_read_ongoing());
        rcu_thread_online();
 
        rcu_thread_online();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                rcu_read_lock();
 
        for (;;) {
                rcu_read_lock();
-               assert(rcu_read_ongoing());
+               urcu_posix_assert(rcu_read_ongoing());
                local_ptr = rcu_dereference(test_rcu_pointer);
                rcu_debug_yield_read();
                if (local_ptr)
                local_ptr = rcu_dereference(test_rcu_pointer);
                rcu_debug_yield_read();
                if (local_ptr)
-                       assert(*local_ptr == 8);
+                       urcu_posix_assert(*local_ptr == 8);
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
                rcu_read_unlock();
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
                rcu_read_unlock();
@@ -206,6 +149,7 @@ void *thr_reader(void *_count)
 
 }
 
 
 }
 
+static
 void *thr_writer(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_writer(void *_count)
 {
        unsigned long long *count = _count;
@@ -216,14 +160,11 @@ void *thr_writer(void *_count)
 
        set_affinity();
 
 
        set_affinity();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                new = malloc(sizeof(int));
 
        for (;;) {
                new = malloc(sizeof(int));
-               assert(new);
+               urcu_posix_assert(new);
                *new = 8;
                old = rcu_xchg_pointer(&test_rcu_pointer, new);
                if (caa_unlikely(wduration))
                *new = 8;
                old = rcu_xchg_pointer(&test_rcu_pointer, new);
                if (caa_unlikely(wduration))
@@ -245,7 +186,8 @@ void *thr_writer(void *_count)
        return ((void*)2);
 }
 
        return ((void*)2);
 }
 
-void show_usage(int argc, char **argv)
+static
+void show_usage(char **argv)
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
@@ -270,25 +212,25 @@ int main(int argc, char **argv)
        unsigned int i_thr;
 
        if (argc < 4) {
        unsigned int i_thr;
 
        if (argc < 4) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
                return -1;
        }
 
@@ -304,7 +246,7 @@ int main(int argc, char **argv)
                        break;
                case 'a':
                        if (argc < i + 2) {
                        break;
                case 'a':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        a = atoi(argv[++i]);
                                return -1;
                        }
                        a = atoi(argv[++i]);
@@ -314,21 +256,21 @@ int main(int argc, char **argv)
                        break;
                case 'c':
                        if (argc < i + 2) {
                        break;
                case 'c':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
@@ -366,13 +308,7 @@ int main(int argc, char **argv)
                        exit(1);
        }
 
                        exit(1);
        }
 
-       cmm_smp_mb();
-
-       test_go = 1;
-
-       sleep(duration);
-
-       test_stop = 1;
+       test_for(duration);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
index 26bc3523bb77f43937c719fea07eb88fe8f43bf4..00f6757c9d294348cb969b015f4b658831301e7d 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_gc.c
- *
  * Userspace RCU library - test program (with baatch reclamation)
  * Userspace RCU library - test program (with baatch reclamation)
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 #include <urcu/tls-compat.h>
 #include <urcu/tls-compat.h>
-#include "cpuset.h"
+#include <urcu/uatomic.h>
 #include "thread-id.h"
 #include "../common/debug-yield.h"
 
 #include "thread-id.h"
 #include "../common/debug-yield.h"
 
@@ -47,8 +33,6 @@ struct test_array {
        int a;
 };
 
        int a;
 };
 
-static volatile int test_go, test_stop;
-
 static unsigned long wdelay;
 
 static struct test_array *test_rcu_pointer;
 static unsigned long wdelay;
 
 static struct test_array *test_rcu_pointer;
@@ -92,7 +76,7 @@ pthread_mutex_t affinity_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static void set_affinity(void)
 {
 
 static void set_affinity(void)
 {
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
@@ -100,7 +84,7 @@ static void set_affinity(void)
        if (!use_affinity)
                return;
 
        if (!use_affinity)
                return;
 
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
@@ -115,27 +99,10 @@ static void set_affinity(void)
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       sched_setaffinity(0, &mask);
-#else
        sched_setaffinity(0, sizeof(mask), &mask);
        sched_setaffinity(0, sizeof(mask), &mask);
-#endif
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
-/*
- * returns 0 if test should end.
- */
-static int test_duration_write(void)
-{
-       return !test_stop;
-}
-
-static int test_duration_read(void)
-{
-       return !test_stop;
-}
-
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
 static DEFINE_URCU_TLS(unsigned long long, nr_writes);
 static DEFINE_URCU_TLS(unsigned long long, nr_reads);
 
@@ -146,28 +113,7 @@ pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 static
 unsigned long long __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *tot_nr_writes;
 
 static
 unsigned long long __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *tot_nr_writes;
 
-
-void rcu_copy_mutex_lock(void)
-{
-       int ret;
-       ret = pthread_mutex_lock(&rcu_copy_mutex);
-       if (ret) {
-               perror("Error in pthread mutex lock");
-               exit(-1);
-       }
-}
-
-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);
-       }
-}
-
+static
 void *thr_reader(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_reader(void *_count)
 {
        unsigned long long *count = _count;
@@ -180,17 +126,14 @@ void *thr_reader(void *_count)
 
        rcu_register_thread();
 
 
        rcu_register_thread();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                _rcu_read_lock();
                local_ptr = _rcu_dereference(test_rcu_pointer);
                rcu_debug_yield_read();
                if (local_ptr)
 
        for (;;) {
                _rcu_read_lock();
                local_ptr = _rcu_dereference(test_rcu_pointer);
                rcu_debug_yield_read();
                if (local_ptr)
-                       assert(local_ptr->a == 8);
+                       urcu_posix_assert(local_ptr->a == 8);
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
                _rcu_read_unlock();
                if (caa_unlikely(rduration))
                        loop_sleep(rduration);
                _rcu_read_unlock();
@@ -242,6 +185,7 @@ static void rcu_gc_reclaim(unsigned long wtidx, void *old)
        rcu_gc_clear_queue(wtidx);
 }
 
        rcu_gc_clear_queue(wtidx);
 }
 
+static
 void *thr_writer(void *data)
 {
        unsigned long wtidx = (unsigned long)data;
 void *thr_writer(void *data)
 {
        unsigned long wtidx = (unsigned long)data;
@@ -256,10 +200,7 @@ void *thr_writer(void *data)
 
        set_affinity();
 
 
        set_affinity();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
 #ifndef TEST_LOCAL_GC
 
        for (;;) {
 #ifndef TEST_LOCAL_GC
@@ -283,7 +224,8 @@ void *thr_writer(void *data)
        return ((void*)2);
 }
 
        return ((void*)2);
 }
 
-void show_usage(int argc, char **argv)
+static
+void show_usage(char **argv)
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
 {
        printf("Usage : %s nr_readers nr_writers duration (s) <OPTIONS>\n",
                argv[0]);
@@ -309,25 +251,25 @@ int main(int argc, char **argv)
        unsigned int i_thr;
 
        if (argc < 4) {
        unsigned int i_thr;
 
        if (argc < 4) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_readers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_writers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
                return -1;
        }
 
@@ -343,7 +285,7 @@ int main(int argc, char **argv)
                        break;
                case 'a':
                        if (argc < i + 2) {
                        break;
                case 'a':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        a = atoi(argv[++i]);
                                return -1;
                        }
                        a = atoi(argv[++i]);
@@ -353,28 +295,28 @@ int main(int argc, char **argv)
                        break;
                case 'b':
                        if (argc < i + 2) {
                        break;
                case 'b':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        reclaim_batch = atol(argv[++i]);
                        break;
                case 'c':
                        if (argc < i + 2) {
                                return -1;
                        }
                        reclaim_batch = atol(argv[++i]);
                        break;
                case 'c':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                        break;
                case 'e':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
                                return -1;
                        }
                        wduration = atol(argv[++i]);
@@ -423,13 +365,7 @@ int main(int argc, char **argv)
                        exit(1);
        }
 
                        exit(1);
        }
 
-       cmm_smp_mb();
-
-       test_go = 1;
-
-       sleep(duration);
-
-       test_stop = 1;
+       test_for(duration);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
 
        for (i_thr = 0; i_thr < nr_readers; i_thr++) {
                err = pthread_join(tid_reader[i_thr], &tret);
index 75e6faa3b45c6f005123ae807e7df986ec362147..00de939ffa101c6bca95bd8d71530b5a5640dec4 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_qsbr_timing.c
- *
  * Userspace QSBR - test program
  * Userspace QSBR - test program
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 #include "thread-id.h"
 
 #define _LGPL_SOURCE
 #include "thread-id.h"
 
 #define _LGPL_SOURCE
@@ -39,6 +25,7 @@
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
+static
 void rcu_copy_mutex_lock(void)
 {
        int ret;
 void rcu_copy_mutex_lock(void)
 {
        int ret;
@@ -49,6 +36,7 @@ void rcu_copy_mutex_lock(void)
        }
 }
 
        }
 }
 
+static
 void rcu_copy_mutex_unlock(void)
 {
        int ret;
 void rcu_copy_mutex_unlock(void)
 {
        int ret;
@@ -83,6 +71,7 @@ static int num_write;
 static caa_cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *reader_time;
 static caa_cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *writer_time;
 
 static caa_cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *reader_time;
 static caa_cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *writer_time;
 
+static
 void *thr_reader(void *arg)
 {
        unsigned int i, j;
 void *thr_reader(void *arg)
 {
        unsigned int i, j;
@@ -101,7 +90,7 @@ void *thr_reader(void *arg)
                        _rcu_read_lock();
                        local_ptr = _rcu_dereference(test_rcu_pointer);
                        if (local_ptr) {
                        _rcu_read_lock();
                        local_ptr = _rcu_dereference(test_rcu_pointer);
                        if (local_ptr) {
-                               assert(local_ptr->a == 8);
+                               urcu_posix_assert(local_ptr->a == 8);
                        }
                        _rcu_read_unlock();
                }
                        }
                        _rcu_read_unlock();
                }
@@ -120,6 +109,7 @@ void *thr_reader(void *arg)
 
 }
 
 
 }
 
+static
 void *thr_writer(void *arg)
 {
        unsigned int i, j;
 void *thr_writer(void *arg)
 {
        unsigned int i, j;
@@ -137,7 +127,7 @@ void *thr_writer(void *arg)
                        rcu_copy_mutex_lock();
                        old = test_rcu_pointer;
                        if (old) {
                        rcu_copy_mutex_lock();
                        old = test_rcu_pointer;
                        if (old) {
-                               assert(old->a == 8);
+                               urcu_posix_assert(old->a == 8);
                        }
                        new->a = 8;
                        old = rcu_xchg_pointer(&test_rcu_pointer, new);
                        }
                        new->a = 8;
                        old = rcu_xchg_pointer(&test_rcu_pointer, new);
index b5f3e4a81bb4af0e0f1f97dd8ded9cbc9d6c5434..6ab390d4c5b85c6cb30d5c0f2c8a07189cc4c1be 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu.c
- *
  * Userspace RCU library - test program
  * Userspace RCU library - test program
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 #include <errno.h>
+
 #include <urcu/arch.h>
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 
 #include "thread-id.h"
 
 
 #include "thread-id.h"
 
@@ -39,6 +26,7 @@
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 
 pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
+static
 void rcu_copy_mutex_lock(void)
 {
        int ret;
 void rcu_copy_mutex_lock(void)
 {
        int ret;
@@ -49,6 +37,7 @@ void rcu_copy_mutex_lock(void)
        }
 }
 
        }
 }
 
+static
 void rcu_copy_mutex_unlock(void)
 {
        int ret;
 void rcu_copy_mutex_unlock(void)
 {
        int ret;
@@ -83,6 +72,7 @@ static int num_write;
 static caa_cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *reader_time;
 static caa_cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *writer_time;
 
 static caa_cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *reader_time;
 static caa_cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *writer_time;
 
+static
 void *thr_reader(void *arg)
 {
        unsigned int i, j;
 void *thr_reader(void *arg)
 {
        unsigned int i, j;
@@ -101,7 +91,7 @@ void *thr_reader(void *arg)
                        rcu_read_lock();
                        local_ptr = rcu_dereference(test_rcu_pointer);
                        if (local_ptr) {
                        rcu_read_lock();
                        local_ptr = rcu_dereference(test_rcu_pointer);
                        if (local_ptr) {
-                               assert(local_ptr->a == 8);
+                               urcu_posix_assert(local_ptr->a == 8);
                        }
                        rcu_read_unlock();
                }
                        }
                        rcu_read_unlock();
                }
@@ -119,6 +109,7 @@ void *thr_reader(void *arg)
 
 }
 
 
 }
 
+static
 void *thr_writer(void *arg)
 {
        unsigned int i, j;
 void *thr_writer(void *arg)
 {
        unsigned int i, j;
@@ -136,7 +127,7 @@ void *thr_writer(void *arg)
                        rcu_copy_mutex_lock();
                        old = test_rcu_pointer;
                        if (old) {
                        rcu_copy_mutex_lock();
                        old = test_rcu_pointer;
                        if (old) {
-                               assert(old->a == 8);
+                               urcu_posix_assert(old->a == 8);
                        }
                        new->a = 8;
                        old = rcu_xchg_pointer(&test_rcu_pointer, new);
                        }
                        new->a = 8;
                        old = rcu_xchg_pointer(&test_rcu_pointer, new);
index 6b5e9331ab7ab2b01aaaee9a66a0d25fc5441aa0..71bca100cd45670e15ff452eabfab389b0023d1a 100644 (file)
@@ -1,24 +1,10 @@
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2010 Paolo Bonzini <pbonzini@redhat.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_wfcq.c
- *
  * Userspace RCU library - example RCU-based lock-free concurrent queue
  * Userspace RCU library - example RCU-based lock-free concurrent queue
- *
- * Copyright February 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright February 2010 - Paolo Bonzini <pbonzini@redhat.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 #include <urcu/tls-compat.h>
 #include <urcu/uatomic.h>
 #include <urcu/tls-compat.h>
 #include <urcu/uatomic.h>
-#include "cpuset.h"
 #include "thread-id.h"
 
 /* hardcoded number of CPUs */
 #include "thread-id.h"
 
 /* hardcoded number of CPUs */
@@ -57,7 +42,7 @@ static enum test_sync test_sync;
 
 static int test_force_sync;
 
 
 static int test_force_sync;
 
-static volatile int test_go, test_stop_enqueue, test_stop_dequeue;
+static volatile int test_stop_enqueue, test_stop_dequeue;
 
 static unsigned long rduration;
 
 
 static unsigned long rduration;
 
@@ -91,7 +76,7 @@ pthread_mutex_t affinity_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static void set_affinity(void)
 {
 
 static void set_affinity(void)
 {
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
@@ -99,7 +84,7 @@ static void set_affinity(void)
        if (!use_affinity)
                return;
 
        if (!use_affinity)
                return;
 
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
@@ -114,11 +99,7 @@ static void set_affinity(void)
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       sched_setaffinity(0, &mask);
-#else
        sched_setaffinity(0, sizeof(mask), &mask);
        sched_setaffinity(0, sizeof(mask), &mask);
-#endif
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
@@ -127,12 +108,12 @@ static void set_affinity(void)
  */
 static int test_duration_dequeue(void)
 {
  */
 static int test_duration_dequeue(void)
 {
-       return !test_stop_dequeue;
+       return !uatomic_load(&test_stop_dequeue, CMM_RELAXED);
 }
 
 static int test_duration_enqueue(void)
 {
 }
 
 static int test_duration_enqueue(void)
 {
-       return !test_stop_enqueue;
+       return !uatomic_load(&test_stop_enqueue, CMM_RELAXED);
 }
 
 static DEFINE_URCU_TLS(unsigned long long, nr_dequeues);
 }
 
 static DEFINE_URCU_TLS(unsigned long long, nr_dequeues);
@@ -160,10 +141,7 @@ static void *thr_enqueuer(void *_count)
 
        set_affinity();
 
 
        set_affinity();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                struct cds_wfcq_node *node = malloc(sizeof(*node));
 
        for (;;) {
                struct cds_wfcq_node *node = malloc(sizeof(*node));
@@ -238,7 +216,7 @@ static void do_test_splice(enum test_sync sync)
 
        switch (ret) {
        case CDS_WFCQ_RET_WOULDBLOCK:
 
        switch (ret) {
        case CDS_WFCQ_RET_WOULDBLOCK:
-               assert(0);      /* blocking call */
+               urcu_posix_assert(0);   /* blocking call */
                break;
        case CDS_WFCQ_RET_DEST_EMPTY:
                URCU_TLS(nr_splice)++;
                break;
        case CDS_WFCQ_RET_DEST_EMPTY:
                URCU_TLS(nr_splice)++;
@@ -246,7 +224,7 @@ static void do_test_splice(enum test_sync sync)
                /* ok */
                break;
        case CDS_WFCQ_RET_DEST_NON_EMPTY:
                /* ok */
                break;
        case CDS_WFCQ_RET_DEST_NON_EMPTY:
-               assert(0);      /* entirely unexpected */
+               urcu_posix_assert(0);   /* entirely unexpected */
                break;
        case CDS_WFCQ_RET_SRC_EMPTY:
                /* ok, we could even skip iteration on dest if we wanted */
                break;
        case CDS_WFCQ_RET_SRC_EMPTY:
                /* ok, we could even skip iteration on dest if we wanted */
@@ -271,10 +249,7 @@ static void *thr_dequeuer(void *_count)
 
        set_affinity();
 
 
        set_affinity();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                if (test_dequeue && test_splice) {
 
        for (;;) {
                if (test_dequeue && test_splice) {
@@ -308,8 +283,8 @@ static void *thr_dequeuer(void *_count)
        return ((void*)2);
 }
 
        return ((void*)2);
 }
 
-static void test_end(unsigned long long *nr_dequeues,
-               unsigned long long *nr_dequeue_last)
+static void test_end(unsigned long long *nr_dequeues_l,
+               unsigned long long *nr_dequeue_last_l)
 {
        struct cds_wfcq_node *node;
        int state;
 {
        struct cds_wfcq_node *node;
        int state;
@@ -319,14 +294,14 @@ static void test_end(unsigned long long *nr_dequeues,
                                &state);
                if (node) {
                        if (state & CDS_WFCQ_STATE_LAST)
                                &state);
                if (node) {
                        if (state & CDS_WFCQ_STATE_LAST)
-                               (*nr_dequeue_last)++;
+                               (*nr_dequeue_last_l)++;
                        free(node);
                        free(node);
-                       (*nr_dequeues)++;
+                       (*nr_dequeues_l)++;
                }
        } while (node);
 }
 
                }
        } while (node);
 }
 
-static void show_usage(int argc, char **argv)
+static void show_usage(char **argv)
 {
        printf("Usage : %s nr_dequeuers nr_enqueuers duration (s) <OPTIONS>\n",
                argv[0]);
 {
        printf("Usage : %s nr_dequeuers nr_enqueuers duration (s) <OPTIONS>\n",
                argv[0]);
@@ -360,25 +335,25 @@ int main(int argc, char **argv)
        unsigned int i_thr;
 
        if (argc < 4) {
        unsigned int i_thr;
 
        if (argc < 4) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_dequeuers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_dequeuers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_enqueuers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_enqueuers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
                return -1;
        }
 
@@ -388,7 +363,7 @@ int main(int argc, char **argv)
                switch (argv[i][1]) {
                case 'a':
                        if (argc < i + 2) {
                switch (argv[i][1]) {
                case 'a':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        a = atoi(argv[++i]);
                                return -1;
                        }
                        a = atoi(argv[++i]);
@@ -398,14 +373,14 @@ int main(int argc, char **argv)
                        break;
                case 'c':
                        if (argc < i + 2) {
                        break;
                case 'c':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
@@ -487,7 +462,7 @@ int main(int argc, char **argv)
 
        cmm_smp_mb();
 
 
        cmm_smp_mb();
 
-       test_go = 1;
+       begin_test();
 
        for (i_thr = 0; i_thr < duration; i_thr++) {
                sleep(1);
 
        for (i_thr = 0; i_thr < duration; i_thr++) {
                sleep(1);
@@ -497,7 +472,7 @@ int main(int argc, char **argv)
                }
        }
 
                }
        }
 
-       test_stop_enqueue = 1;
+       uatomic_store(&test_stop_enqueue, 1, CMM_RELEASE);
 
        if (test_wait_empty) {
                while (nr_enqueuers != uatomic_read(&test_enqueue_stopped)) {
 
        if (test_wait_empty) {
                while (nr_enqueuers != uatomic_read(&test_enqueue_stopped)) {
@@ -508,7 +483,7 @@ int main(int argc, char **argv)
                }
        }
 
                }
        }
 
-       test_stop_dequeue = 1;
+       uatomic_store(&test_stop_dequeue, 1, CMM_RELAXED);
 
        for (i_thr = 0; i_thr < nr_enqueuers; i_thr++) {
                err = pthread_join(tid_enqueuer[i_thr], &tret);
 
        for (i_thr = 0; i_thr < nr_enqueuers; i_thr++) {
                err = pthread_join(tid_enqueuer[i_thr], &tret);
index 76821047104a9660edd6cc439ee723f937fe3c21..b17df5ac37787b432c3456a82ecba6b21303e03f 100644 (file)
@@ -1,24 +1,10 @@
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2010 Paolo Bonzini <pbonzini@redhat.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_wfq.c
- *
  * Userspace RCU library - example RCU-based lock-free queue
  * Userspace RCU library - example RCU-based lock-free queue
- *
- * Copyright February 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright February 2010 - Paolo Bonzini <pbonzini@redhat.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 #include <urcu/tls-compat.h>
 #include <urcu/tls-compat.h>
-#include "cpuset.h"
 #include "thread-id.h"
 
 /* hardcoded number of CPUs */
 #include "thread-id.h"
 
 /* hardcoded number of CPUs */
@@ -52,8 +37,6 @@
 #include <urcu.h>
 #include <urcu/wfqueue.h>
 
 #include <urcu.h>
 #include <urcu/wfqueue.h>
 
-static volatile int test_go, test_stop;
-
 static unsigned long rduration;
 
 static unsigned long duration;
 static unsigned long rduration;
 
 static unsigned long duration;
@@ -83,7 +66,7 @@ pthread_mutex_t affinity_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static void set_affinity(void)
 {
 
 static void set_affinity(void)
 {
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
@@ -91,7 +74,7 @@ static void set_affinity(void)
        if (!use_affinity)
                return;
 
        if (!use_affinity)
                return;
 
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
@@ -106,11 +89,7 @@ static void set_affinity(void)
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       sched_setaffinity(0, &mask);
-#else
        sched_setaffinity(0, sizeof(mask), &mask);
        sched_setaffinity(0, sizeof(mask), &mask);
-#endif
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
@@ -119,12 +98,12 @@ static void set_affinity(void)
  */
 static int test_duration_dequeue(void)
 {
  */
 static int test_duration_dequeue(void)
 {
-       return !test_stop;
+       return test_duration_read();
 }
 
 static int test_duration_enqueue(void)
 {
 }
 
 static int test_duration_enqueue(void)
 {
-       return !test_stop;
+       return test_duration_write();
 }
 
 static DEFINE_URCU_TLS(unsigned long long, nr_dequeues);
 }
 
 static DEFINE_URCU_TLS(unsigned long long, nr_dequeues);
@@ -138,6 +117,7 @@ static unsigned int nr_dequeuers;
 
 static struct cds_wfq_queue q;
 
 
 static struct cds_wfq_queue q;
 
+static
 void *thr_enqueuer(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_enqueuer(void *_count)
 {
        unsigned long long *count = _count;
@@ -147,10 +127,7 @@ void *thr_enqueuer(void *_count)
 
        set_affinity();
 
 
        set_affinity();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                struct cds_wfq_node *node = malloc(sizeof(*node));
 
        for (;;) {
                struct cds_wfq_node *node = malloc(sizeof(*node));
@@ -179,6 +156,7 @@ fail:
 
 }
 
 
 }
 
+static
 void *thr_dequeuer(void *_count)
 {
        unsigned long long *count = _count;
 void *thr_dequeuer(void *_count)
 {
        unsigned long long *count = _count;
@@ -188,10 +166,7 @@ void *thr_dequeuer(void *_count)
 
        set_affinity();
 
 
        set_affinity();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                struct cds_wfq_node *node = cds_wfq_dequeue_blocking(&q);
 
        for (;;) {
                struct cds_wfq_node *node = cds_wfq_dequeue_blocking(&q);
@@ -218,20 +193,22 @@ void *thr_dequeuer(void *_count)
        return ((void*)2);
 }
 
        return ((void*)2);
 }
 
-void test_end(struct cds_wfq_queue *q, unsigned long long *nr_dequeues)
+static
+void test_end(unsigned long long *nr_dequeues_l)
 {
        struct cds_wfq_node *node;
 
        do {
 {
        struct cds_wfq_node *node;
 
        do {
-               node = cds_wfq_dequeue_blocking(q);
+               node = cds_wfq_dequeue_blocking(&q);
                if (node) {
                        free(node);
                if (node) {
                        free(node);
-                       (*nr_dequeues)++;
+                       (*nr_dequeues_l)++;
                }
        } while (node);
 }
 
                }
        } while (node);
 }
 
-void show_usage(int argc, char **argv)
+static
+void show_usage(char **argv)
 {
        printf("Usage : %s nr_dequeuers nr_enqueuers duration (s) <OPTIONS>\n",
                argv[0]);
 {
        printf("Usage : %s nr_dequeuers nr_enqueuers duration (s) <OPTIONS>\n",
                argv[0]);
@@ -257,25 +234,25 @@ int main(int argc, char **argv)
        unsigned int i_thr;
 
        if (argc < 4) {
        unsigned int i_thr;
 
        if (argc < 4) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_dequeuers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_dequeuers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_enqueuers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_enqueuers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
                return -1;
        }
 
@@ -285,7 +262,7 @@ int main(int argc, char **argv)
                switch (argv[i][1]) {
                case 'a':
                        if (argc < i + 2) {
                switch (argv[i][1]) {
                case 'a':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        a = atoi(argv[++i]);
                                return -1;
                        }
                        a = atoi(argv[++i]);
@@ -295,14 +272,14 @@ int main(int argc, char **argv)
                        break;
                case 'c':
                        if (argc < i + 2) {
                        break;
                case 'c':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
@@ -344,7 +321,7 @@ int main(int argc, char **argv)
 
        cmm_smp_mb();
 
 
        cmm_smp_mb();
 
-       test_go = 1;
+       begin_test();
 
        for (i_thr = 0; i_thr < duration; i_thr++) {
                sleep(1);
 
        for (i_thr = 0; i_thr < duration; i_thr++) {
                sleep(1);
@@ -354,7 +331,7 @@ int main(int argc, char **argv)
                }
        }
 
                }
        }
 
-       test_stop = 1;
+       end_test();
 
        for (i_thr = 0; i_thr < nr_enqueuers; i_thr++) {
                err = pthread_join(tid_enqueuer[i_thr], &tret);
 
        for (i_thr = 0; i_thr < nr_enqueuers; i_thr++) {
                err = pthread_join(tid_enqueuer[i_thr], &tret);
@@ -371,7 +348,7 @@ int main(int argc, char **argv)
                tot_successful_dequeues += count_dequeuer[2 * i_thr + 1];
        }
 
                tot_successful_dequeues += count_dequeuer[2 * i_thr + 1];
        }
 
-       test_end(&q, &end_dequeues);
+       test_end(&end_dequeues);
 
        printf_verbose("total number of enqueues : %llu, dequeues %llu\n",
                       tot_enqueues, tot_dequeues);
 
        printf_verbose("total number of enqueues : %llu, dequeues %llu\n",
                       tot_enqueues, tot_dequeues);
index 2c82c019577a5454fef2047c1c570b5813d26465..39704f4acb5cce5eee13112fa127d78bea31e6d7 100644 (file)
@@ -1,24 +1,10 @@
-/*
- * test_urcu_wfs.c
- *
+// SPDX-FileCopyrightText: 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2010 Paolo Bonzini <pbonzini@redhat.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+ /*
  * Userspace RCU library - example RCU-based lock-free stack
  * Userspace RCU library - example RCU-based lock-free stack
- *
- * Copyright February 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright February 2010 - Paolo Bonzini <pbonzini@redhat.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
 #include <errno.h>
 
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 #include <urcu/tls-compat.h>
 #include <urcu/uatomic.h>
 #include <urcu/tls-compat.h>
 #include <urcu/uatomic.h>
-#include "cpuset.h"
 #include "thread-id.h"
 
 /* hardcoded number of CPUs */
 #include "thread-id.h"
 
 /* hardcoded number of CPUs */
@@ -60,7 +45,7 @@ static enum test_sync test_sync;
 
 static int test_force_sync;
 
 
 static int test_force_sync;
 
-static volatile int test_go, test_stop_enqueue, test_stop_dequeue;
+static volatile int test_stop_enqueue, test_stop_dequeue;
 
 static unsigned long rduration;
 
 
 static unsigned long rduration;
 
@@ -94,7 +79,7 @@ pthread_mutex_t affinity_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static void set_affinity(void)
 {
 
 static void set_affinity(void)
 {
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
        cpu_set_t mask;
        int cpu, ret;
 #endif /* HAVE_SCHED_SETAFFINITY */
@@ -102,7 +87,7 @@ static void set_affinity(void)
        if (!use_affinity)
                return;
 
        if (!use_affinity)
                return;
 
-#if HAVE_SCHED_SETAFFINITY
+#ifdef HAVE_SCHED_SETAFFINITY
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
        ret = pthread_mutex_lock(&affinity_mutex);
        if (ret) {
                perror("Error in pthread mutex lock");
@@ -117,11 +102,7 @@ static void set_affinity(void)
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       sched_setaffinity(0, &mask);
-#else
        sched_setaffinity(0, sizeof(mask), &mask);
        sched_setaffinity(0, sizeof(mask), &mask);
-#endif
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
 #endif /* HAVE_SCHED_SETAFFINITY */
 }
 
@@ -130,12 +111,12 @@ static void set_affinity(void)
  */
 static int test_duration_dequeue(void)
 {
  */
 static int test_duration_dequeue(void)
 {
-       return !test_stop_dequeue;
+       return !uatomic_load(&test_stop_dequeue, CMM_RELAXED);
 }
 
 static int test_duration_enqueue(void)
 {
 }
 
 static int test_duration_enqueue(void)
 {
-       return !test_stop_enqueue;
+       return !uatomic_load(&test_stop_enqueue, CMM_RELAXED);
 }
 
 static DEFINE_URCU_TLS(unsigned long long, nr_dequeues);
 }
 
 static DEFINE_URCU_TLS(unsigned long long, nr_dequeues);
@@ -162,10 +143,7 @@ static void *thr_enqueuer(void *_count)
 
        set_affinity();
 
 
        set_affinity();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
        for (;;) {
                struct cds_wfs_node *node = malloc(sizeof(*node));
 
        for (;;) {
                struct cds_wfs_node *node = malloc(sizeof(*node));
@@ -255,12 +233,9 @@ static void *thr_dequeuer(void *_count)
 
        set_affinity();
 
 
        set_affinity();
 
-       while (!test_go)
-       {
-       }
-       cmm_smp_mb();
+       wait_until_go();
 
 
-       assert(test_pop || test_pop_all);
+       urcu_posix_assert(test_pop || test_pop_all);
 
        for (;;) {
                if (test_pop && test_pop_all) {
 
        for (;;) {
                if (test_pop && test_pop_all) {
@@ -296,24 +271,24 @@ static void *thr_dequeuer(void *_count)
        return ((void*)2);
 }
 
        return ((void*)2);
 }
 
-static void test_end(struct cds_wfs_stack *s, unsigned long long *nr_dequeues,
-               unsigned long long *nr_pop_last)
+static void test_end(unsigned long long *nr_dequeues_l,
+               unsigned long long *nr_pop_last_l)
 {
        struct cds_wfs_node *node;
        int state;
 
        do {
 {
        struct cds_wfs_node *node;
        int state;
 
        do {
-               node = cds_wfs_pop_with_state_blocking(s, &state);
+               node = cds_wfs_pop_with_state_blocking(&s, &state);
                if (node) {
                        if (state & CDS_WFS_STATE_LAST)
                if (node) {
                        if (state & CDS_WFS_STATE_LAST)
-                               (*nr_pop_last)++;
+                               (*nr_pop_last_l)++;
                        free(node);
                        free(node);
-                       (*nr_dequeues)++;
+                       (*nr_dequeues_l)++;
                }
        } while (node);
 }
 
                }
        } while (node);
 }
 
-static void show_usage(int argc, char **argv)
+static void show_usage(char **argv)
 {
        printf("Usage : %s nr_dequeuers nr_enqueuers duration (s) <OPTIONS>\n",
                argv[0]);
 {
        printf("Usage : %s nr_dequeuers nr_enqueuers duration (s) <OPTIONS>\n",
                argv[0]);
@@ -347,25 +322,25 @@ int main(int argc, char **argv)
        unsigned int i_thr;
 
        if (argc < 4) {
        unsigned int i_thr;
 
        if (argc < 4) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_dequeuers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[1], "%u", &nr_dequeuers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_enqueuers);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[2], "%u", &nr_enqueuers);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
                return -1;
        }
 
        err = sscanf(argv[3], "%lu", &duration);
        if (err != 1) {
-               show_usage(argc, argv);
+               show_usage(argv);
                return -1;
        }
 
                return -1;
        }
 
@@ -375,7 +350,7 @@ int main(int argc, char **argv)
                switch (argv[i][1]) {
                case 'a':
                        if (argc < i + 2) {
                switch (argv[i][1]) {
                case 'a':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        a = atoi(argv[++i]);
                                return -1;
                        }
                        a = atoi(argv[++i]);
@@ -385,14 +360,14 @@ int main(int argc, char **argv)
                        break;
                case 'c':
                        if (argc < i + 2) {
                        break;
                case 'c':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
                                return -1;
                        }
                        rduration = atol(argv[++i]);
                        break;
                case 'd':
                        if (argc < i + 2) {
-                               show_usage(argc, argv);
+                               show_usage(argv);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
                                return -1;
                        }
                        wdelay = atol(argv[++i]);
@@ -474,7 +449,7 @@ int main(int argc, char **argv)
 
        cmm_smp_mb();
 
 
        cmm_smp_mb();
 
-       test_go = 1;
+       begin_test();
 
        for (i_thr = 0; i_thr < duration; i_thr++) {
                sleep(1);
 
        for (i_thr = 0; i_thr < duration; i_thr++) {
                sleep(1);
@@ -484,7 +459,7 @@ int main(int argc, char **argv)
                }
        }
 
                }
        }
 
-       test_stop_enqueue = 1;
+       uatomic_store(&test_stop_enqueue, 1, CMM_RELEASE);
 
        if (test_wait_empty) {
                while (nr_enqueuers != uatomic_read(&test_enqueue_stopped)) {
 
        if (test_wait_empty) {
                while (nr_enqueuers != uatomic_read(&test_enqueue_stopped)) {
@@ -495,7 +470,7 @@ int main(int argc, char **argv)
                }
        }
 
                }
        }
 
-       test_stop_dequeue = 1;
+       uatomic_store(&test_stop_dequeue, 1, CMM_RELAXED);
 
        for (i_thr = 0; i_thr < nr_enqueuers; i_thr++) {
                err = pthread_join(tid_enqueuer[i_thr], &tret);
 
        for (i_thr = 0; i_thr < nr_enqueuers; i_thr++) {
                err = pthread_join(tid_enqueuer[i_thr], &tret);
@@ -515,7 +490,7 @@ int main(int argc, char **argv)
                tot_pop_last += count_dequeuer[4 * i_thr + 3];
        }
 
                tot_pop_last += count_dequeuer[4 * i_thr + 3];
        }
 
-       test_end(&s, &end_dequeues, &tot_pop_last);
+       test_end(&end_dequeues, &tot_pop_last);
 
        printf_verbose("total number of enqueues : %llu, dequeues %llu\n",
                       tot_enqueues, tot_dequeues);
 
        printf_verbose("total number of enqueues : %llu, dequeues %llu\n",
                       tot_enqueues, tot_dequeues);
index 8553ed925a9cfca8d7699fea1bc752e41ee55ac1..8d229bfbb365193e8661f8942b15b8e2e85690ed 100755 (executable)
@@ -1 +1,18 @@
-./run-urcu-tests.sh 1
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"$URCU_TESTS_SRCDIR/benchmark/run-urcu-tests.sh" 1
index 5c13dd9d90f8beb0c285a97e7204c6b0f74f1ffc..da8aae1c5d3154ee90f5f96f3914843eaa4da038 100755 (executable)
@@ -1 +1,18 @@
-./run-urcu-tests.sh 30
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"$URCU_TESTS_SRCDIR/benchmark/run-urcu-tests.sh" 30
index 51f4412ed418aeefa585fd4ac783022cc7750368..0ec6ebb508d7e15baa58c5afa362c85b0f204996 100755 (executable)
@@ -1 +1,18 @@
-./run-urcu-tests.sh 3
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"$URCU_TESTS_SRCDIR/benchmark/run-urcu-tests.sh" 3
index 5935098f1d8b9dfb6b21fa5bc9ed1a12209f884d..af6d89f5c9c3f66f851d69c6d73924f22196033f 100644 (file)
@@ -1,9 +1,14 @@
-AM_CPPFLAGS += -I$(top_srcdir)/include -I$(top_builddir)/include -I$(top_srcdir)/src
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
 
 
-noinst_HEADERS = cpuset.h thread-id.h
+AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/tests/common
+
+noinst_HEADERS = \
+       api.h \
+       compat-rand.h \
+       thread-id.h
 
 noinst_LTLIBRARIES = libdebug-yield.la
 
 libdebug_yield_la_SOURCES = debug-yield.c debug-yield.h
 
 noinst_LTLIBRARIES = libdebug-yield.la
 
 libdebug_yield_la_SOURCES = debug-yield.c debug-yield.h
-
-EXTRA_DIST = api.h
index 2b72ec5a485cd028cbe0c8f217047f61b84e1754..ec3ce1ef7486251ec0321d0c65d18aa761816af4 100644 (file)
@@ -1,32 +1,20 @@
+// SPDX-FileCopyrightText: 2006 Paul E. McKenney, IBM.
+//
+// SPDX-License-Identifier: GPL-2.0-only
+
 #ifndef _INCLUDE_API_H
 #define _INCLUDE_API_H
 
 /*
  * common.h: Common Linux kernel-isms.
  *
 #ifndef _INCLUDE_API_H
 #define _INCLUDE_API_H
 
 /*
  * common.h: Common Linux kernel-isms.
  *
- * 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; but version 2 of the License only due
- * to code included from the Linux kernel.
- *
- * 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.
- *
- * Copyright (c) 2006 Paul E. McKenney, IBM.
- *
  * Much code taken from the Linux kernel.  For such code, the option
  * to redistribute under later versions of GPL might not be available.
  */
 
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
  * Much code taken from the Linux kernel.  For such code, the option
  * to redistribute under later versions of GPL might not be available.
  */
 
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
-#include "cpuset.h"
+#include <urcu/uatomic.h>
 
 /*
  * Machine parameters.
 
 /*
  * Machine parameters.
 #define ____cacheline_internodealigned_in_smp \
        __attribute__((__aligned__(CAA_CACHE_LINE_SIZE)))
 
 #define ____cacheline_internodealigned_in_smp \
        __attribute__((__aligned__(CAA_CACHE_LINE_SIZE)))
 
-/*
- * api_pthreads.h: API mapping to pthreads environment.
- *
- * 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.  However, please note that much
- * of the code in this file derives from the Linux kernel, and that such
- * code may not be available except under GPLv2.
- *
- * 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.
- *
- * Copyright (c) 2006 Paul E. McKenney, IBM.
- */
 
 #include <stdio.h>
 #include <stdlib.h>
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -108,7 +75,7 @@ static void spin_unlock(spinlock_t *sp)
 
 typedef pthread_t thread_id_t;
 
 
 typedef pthread_t thread_id_t;
 
-#define NR_THREADS 128
+#define NR_THREADS 4096
 
 #define __THREAD_ID_MAP_EMPTY ((thread_id_t) 0)
 #define __THREAD_ID_MAP_WAITING ((thread_id_t) 1)
 
 #define __THREAD_ID_MAP_EMPTY ((thread_id_t) 0)
 #define __THREAD_ID_MAP_WAITING ((thread_id_t) 1)
@@ -136,7 +103,7 @@ static int __smp_thread_id(void)
        thread_id_t tid = pthread_self();
 
        for (i = 0; i < NR_THREADS; i++) {
        thread_id_t tid = pthread_self();
 
        for (i = 0; i < NR_THREADS; i++) {
-               if (__thread_id_map[i] == tid) {
+               if (uatomic_read(&__thread_id_map[i]) == tid) {
                        long v = i + 1;  /* must be non-NULL. */
 
                        if (pthread_setspecific(thread_id_key, (void *)v) != 0) {
                        long v = i + 1;  /* must be non-NULL. */
 
                        if (pthread_setspecific(thread_id_key, (void *)v) != 0) {
@@ -166,7 +133,7 @@ static int smp_thread_id(void)
        id = pthread_getspecific(thread_id_key);
        if (id == NULL)
                return __smp_thread_id();
        id = pthread_getspecific(thread_id_key);
        if (id == NULL)
                return __smp_thread_id();
-       return (long)(id - 1);
+       return ((long) id - 1);
 }
 
 static thread_id_t create_thread(void *(*func)(void *), void *arg)
 }
 
 static thread_id_t create_thread(void *(*func)(void *), void *arg)
@@ -185,12 +152,13 @@ static thread_id_t create_thread(void *(*func)(void *), void *arg)
                exit(-1);
        }
        __thread_id_map[i] = __THREAD_ID_MAP_WAITING;
                exit(-1);
        }
        __thread_id_map[i] = __THREAD_ID_MAP_WAITING;
-       spin_unlock(&__thread_id_map_mutex);
+
        if (pthread_create(&tid, NULL, func, arg) != 0) {
                perror("create_thread:pthread_create");
                exit(-1);
        }
        if (pthread_create(&tid, NULL, func, arg) != 0) {
                perror("create_thread:pthread_create");
                exit(-1);
        }
-       __thread_id_map[i] = tid;
+       uatomic_set(&__thread_id_map[i], tid);
+       spin_unlock(&__thread_id_map_mutex);
        return tid;
 }
 
        return tid;
 }
 
@@ -200,7 +168,7 @@ static void *wait_thread(thread_id_t tid)
        void *vp;
 
        for (i = 0; i < NR_THREADS; i++) {
        void *vp;
 
        for (i = 0; i < NR_THREADS; i++) {
-               if (__thread_id_map[i] == tid)
+               if (uatomic_read(&__thread_id_map[i]) == tid)
                        break;
        }
        if (i >= NR_THREADS){
                        break;
        }
        if (i >= NR_THREADS){
@@ -212,7 +180,7 @@ static void *wait_thread(thread_id_t tid)
                perror("wait_thread:pthread_join");
                exit(-1);
        }
                perror("wait_thread:pthread_join");
                exit(-1);
        }
-       __thread_id_map[i] = __THREAD_ID_MAP_EMPTY;
+       uatomic_set(&__thread_id_map[i], __THREAD_ID_MAP_EMPTY);
        return vp;
 }
 
        return vp;
 }
 
@@ -229,25 +197,26 @@ static void wait_all_threads(void)
        }
 }
 
        }
 }
 
+#ifdef HAVE_SCHED_SETAFFINITY
 static void run_on(int cpu)
 {
 static void run_on(int cpu)
 {
-#if HAVE_SCHED_SETAFFINITY
        cpu_set_t mask;
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
        cpu_set_t mask;
 
        CPU_ZERO(&mask);
        CPU_SET(cpu, &mask);
-#if SCHED_SETAFFINITY_ARGS == 2
-       sched_setaffinity(0, &mask);
-#else
        sched_setaffinity(0, sizeof(mask), &mask);
        sched_setaffinity(0, sizeof(mask), &mask);
-#endif
-#endif /* HAVE_SCHED_SETAFFINITY */
 }
 }
+#else
+
+static void run_on(int cpu __attribute__((unused)))
+{}
+#endif /* HAVE_SCHED_SETAFFINITY */
 
 /*
  * timekeeping -- very crude -- should use MONOTONIC...
  */
 
 
 /*
  * timekeeping -- very crude -- should use MONOTONIC...
  */
 
+static inline
 long long get_microseconds(void)
 {
        struct timeval tv;
 long long get_microseconds(void)
 {
        struct timeval tv;
diff --git a/tests/common/compat-rand.h b/tests/common/compat-rand.h
new file mode 100644 (file)
index 0000000..42fbb30
--- /dev/null
@@ -0,0 +1,49 @@
+// SPDX-FileCopyrightText: 1996 Ulrich Drepper <drepper@cygnus.com>
+// SPDX-FileCopyrightText: 2013 Pierre-Luc St-Charles <pierre-luc.st-charles@polymtl.ca>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+#ifndef _COMPAT_RAND_H
+#define _COMPAT_RAND_H
+
+/*
+ * Userspace RCU library - rand/rand_r Compatibility Header
+ *
+ * Note: this file is only used to simplify the code required to
+ * use the 'rand_r(...)' system function across multiple platforms,
+ * which might not always be referenced the same way.
+ */
+
+#ifndef HAVE_RAND_R
+/*
+ * Reentrant random function from POSIX.1c.
+ * Copyright (C) 1996, 1999 Free Software Foundation, Inc.
+ * This file is part of the GNU C Library.
+ * Contributed by Ulrich Drepper <drepper@cygnus.com <mailto:drepper@cygnus.com>>, 1996.
+ */
+static inline int rand_r(unsigned int *seed)
+{
+       unsigned int next = *seed;
+       int result;
+
+       next *= 1103515245;
+       next += 12345;
+       result = (unsigned int) (next / 65536) % 2048;
+
+       next *= 1103515245;
+       next += 12345;
+       result <<= 10;
+       result ^= (unsigned int) (next / 65536) % 1024;
+
+       next *= 1103515245;
+       next += 12345;
+       result <<= 10;
+       result ^= (unsigned int) (next / 65536) % 1024;
+
+       *seed = next;
+
+       return result;
+}
+#endif /* HAVE_RAND_R */
+
+#endif /* _COMPAT_RAND_H */
diff --git a/tests/common/cpuset.h b/tests/common/cpuset.h
deleted file mode 100644 (file)
index 3c23d04..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-#ifndef _URCU_TESTS_CPUSET_H
-#define _URCU_TESTS_CPUSET_H
-
-/*
- * cpuset.h
- *
- * Userspace RCU library - test cpuset header
- *
- * Copyright 2009-2013 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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.
- */
-
-#if defined(HAVE_SCHED_SETAFFINITY) || defined(HAVE_CPU_SET_T) \
-               || defined(HAVE_CPU_ZERO) || defined(HAVE_CPU_SET)
-# include <sched.h>
-#endif
-
-#ifndef HAVE_CPU_SET_T
-typedef unsigned long cpu_set_t;
-#endif
-
-#ifndef HAVE_CPU_ZERO
-# define CPU_ZERO(cpuset) do { *(cpuset) = 0; } while(0)
-#endif
-
-#ifndef HAVE_CPU_SET
-# define CPU_SET(cpu, cpuset) do { *(cpuset) |= (1UL << (cpu)); } while(0)
-#endif
-
-#endif /* _URCU_TESTS_CPUSET_H */
index 8f06a9ddea0a7fb19facc24d86e6bd504c43014d..16205a415aa85339695da61f114292403b98c927 100644 (file)
@@ -1,25 +1,11 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 /*
 /*
- * debug-yield.c
- *
  * Userspace RCU library tests - Debugging code
  *
  * Userspace RCU library tests - Debugging code
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
index b48561c4589fdc82e1e79aaaa107cfb999d10756..7d4f62ac7e6047d88bc4b6af16195eab7867eba8 100644 (file)
@@ -1,28 +1,14 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+// SPDX-FileCopyrightText: 2009 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
 #ifndef URCU_TESTS_DEBUG_YIELD_H
 #define URCU_TESTS_DEBUG_YIELD_H
 
 /*
 #ifndef URCU_TESTS_DEBUG_YIELD_H
 #define URCU_TESTS_DEBUG_YIELD_H
 
 /*
- * debug-yield.h
- *
  * Userspace RCU library tests - Debugging header
  *
  * Userspace RCU library tests - Debugging header
  *
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
  * IBM's contributions to this file may be relicensed under LGPLv2 or later.
  */
 
 #define RCU_YIELD_READ         (1 << 0)
 #define RCU_YIELD_WRITE        (1 << 1)
 
 #define RCU_YIELD_READ         (1 << 0)
 #define RCU_YIELD_WRITE        (1 << 1)
 
-/*
- * Updates with RCU_SIGNAL are much slower. Account this in the delay.
- */
-#ifdef RCU_SIGNAL
-/* maximum sleep delay, in us */
-#define MAX_SLEEP 30000
-#else
 #define MAX_SLEEP 50
 #define MAX_SLEEP 50
-#endif
 
 extern unsigned int rcu_yield_active;
 extern DECLARE_URCU_TLS(unsigned int, rcu_rand_yield);
 
 extern unsigned int rcu_yield_active;
 extern DECLARE_URCU_TLS(unsigned int, rcu_rand_yield);
@@ -87,11 +65,13 @@ static inline void rcu_debug_yield_write(void)
 {
 }
 
 {
 }
 
-static inline void rcu_debug_yield_enable(unsigned int flags)
+static inline void rcu_debug_yield_enable(
+               unsigned int flags __attribute__((unused)))
 {
 }
 
 {
 }
 
-static inline void rcu_debug_yield_disable(unsigned int flags)
+static inline void rcu_debug_yield_disable(
+               unsigned int flags __attribute__((unused)))
 {
 }
 
 {
 }
 
index cb0d903748b1d0ddf2fd6b7c8a219d10f917896c..575acaf9f81c6e5bda1a2de2c5b674b4e7f7e8d2 100644 (file)
@@ -1,21 +1,12 @@
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LicenseRef-Boehm-GC
+
 #ifndef _TEST_THREAD_ID_H
 #define _TEST_THREAD_ID_H
 
 /*
 #ifndef _TEST_THREAD_ID_H
 #define _TEST_THREAD_ID_H
 
 /*
- * thread-id.h
- *
  * Userspace RCU library - thread ID
  * Userspace RCU library - thread ID
- *
- * Copyright 2013 - Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
- *
- * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
- * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
- *
- * Permission is hereby granted to use or copy this program
- * for any purpose,  provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is granted,
- * provided the above notices are retained, and a notice that the code was
- * modified is included with the above copyright notice.
  */
 
 #ifdef __linux__
  */
 
 #ifdef __linux__
@@ -68,7 +59,14 @@ unsigned long urcu_get_thread_id(void)
        pthread_t thr = pthread_self();
        return pthread_getsequence_np(&thr);
 }
        pthread_t thr = pthread_self();
        return pthread_getsequence_np(&thr);
 }
+#elif defined(__OpenBSD__)
+#include <unistd.h>
 
 
+static inline
+unsigned long urcu_get_thread_id(void)
+{
+       return (unsigned long) getthrid();
+}
 #else
 # warning "use pid as thread ID"
 static inline
 #else
 # warning "use pid as thread ID"
 static inline
index 183fefe368fa1eb9e84f954e3ef792338f281c3d..93c35efbeb82fb323d9411d87ef2ebe2278c3060 100644 (file)
@@ -1,16 +1,27 @@
-AM_CFLAGS += -I$(top_srcdir)/include -I$(top_builddir)/include -I$(top_srcdir)/src -I$(top_srcdir)/tests/utils -I$(top_srcdir)/tests/common -g
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
+
+AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/tests/utils -I$(top_srcdir)/tests/common
 
 TEST_EXTENSIONS = .tap
 TAP_LOG_DRIVER_FLAGS = --merge --comments
 
 TEST_EXTENSIONS = .tap
 TAP_LOG_DRIVER_FLAGS = --merge --comments
-TAP_LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \
-       $(top_srcdir)/config/tap-driver.sh
+TAP_LOG_DRIVER = env AM_TAP_AWK='$(AWK)' \
+       URCU_TESTS_SRCDIR='$(abs_top_srcdir)/tests' \
+       URCU_TESTS_BUILDDIR='$(abs_top_builddir)/tests' \
+       $(SHELL) $(top_srcdir)/tests/utils/tap-driver.sh
 
 
-noinst_PROGRAMS = test_urcu_fork.tap \
+noinst_PROGRAMS = \
+       test_urcu_fork.tap \
+       test_urcu_fork_cxx.tap \
        rcutorture_urcu_membarrier \
        rcutorture_urcu_membarrier \
-       rcutorture_urcu_signal \
+       rcutorture_urcu_membarrier_cxx \
        rcutorture_urcu_mb \
        rcutorture_urcu_mb \
+       rcutorture_urcu_mb_cxx \
        rcutorture_urcu_bp \
        rcutorture_urcu_bp \
-       rcutorture_urcu_qsbr
+       rcutorture_urcu_bp_cxx \
+       rcutorture_urcu_qsbr \
+       rcutorture_urcu_qsbr_cxx
 
 noinst_HEADERS = rcutorture.h
 
 
 noinst_HEADERS = rcutorture.h
 
@@ -18,7 +29,6 @@ URCU_COMMON_LIB=$(top_builddir)/src/liburcu-common.la
 URCU_LIB=$(top_builddir)/src/liburcu.la
 URCU_QSBR_LIB=$(top_builddir)/src/liburcu-qsbr.la
 URCU_MB_LIB=$(top_builddir)/src/liburcu-mb.la
 URCU_LIB=$(top_builddir)/src/liburcu.la
 URCU_QSBR_LIB=$(top_builddir)/src/liburcu-qsbr.la
 URCU_MB_LIB=$(top_builddir)/src/liburcu-mb.la
-URCU_SIGNAL_LIB=$(top_builddir)/src/liburcu-signal.la
 URCU_BP_LIB=$(top_builddir)/src/liburcu-bp.la
 URCU_CDS_LIB=$(top_builddir)/src/liburcu-cds.la
 TAP_LIB=$(top_builddir)/tests/utils/libtap.a
 URCU_BP_LIB=$(top_builddir)/src/liburcu-bp.la
 URCU_CDS_LIB=$(top_builddir)/src/liburcu-cds.la
 TAP_LIB=$(top_builddir)/tests/utils/libtap.a
@@ -26,95 +36,246 @@ TAP_LIB=$(top_builddir)/tests/utils/libtap.a
 test_urcu_fork_tap_SOURCES = test_urcu_fork.c
 test_urcu_fork_tap_LDADD = $(URCU_LIB) $(TAP_LIB)
 
 test_urcu_fork_tap_SOURCES = test_urcu_fork.c
 test_urcu_fork_tap_LDADD = $(URCU_LIB) $(TAP_LIB)
 
+test_urcu_fork_cxx_tap_SOURCES = test_urcu_fork_cxx.cpp
+test_urcu_fork_cxx_tap_LDADD = $(URCU_LIB) $(TAP_LIB)
+
 rcutorture_urcu_membarrier_SOURCES = urcutorture.c
 rcutorture_urcu_membarrier_CFLAGS = -DRCU_MEMBARRIER $(AM_CFLAGS)
 rcutorture_urcu_membarrier_LDADD = $(URCU_LIB) $(TAP_LIB)
 
 rcutorture_urcu_membarrier_SOURCES = urcutorture.c
 rcutorture_urcu_membarrier_CFLAGS = -DRCU_MEMBARRIER $(AM_CFLAGS)
 rcutorture_urcu_membarrier_LDADD = $(URCU_LIB) $(TAP_LIB)
 
+rcutorture_urcu_membarrier_cxx_SOURCES = urcutorture_cxx.cpp
+rcutorture_urcu_membarrier_cxx_CXXFLAGS = -DRCU_MEMBARRIER $(AM_CXXFLAGS)
+rcutorture_urcu_membarrier_cxx_LDADD = $(URCU_LIB) $(TAP_LIB)
+
 rcutorture_urcu_mb_SOURCES = urcutorture.c
 rcutorture_urcu_mb_CFLAGS = -DRCU_MB $(AM_CFLAGS)
 rcutorture_urcu_mb_LDADD = $(URCU_MB_LIB)  $(TAP_LIB)
 
 rcutorture_urcu_mb_SOURCES = urcutorture.c
 rcutorture_urcu_mb_CFLAGS = -DRCU_MB $(AM_CFLAGS)
 rcutorture_urcu_mb_LDADD = $(URCU_MB_LIB)  $(TAP_LIB)
 
+rcutorture_urcu_mb_cxx_SOURCES = urcutorture_cxx.cpp
+rcutorture_urcu_mb_cxx_CXXFLAGS = -DRCU_MB $(AM_CXXFLAGS)
+rcutorture_urcu_mb_cxx_LDADD = $(URCU_MB_LIB)  $(TAP_LIB)
+
 rcutorture_urcu_qsbr_SOURCES = urcutorture.c
 rcutorture_urcu_qsbr_CFLAGS = -DTORTURE_QSBR -DRCU_QSBR $(AM_CFLAGS)
 rcutorture_urcu_qsbr_LDADD = $(URCU_QSBR_LIB) $(TAP_LIB)
 
 rcutorture_urcu_qsbr_SOURCES = urcutorture.c
 rcutorture_urcu_qsbr_CFLAGS = -DTORTURE_QSBR -DRCU_QSBR $(AM_CFLAGS)
 rcutorture_urcu_qsbr_LDADD = $(URCU_QSBR_LIB) $(TAP_LIB)
 
-rcutorture_urcu_signal_SOURCES = urcutorture.c
-rcutorture_urcu_signal_CFLAGS = -DRCU_SIGNAL $(AM_CFLAGS)
-rcutorture_urcu_signal_LDADD = $(URCU_SIGNAL_LIB) $(TAP_LIB)
+rcutorture_urcu_qsbr_cxx_SOURCES = urcutorture_cxx.cpp
+rcutorture_urcu_qsbr_cxx_CXXFLAGS = -DTORTURE_QSBR -DRCU_QSBR $(AM_CXXFLAGS)
+rcutorture_urcu_qsbr_cxx_LDADD = $(URCU_QSBR_LIB) $(TAP_LIB)
 
 rcutorture_urcu_bp_SOURCES = urcutorture.c
 rcutorture_urcu_bp_CFLAGS = -DRCU_BP $(AM_CFLAGS)
 rcutorture_urcu_bp_LDADD = $(URCU_BP_LIB) $(TAP_LIB)
 
 
 rcutorture_urcu_bp_SOURCES = urcutorture.c
 rcutorture_urcu_bp_CFLAGS = -DRCU_BP $(AM_CFLAGS)
 rcutorture_urcu_bp_LDADD = $(URCU_BP_LIB) $(TAP_LIB)
 
+rcutorture_urcu_bp_cxx_SOURCES = urcutorture_cxx.cpp
+rcutorture_urcu_bp_cxx_CXXFLAGS = -DRCU_BP $(AM_CXXFLAGS)
+rcutorture_urcu_bp_cxx_LDADD = $(URCU_BP_LIB) $(TAP_LIB)
+
 urcutorture.c: ../common/api.h
 
 urcutorture.c: ../common/api.h
 
+dist_check_SCRIPTS = \
+       test_rcutorture_urcu_bp_perf_global.tap \
+       test_rcutorture_urcu_bp_perf_global_cxx.tap \
+       test_rcutorture_urcu_bp_perf_percpu.tap \
+       test_rcutorture_urcu_bp_perf_percpu_cxx.tap \
+       test_rcutorture_urcu_bp_perf_perthread.tap \
+       test_rcutorture_urcu_bp_perf_perthread_cxx.tap \
+       test_rcutorture_urcu_bp_rperf_global.tap \
+       test_rcutorture_urcu_bp_rperf_global_cxx.tap \
+       test_rcutorture_urcu_bp_rperf_percpu.tap \
+       test_rcutorture_urcu_bp_rperf_percpu_cxx.tap \
+       test_rcutorture_urcu_bp_rperf_perthread.tap \
+       test_rcutorture_urcu_bp_rperf_perthread_cxx.tap \
+       test_rcutorture_urcu_bp_stress_global.tap \
+       test_rcutorture_urcu_bp_stress_global_cxx.tap \
+       test_rcutorture_urcu_bp_stress_percpu.tap \
+       test_rcutorture_urcu_bp_stress_percpu_cxx.tap \
+       test_rcutorture_urcu_bp_stress_perthread.tap \
+       test_rcutorture_urcu_bp_stress_perthread_cxx.tap \
+       test_rcutorture_urcu_bp_uperf_global.tap \
+       test_rcutorture_urcu_bp_uperf_global_cxx.tap \
+       test_rcutorture_urcu_bp_uperf_percpu.tap \
+       test_rcutorture_urcu_bp_uperf_percpu_cxx.tap \
+       test_rcutorture_urcu_bp_uperf_perthread.tap \
+       test_rcutorture_urcu_bp_uperf_perthread_cxx.tap \
+       test_rcutorture_urcu_mb_perf_global.tap \
+       test_rcutorture_urcu_mb_perf_global_cxx.tap \
+       test_rcutorture_urcu_mb_perf_percpu.tap \
+       test_rcutorture_urcu_mb_perf_percpu_cxx.tap \
+       test_rcutorture_urcu_mb_perf_perthread.tap \
+       test_rcutorture_urcu_mb_perf_perthread_cxx.tap \
+       test_rcutorture_urcu_mb_rperf_global.tap \
+       test_rcutorture_urcu_mb_rperf_global_cxx.tap \
+       test_rcutorture_urcu_mb_rperf_percpu.tap \
+       test_rcutorture_urcu_mb_rperf_percpu_cxx.tap \
+       test_rcutorture_urcu_mb_rperf_perthread.tap \
+       test_rcutorture_urcu_mb_rperf_perthread_cxx.tap \
+       test_rcutorture_urcu_mb_stress_global.tap \
+       test_rcutorture_urcu_mb_stress_global_cxx.tap \
+       test_rcutorture_urcu_mb_stress_percpu.tap \
+       test_rcutorture_urcu_mb_stress_percpu_cxx.tap \
+       test_rcutorture_urcu_mb_stress_perthread.tap \
+       test_rcutorture_urcu_mb_stress_perthread_cxx.tap \
+       test_rcutorture_urcu_mb_uperf_global.tap \
+       test_rcutorture_urcu_mb_uperf_global_cxx.tap \
+       test_rcutorture_urcu_mb_uperf_percpu.tap \
+       test_rcutorture_urcu_mb_uperf_percpu_cxx.tap \
+       test_rcutorture_urcu_mb_uperf_perthread.tap \
+       test_rcutorture_urcu_mb_uperf_perthread_cxx.tap \
+       test_rcutorture_urcu_membarrier_perf_global.tap \
+       test_rcutorture_urcu_membarrier_perf_global_cxx.tap \
+       test_rcutorture_urcu_membarrier_perf_percpu.tap \
+       test_rcutorture_urcu_membarrier_perf_percpu_cxx.tap \
+       test_rcutorture_urcu_membarrier_perf_perthread.tap \
+       test_rcutorture_urcu_membarrier_perf_perthread_cxx.tap \
+       test_rcutorture_urcu_membarrier_rperf_global.tap \
+       test_rcutorture_urcu_membarrier_rperf_global_cxx.tap \
+       test_rcutorture_urcu_membarrier_rperf_percpu.tap \
+       test_rcutorture_urcu_membarrier_rperf_percpu_cxx.tap \
+       test_rcutorture_urcu_membarrier_rperf_perthread.tap \
+       test_rcutorture_urcu_membarrier_rperf_perthread_cxx.tap \
+       test_rcutorture_urcu_membarrier_stress_global.tap \
+       test_rcutorture_urcu_membarrier_stress_global_cxx.tap \
+       test_rcutorture_urcu_membarrier_stress_percpu.tap \
+       test_rcutorture_urcu_membarrier_stress_percpu_cxx.tap \
+       test_rcutorture_urcu_membarrier_stress_perthread.tap \
+       test_rcutorture_urcu_membarrier_stress_perthread_cxx.tap \
+       test_rcutorture_urcu_membarrier_uperf_global.tap \
+       test_rcutorture_urcu_membarrier_uperf_global_cxx.tap \
+       test_rcutorture_urcu_membarrier_uperf_percpu.tap \
+       test_rcutorture_urcu_membarrier_uperf_percpu_cxx.tap \
+       test_rcutorture_urcu_membarrier_uperf_perthread.tap \
+       test_rcutorture_urcu_membarrier_uperf_perthread_cxx.tap \
+       test_rcutorture_urcu_qsbr_perf_global.tap \
+       test_rcutorture_urcu_qsbr_perf_global_cxx.tap \
+       test_rcutorture_urcu_qsbr_perf_percpu.tap \
+       test_rcutorture_urcu_qsbr_perf_percpu_cxx.tap \
+       test_rcutorture_urcu_qsbr_perf_perthread.tap \
+       test_rcutorture_urcu_qsbr_perf_perthread_cxx.tap \
+       test_rcutorture_urcu_qsbr_rperf_global.tap \
+       test_rcutorture_urcu_qsbr_rperf_global_cxx.tap \
+       test_rcutorture_urcu_qsbr_rperf_percpu.tap \
+       test_rcutorture_urcu_qsbr_rperf_percpu_cxx.tap \
+       test_rcutorture_urcu_qsbr_rperf_perthread.tap \
+       test_rcutorture_urcu_qsbr_rperf_perthread_cxx.tap \
+       test_rcutorture_urcu_qsbr_stress_global.tap \
+       test_rcutorture_urcu_qsbr_stress_global_cxx.tap \
+       test_rcutorture_urcu_qsbr_stress_percpu.tap \
+       test_rcutorture_urcu_qsbr_stress_percpu_cxx.tap \
+       test_rcutorture_urcu_qsbr_stress_perthread.tap \
+       test_rcutorture_urcu_qsbr_stress_perthread_cxx.tap \
+       test_rcutorture_urcu_qsbr_uperf_global.tap \
+       test_rcutorture_urcu_qsbr_uperf_global_cxx.tap \
+       test_rcutorture_urcu_qsbr_uperf_percpu.tap \
+       test_rcutorture_urcu_qsbr_uperf_percpu_cxx.tap \
+       test_rcutorture_urcu_qsbr_uperf_perthread.tap \
+       test_rcutorture_urcu_qsbr_uperf_perthread_cxx.tap
+
 .PHONY: regtest
 
 # This empty variable is required to enable the TAP test suite for custom
 # targets like 'regtest' while keeping the default 'check' a noop.
 TESTS =
 
 .PHONY: regtest
 
 # This empty variable is required to enable the TAP test suite for custom
 # targets like 'regtest' while keeping the default 'check' a noop.
 TESTS =
 
-REGTEST_TESTS = test_urcu_fork.tap \
-       rcutorture_urcu_bp_perf_global.tap \
-       rcutorture_urcu_bp_perf_percpu.tap \
-       rcutorture_urcu_bp_perf_perthread.tap \
-       rcutorture_urcu_bp_rperf_global.tap \
-       rcutorture_urcu_bp_rperf_percpu.tap \
-       rcutorture_urcu_bp_rperf_perthread.tap \
-       rcutorture_urcu_bp_stress_global.tap \
-       rcutorture_urcu_bp_stress_percpu.tap \
-       rcutorture_urcu_bp_stress_perthread.tap \
-       rcutorture_urcu_bp_uperf_global.tap \
-       rcutorture_urcu_bp_uperf_percpu.tap \
-       rcutorture_urcu_bp_uperf_perthread.tap \
-       rcutorture_urcu_mb_perf_global.tap \
-       rcutorture_urcu_mb_perf_percpu.tap \
-       rcutorture_urcu_mb_perf_perthread.tap \
-       rcutorture_urcu_mb_rperf_global.tap \
-       rcutorture_urcu_mb_rperf_percpu.tap \
-       rcutorture_urcu_mb_rperf_perthread.tap \
-       rcutorture_urcu_mb_stress_global.tap \
-       rcutorture_urcu_mb_stress_percpu.tap \
-       rcutorture_urcu_mb_stress_perthread.tap \
-       rcutorture_urcu_mb_uperf_global.tap \
-       rcutorture_urcu_mb_uperf_percpu.tap \
-       rcutorture_urcu_mb_uperf_perthread.tap \
-       rcutorture_urcu_membarrier_perf_global.tap \
-       rcutorture_urcu_membarrier_perf_percpu.tap \
-       rcutorture_urcu_membarrier_perf_perthread.tap \
-       rcutorture_urcu_membarrier_rperf_global.tap \
-       rcutorture_urcu_membarrier_rperf_percpu.tap \
-       rcutorture_urcu_membarrier_rperf_perthread.tap \
-       rcutorture_urcu_membarrier_stress_global.tap \
-       rcutorture_urcu_membarrier_stress_percpu.tap \
-       rcutorture_urcu_membarrier_stress_perthread.tap \
-       rcutorture_urcu_membarrier_uperf_global.tap \
-       rcutorture_urcu_membarrier_uperf_percpu.tap \
-       rcutorture_urcu_membarrier_uperf_perthread.tap \
-       rcutorture_urcu_qsbr_perf_global.tap \
-       rcutorture_urcu_qsbr_perf_percpu.tap \
-       rcutorture_urcu_qsbr_perf_perthread.tap \
-       rcutorture_urcu_qsbr_rperf_global.tap \
-       rcutorture_urcu_qsbr_rperf_percpu.tap \
-       rcutorture_urcu_qsbr_rperf_perthread.tap \
-       rcutorture_urcu_qsbr_stress_global.tap \
-       rcutorture_urcu_qsbr_stress_percpu.tap \
-       rcutorture_urcu_qsbr_stress_perthread.tap \
-       rcutorture_urcu_qsbr_uperf_global.tap \
-       rcutorture_urcu_qsbr_uperf_percpu.tap \
-       rcutorture_urcu_qsbr_uperf_perthread.tap \
-       rcutorture_urcu_signal_perf_global.tap \
-       rcutorture_urcu_signal_perf_percpu.tap \
-       rcutorture_urcu_signal_perf_perthread.tap \
-       rcutorture_urcu_signal_rperf_global.tap \
-       rcutorture_urcu_signal_rperf_percpu.tap \
-       rcutorture_urcu_signal_rperf_perthread.tap \
-       rcutorture_urcu_signal_stress_global.tap \
-       rcutorture_urcu_signal_stress_percpu.tap \
-       rcutorture_urcu_signal_stress_perthread.tap \
-       rcutorture_urcu_signal_uperf_global.tap \
-       rcutorture_urcu_signal_uperf_percpu.tap \
-       rcutorture_urcu_signal_uperf_perthread.tap
+REGTEST_TESTS = \
+       test_urcu_fork.tap \
+       test_urcu_fork_cxx.tap \
+       test_rcutorture_urcu_bp_perf_global.tap \
+       test_rcutorture_urcu_bp_perf_global_cxx.tap \
+       test_rcutorture_urcu_bp_perf_percpu.tap \
+       test_rcutorture_urcu_bp_perf_percpu_cxx.tap \
+       test_rcutorture_urcu_bp_perf_perthread.tap \
+       test_rcutorture_urcu_bp_perf_perthread_cxx.tap \
+       test_rcutorture_urcu_bp_rperf_global.tap \
+       test_rcutorture_urcu_bp_rperf_global_cxx.tap \
+       test_rcutorture_urcu_bp_rperf_percpu.tap \
+       test_rcutorture_urcu_bp_rperf_percpu_cxx.tap \
+       test_rcutorture_urcu_bp_rperf_perthread.tap \
+       test_rcutorture_urcu_bp_rperf_perthread_cxx.tap \
+       test_rcutorture_urcu_bp_stress_global.tap \
+       test_rcutorture_urcu_bp_stress_global_cxx.tap \
+       test_rcutorture_urcu_bp_stress_percpu.tap \
+       test_rcutorture_urcu_bp_stress_percpu_cxx.tap \
+       test_rcutorture_urcu_bp_stress_perthread.tap \
+       test_rcutorture_urcu_bp_stress_perthread_cxx.tap \
+       test_rcutorture_urcu_bp_uperf_global.tap \
+       test_rcutorture_urcu_bp_uperf_global_cxx.tap \
+       test_rcutorture_urcu_bp_uperf_percpu.tap \
+       test_rcutorture_urcu_bp_uperf_percpu_cxx.tap \
+       test_rcutorture_urcu_bp_uperf_perthread.tap \
+       test_rcutorture_urcu_bp_uperf_perthread_cxx.tap \
+       test_rcutorture_urcu_mb_perf_global.tap \
+       test_rcutorture_urcu_mb_perf_global_cxx.tap \
+       test_rcutorture_urcu_mb_perf_percpu.tap \
+       test_rcutorture_urcu_mb_perf_percpu_cxx.tap \
+       test_rcutorture_urcu_mb_perf_perthread.tap \
+       test_rcutorture_urcu_mb_perf_perthread_cxx.tap \
+       test_rcutorture_urcu_mb_rperf_global.tap \
+       test_rcutorture_urcu_mb_rperf_global_cxx.tap \
+       test_rcutorture_urcu_mb_rperf_percpu.tap \
+       test_rcutorture_urcu_mb_rperf_percpu_cxx.tap \
+       test_rcutorture_urcu_mb_rperf_perthread.tap \
+       test_rcutorture_urcu_mb_rperf_perthread_cxx.tap \
+       test_rcutorture_urcu_mb_stress_global.tap \
+       test_rcutorture_urcu_mb_stress_global_cxx.tap \
+       test_rcutorture_urcu_mb_stress_percpu.tap \
+       test_rcutorture_urcu_mb_stress_percpu_cxx.tap \
+       test_rcutorture_urcu_mb_stress_perthread.tap \
+       test_rcutorture_urcu_mb_stress_perthread_cxx.tap \
+       test_rcutorture_urcu_mb_uperf_global.tap \
+       test_rcutorture_urcu_mb_uperf_global_cxx.tap \
+       test_rcutorture_urcu_mb_uperf_percpu.tap \
+       test_rcutorture_urcu_mb_uperf_percpu_cxx.tap \
+       test_rcutorture_urcu_mb_uperf_perthread.tap \
+       test_rcutorture_urcu_mb_uperf_perthread_cxx.tap \
+       test_rcutorture_urcu_membarrier_perf_global.tap \
+       test_rcutorture_urcu_membarrier_perf_global_cxx.tap \
+       test_rcutorture_urcu_membarrier_perf_percpu.tap \
+       test_rcutorture_urcu_membarrier_perf_percpu_cxx.tap \
+       test_rcutorture_urcu_membarrier_perf_perthread.tap \
+       test_rcutorture_urcu_membarrier_perf_perthread_cxx.tap \
+       test_rcutorture_urcu_membarrier_rperf_global.tap \
+       test_rcutorture_urcu_membarrier_rperf_global_cxx.tap \
+       test_rcutorture_urcu_membarrier_rperf_percpu.tap \
+       test_rcutorture_urcu_membarrier_rperf_percpu_cxx.tap \
+       test_rcutorture_urcu_membarrier_rperf_perthread.tap \
+       test_rcutorture_urcu_membarrier_rperf_perthread_cxx.tap \
+       test_rcutorture_urcu_membarrier_stress_global.tap \
+       test_rcutorture_urcu_membarrier_stress_global_cxx.tap \
+       test_rcutorture_urcu_membarrier_stress_percpu.tap \
+       test_rcutorture_urcu_membarrier_stress_percpu_cxx.tap \
+       test_rcutorture_urcu_membarrier_stress_perthread.tap \
+       test_rcutorture_urcu_membarrier_stress_perthread_cxx.tap \
+       test_rcutorture_urcu_membarrier_uperf_global.tap \
+       test_rcutorture_urcu_membarrier_uperf_global_cxx.tap \
+       test_rcutorture_urcu_membarrier_uperf_percpu.tap \
+       test_rcutorture_urcu_membarrier_uperf_percpu_cxx.tap \
+       test_rcutorture_urcu_membarrier_uperf_perthread.tap \
+       test_rcutorture_urcu_membarrier_uperf_perthread_cxx.tap \
+       test_rcutorture_urcu_qsbr_perf_global.tap \
+       test_rcutorture_urcu_qsbr_perf_global_cxx.tap \
+       test_rcutorture_urcu_qsbr_perf_percpu.tap \
+       test_rcutorture_urcu_qsbr_perf_percpu_cxx.tap \
+       test_rcutorture_urcu_qsbr_perf_perthread.tap \
+       test_rcutorture_urcu_qsbr_perf_perthread_cxx.tap \
+       test_rcutorture_urcu_qsbr_rperf_global.tap \
+       test_rcutorture_urcu_qsbr_rperf_global_cxx.tap \
+       test_rcutorture_urcu_qsbr_rperf_percpu.tap \
+       test_rcutorture_urcu_qsbr_rperf_percpu_cxx.tap \
+       test_rcutorture_urcu_qsbr_rperf_perthread.tap \
+       test_rcutorture_urcu_qsbr_rperf_perthread_cxx.tap \
+       test_rcutorture_urcu_qsbr_stress_global.tap \
+       test_rcutorture_urcu_qsbr_stress_global_cxx.tap \
+       test_rcutorture_urcu_qsbr_stress_percpu.tap \
+       test_rcutorture_urcu_qsbr_stress_percpu_cxx.tap \
+       test_rcutorture_urcu_qsbr_stress_perthread.tap \
+       test_rcutorture_urcu_qsbr_stress_perthread_cxx.tap \
+       test_rcutorture_urcu_qsbr_uperf_global.tap \
+       test_rcutorture_urcu_qsbr_uperf_global_cxx.tap \
+       test_rcutorture_urcu_qsbr_uperf_percpu.tap \
+       test_rcutorture_urcu_qsbr_uperf_percpu_cxx.tap \
+       test_rcutorture_urcu_qsbr_uperf_perthread.tap \
+       test_rcutorture_urcu_qsbr_uperf_perthread_cxx.tap
 
 regtest:
        $(MAKE) $(AM_MAKEFLAGS) check TESTS="$(REGTEST_TESTS)"
 
 regtest:
        $(MAKE) $(AM_MAKEFLAGS) check TESTS="$(REGTEST_TESTS)"
index 9a2f9a1f581ffc5c34e4ce0c5f2ed2a12e114b75..441ff79bf349fa301b60e7ee61935e0caa58aba2 100644 (file)
@@ -1,3 +1,7 @@
+// SPDX-FileCopyrightText: 2008 Paul E. McKenney, IBM Corporation.
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
  * rcutorture.h: simple user-level performance/stress test of RCU.
  *
 /*
  * rcutorture.h: simple user-level performance/stress test of RCU.
  *
  * data.  A correct RCU implementation will have all but the first two
  * numbers non-zero.
  *
  * data.  A correct RCU implementation will have all but the first two
  * numbers non-zero.
  *
+ * rcu_stress_count: Histogram of "ages" of structures seen by readers.  If any
+ * entries past the first two are non-zero, RCU is broken. The age of a newly
+ * allocated structure is zero, it becomes one when removed from reader
+ * visibility, and is incremented once per grace period subsequently -- and is
+ * freed after passing through (RCU_STRESS_PIPE_LEN-2) grace periods.  Since
+ * this tests only has one true writer (there are fake writers), only buckets at
+ * indexes 0 and 1 should be none-zero.
+ *
  * 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
  * 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
 #include <stdlib.h>
 #include "tap.h"
 
 #include <stdlib.h>
 #include "tap.h"
 
+#include <urcu/uatomic.h>
+
+#include "urcu-wait.h"
+
 #define NR_TESTS       1
 
 DEFINE_PER_THREAD(long long, n_reads_pt);
 #define NR_TESTS       1
 
 DEFINE_PER_THREAD(long long, n_reads_pt);
@@ -79,6 +95,12 @@ enum callrcu_type {
        CALLRCU_PERTHREAD,
 };
 
        CALLRCU_PERTHREAD,
 };
 
+enum writer_state {
+       WRITER_STATE_SYNC_RCU,
+       WRITER_STATE_CALL_RCU,
+       WRITER_STATE_POLL_RCU,
+};
+
 static enum callrcu_type callrcu_type = CALLRCU_GLOBAL;
 
 long long n_reads = 0LL;
 static enum callrcu_type callrcu_type = CALLRCU_GLOBAL;
 
 long long n_reads = 0LL;
@@ -128,6 +150,7 @@ volatile int goflag __attribute__((__aligned__(CAA_CACHE_LINE_SIZE)))
  * Performance test.
  */
 
  * Performance test.
  */
 
+static
 void *rcu_read_perf_test(void *arg)
 {
        int i;
 void *rcu_read_perf_test(void *arg)
 {
        int i;
@@ -138,10 +161,10 @@ void *rcu_read_perf_test(void *arg)
        run_on(me);
        uatomic_inc(&nthreadsrunning);
        put_thread_offline();
        run_on(me);
        uatomic_inc(&nthreadsrunning);
        put_thread_offline();
-       while (goflag == GOFLAG_INIT)
+       while (uatomic_read(&goflag) == GOFLAG_INIT)
                (void) poll(NULL, 0, 1);
        put_thread_online();
                (void) poll(NULL, 0, 1);
        put_thread_online();
-       while (goflag == GOFLAG_RUN) {
+       while (uatomic_read(&goflag) == GOFLAG_RUN) {
                for (i = 0; i < RCU_READ_RUN; i++) {
                        rcu_read_lock();
                        /* rcu_read_lock_nest(); */
                for (i = 0; i < RCU_READ_RUN; i++) {
                        rcu_read_lock();
                        /* rcu_read_lock_nest(); */
@@ -158,7 +181,8 @@ void *rcu_read_perf_test(void *arg)
        return (NULL);
 }
 
        return (NULL);
 }
 
-void *rcu_update_perf_test(void *arg)
+static
+void *rcu_update_perf_test(void *arg __attribute__((unused)))
 {
        long long n_updates_local = 0;
 
 {
        long long n_updates_local = 0;
 
@@ -172,9 +196,9 @@ void *rcu_update_perf_test(void *arg)
                }
        }
        uatomic_inc(&nthreadsrunning);
                }
        }
        uatomic_inc(&nthreadsrunning);
-       while (goflag == GOFLAG_INIT)
+       while (uatomic_read(&goflag) == GOFLAG_INIT)
                (void) poll(NULL, 0, 1);
                (void) poll(NULL, 0, 1);
-       while (goflag == GOFLAG_RUN) {
+       while (uatomic_read(&goflag) == GOFLAG_RUN) {
                synchronize_rcu();
                n_updates_local++;
        }
                synchronize_rcu();
                n_updates_local++;
        }
@@ -189,6 +213,7 @@ void *rcu_update_perf_test(void *arg)
        return NULL;
 }
 
        return NULL;
 }
 
+static
 void perftestinit(void)
 {
        init_per_thread(n_reads_pt, 0LL);
 void perftestinit(void)
 {
        init_per_thread(n_reads_pt, 0LL);
@@ -196,20 +221,17 @@ void perftestinit(void)
        uatomic_set(&nthreadsrunning, 0);
 }
 
        uatomic_set(&nthreadsrunning, 0);
 }
 
+static
 int perftestrun(int nthreads, int nreaders, int nupdaters)
 {
        int t;
        int duration = 1;
 
 int perftestrun(int nthreads, int nreaders, int nupdaters)
 {
        int t;
        int duration = 1;
 
-       cmm_smp_mb();
        while (uatomic_read(&nthreadsrunning) < nthreads)
                (void) poll(NULL, 0, 1);
        while (uatomic_read(&nthreadsrunning) < nthreads)
                (void) poll(NULL, 0, 1);
-       goflag = GOFLAG_RUN;
-       cmm_smp_mb();
+       uatomic_set(&goflag, GOFLAG_RUN);
        sleep(duration);
        sleep(duration);
-       cmm_smp_mb();
-       goflag = GOFLAG_STOP;
-       cmm_smp_mb();
+       uatomic_set(&goflag, GOFLAG_STOP);
        wait_all_threads();
        for_each_thread(t) {
                n_reads += per_thread(n_reads_pt, t);
        wait_all_threads();
        for_each_thread(t) {
                n_reads += per_thread(n_reads_pt, t);
@@ -229,6 +251,7 @@ int perftestrun(int nthreads, int nreaders, int nupdaters)
        return 0;
 }
 
        return 0;
 }
 
+static
 int perftest(int nreaders, int cpustride)
 {
        int i;
 int perftest(int nreaders, int cpustride)
 {
        int i;
@@ -244,6 +267,7 @@ int perftest(int nreaders, int cpustride)
        return perftestrun(i + 1, nreaders, 1);
 }
 
        return perftestrun(i + 1, nreaders, 1);
 }
 
+static
 int rperftest(int nreaders, int cpustride)
 {
        int i;
 int rperftest(int nreaders, int cpustride)
 {
        int i;
@@ -258,6 +282,7 @@ int rperftest(int nreaders, int cpustride)
        return perftestrun(i, nreaders, 0);
 }
 
        return perftestrun(i, nreaders, 0);
 }
 
+static
 int uperftest(int nupdaters, int cpustride)
 {
        int i;
 int uperftest(int nupdaters, int cpustride)
 {
        int i;
@@ -283,16 +308,24 @@ struct rcu_stress {
        int mbtest;
 };
 
        int mbtest;
 };
 
-struct rcu_stress rcu_stress_array[RCU_STRESS_PIPE_LEN] = { { 0 } };
+struct rcu_stress rcu_stress_array[RCU_STRESS_PIPE_LEN] = { { 0, 0 } };
 struct rcu_stress *rcu_stress_current;
 int rcu_stress_idx = 0;
 
 struct rcu_stress *rcu_stress_current;
 int rcu_stress_idx = 0;
 
+/*
+ * How many time a reader has seen something that should not be visible. It is
+ * an error if this value is different than zero at the end of the stress test.
+ *
+ * Here, the something that should not be visibile is an old pipe that has been
+ * freed (mbtest = 0).
+ */
 int n_mberror = 0;
 DEFINE_PER_THREAD(long long [RCU_STRESS_PIPE_LEN + 1], rcu_stress_count);
 
 int garbage = 0;
 
 int n_mberror = 0;
 DEFINE_PER_THREAD(long long [RCU_STRESS_PIPE_LEN + 1], rcu_stress_count);
 
 int garbage = 0;
 
-void *rcu_read_stress_test(void *arg)
+static
+void *rcu_read_stress_test(void *arg __attribute__((unused)))
 {
        int i;
        int itercnt = 0;
 {
        int i;
        int itercnt = 0;
@@ -301,19 +334,25 @@ void *rcu_read_stress_test(void *arg)
 
        rcu_register_thread();
        put_thread_offline();
 
        rcu_register_thread();
        put_thread_offline();
-       while (goflag == GOFLAG_INIT)
+       while (uatomic_read(&goflag) == GOFLAG_INIT)
                (void) poll(NULL, 0, 1);
        put_thread_online();
                (void) poll(NULL, 0, 1);
        put_thread_online();
-       while (goflag == GOFLAG_RUN) {
+       while (uatomic_read(&goflag) == GOFLAG_RUN) {
                rcu_read_lock();
                p = rcu_dereference(rcu_stress_current);
                if (p->mbtest == 0)
                rcu_read_lock();
                p = rcu_dereference(rcu_stress_current);
                if (p->mbtest == 0)
-                       n_mberror++;
+                       uatomic_inc_mo(&n_mberror, CMM_RELAXED);
                rcu_read_lock_nest();
                rcu_read_lock_nest();
+               /*
+                * The value of garbage is nothing important. This is
+                * essentially a busy loop. The atomic operation -- while not
+                * important here -- helps tools such as TSAN to not flag this
+                * as a race condition.
+                */
                for (i = 0; i < 100; i++)
                for (i = 0; i < 100; i++)
-                       garbage++;
+                       uatomic_inc(&garbage);
                rcu_read_unlock_nest();
                rcu_read_unlock_nest();
-               pc = p->pipe_count;
+               pc = uatomic_read(&p->pipe_count);
                rcu_read_unlock();
                if ((pc > RCU_STRESS_PIPE_LEN) || (pc < 0))
                        pc = RCU_STRESS_PIPE_LEN;
                rcu_read_unlock();
                if ((pc > RCU_STRESS_PIPE_LEN) || (pc < 0))
                        pc = RCU_STRESS_PIPE_LEN;
@@ -332,110 +371,129 @@ void *rcu_read_stress_test(void *arg)
        return (NULL);
 }
 
        return (NULL);
 }
 
-static pthread_mutex_t call_rcu_test_mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t call_rcu_test_cond = PTHREAD_COND_INITIALIZER;
+static DEFINE_URCU_WAIT_QUEUE(call_rcu_waiters);
 
 
-void rcu_update_stress_test_rcu(struct rcu_head *head)
+static
+void rcu_update_stress_test_rcu(struct rcu_head *head __attribute__((unused)))
 {
 {
-       int ret;
+       struct urcu_waiters waiters;
 
 
-       ret = pthread_mutex_lock(&call_rcu_test_mutex);
-       if (ret) {
-               errno = ret;
-               diag("pthread_mutex_lock: %s",
-                       strerror(errno));
-               abort();
-       }
-       ret = pthread_cond_signal(&call_rcu_test_cond);
-       if (ret) {
-               errno = ret;
-               diag("pthread_cond_signal: %s",
-                       strerror(errno));
-               abort();
-       }
-       ret = pthread_mutex_unlock(&call_rcu_test_mutex);
-       if (ret) {
-               errno = ret;
-               diag("pthread_mutex_unlock: %s",
-                       strerror(errno));
-               abort();
+       urcu_move_waiters(&waiters, &call_rcu_waiters);
+       urcu_wake_all_waiters(&waiters);
+}
+
+static
+void advance_writer_state(enum writer_state *state)
+{
+       switch (*state) {
+       case WRITER_STATE_SYNC_RCU:
+               *state = WRITER_STATE_CALL_RCU;
+               break;
+       case WRITER_STATE_CALL_RCU:
+               *state = WRITER_STATE_POLL_RCU;
+               break;
+       case WRITER_STATE_POLL_RCU:
+               *state = WRITER_STATE_SYNC_RCU;
+               break;
        }
 }
 
        }
 }
 
-void *rcu_update_stress_test(void *arg)
+static
+void *rcu_update_stress_test(void *arg __attribute__((unused)))
 {
        int i;
 {
        int i;
-       struct rcu_stress *p;
+       struct rcu_stress *p, *old_p;
        struct rcu_head rh;
        struct rcu_head rh;
+       enum writer_state writer_state = WRITER_STATE_SYNC_RCU;
+
+       rcu_register_thread();
 
 
-       while (goflag == GOFLAG_INIT)
+       /* Offline for poll. */
+       put_thread_offline();
+       while (uatomic_read(&goflag) == GOFLAG_INIT)
                (void) poll(NULL, 0, 1);
                (void) poll(NULL, 0, 1);
-       while (goflag == GOFLAG_RUN) {
+       put_thread_online();
+
+       old_p = NULL;
+       while (uatomic_read(&goflag) == GOFLAG_RUN) {
                i = rcu_stress_idx + 1;
                if (i >= RCU_STRESS_PIPE_LEN)
                        i = 0;
                i = rcu_stress_idx + 1;
                if (i >= RCU_STRESS_PIPE_LEN)
                        i = 0;
+
+               rcu_read_lock();
+               old_p = rcu_dereference(rcu_stress_current);
+               rcu_read_unlock();
+
+               /*
+                * Allocate a new pipe.
+                */
                p = &rcu_stress_array[i];
                p = &rcu_stress_array[i];
-               p->mbtest = 0;
-               cmm_smp_mb();
                p->pipe_count = 0;
                p->mbtest = 1;
                p->pipe_count = 0;
                p->mbtest = 1;
+
                rcu_assign_pointer(rcu_stress_current, p);
                rcu_stress_idx = i;
                rcu_assign_pointer(rcu_stress_current, p);
                rcu_stress_idx = i;
+
+               /*
+                * Increment every pipe except the freshly allocated one. A
+                * reader should only see either the old pipe or the new
+                * pipe. This is reflected in the rcu_stress_count histogram.
+                */
                for (i = 0; i < RCU_STRESS_PIPE_LEN; i++)
                        if (i != rcu_stress_idx)
                for (i = 0; i < RCU_STRESS_PIPE_LEN; i++)
                        if (i != rcu_stress_idx)
-                               rcu_stress_array[i].pipe_count++;
-               if (n_updates & 0x1)
+                               uatomic_inc(&rcu_stress_array[i].pipe_count);
+
+               switch (writer_state) {
+               case WRITER_STATE_SYNC_RCU:
                        synchronize_rcu();
                        synchronize_rcu();
-               else {
-                       int ret;
-
-                       ret = pthread_mutex_lock(&call_rcu_test_mutex);
-                       if (ret) {
-                               errno = ret;
-                               diag("pthread_mutex_lock: %s",
-                                       strerror(errno));
-                               abort();
-                       }
-                       rcu_register_thread();
+                       break;
+               case WRITER_STATE_CALL_RCU:
+               {
+                       DEFINE_URCU_WAIT_NODE(wait, URCU_WAIT_WAITING);
+
+                       urcu_wait_add(&call_rcu_waiters, &wait);
+
                        call_rcu(&rh, rcu_update_stress_test_rcu);
                        call_rcu(&rh, rcu_update_stress_test_rcu);
-                       rcu_unregister_thread();
-                       /*
-                        * Our MacOS X test machine with the following
-                        * config:
-                        * 15.6.0 Darwin Kernel Version 15.6.0
-                        * root:xnu-3248.60.10~1/RELEASE_X86_64
-                        * appears to have issues with liburcu-signal
-                        * signal being delivered on top of
-                        * pthread_cond_wait. It seems to make the
-                        * thread continue, and therefore corrupt the
-                        * rcu_head. Work around this issue by
-                        * unregistering the RCU read-side thread
-                        * immediately after call_rcu (call_rcu needs
-                        * us to be registered RCU readers).
-                        */
-                       ret = pthread_cond_wait(&call_rcu_test_cond,
-                                       &call_rcu_test_mutex);
-                       if (ret) {
-                               errno = ret;
-                               diag("pthread_cond_signal: %s",
-                                       strerror(errno));
-                               abort();
-                       }
-                       ret = pthread_mutex_unlock(&call_rcu_test_mutex);
-                       if (ret) {
-                               errno = ret;
-                               diag("pthread_mutex_unlock: %s",
-                                       strerror(errno));
-                               abort();
-                       }
+
+                       /* Offline for busy-wait. */
+                       put_thread_offline();
+                       urcu_adaptative_busy_wait(&wait);
+                       put_thread_online();
+                       break;
                }
                }
+               case WRITER_STATE_POLL_RCU:
+               {
+                       struct urcu_gp_poll_state poll_state;
+
+                       poll_state = start_poll_synchronize_rcu();
+
+                       /* Offline for poll. */
+                       put_thread_offline();
+                       while (!poll_state_synchronize_rcu(poll_state))
+                               (void) poll(NULL, 0, 1);        /* Wait for 1ms */
+                       put_thread_online();
+                       break;
+               }
+               }
+               /*
+                * No readers should see that old pipe now. Setting mbtest to 0
+                * to mark it as "freed".
+                */
+               if (old_p) {
+                       old_p->mbtest = 0;
+               }
+               old_p = p;
                n_updates++;
                n_updates++;
+               advance_writer_state(&writer_state);
        }
 
        }
 
+       rcu_unregister_thread();
+
        return NULL;
 }
 
        return NULL;
 }
 
-void *rcu_fake_update_stress_test(void *arg)
+static
+void *rcu_fake_update_stress_test(void *arg __attribute__((unused)))
 {
        if (callrcu_type == CALLRCU_PERTHREAD) {
                struct call_rcu_data *crdp;
 {
        if (callrcu_type == CALLRCU_PERTHREAD) {
                struct call_rcu_data *crdp;
@@ -446,9 +504,9 @@ void *rcu_fake_update_stress_test(void *arg)
                        set_thread_call_rcu_data(crdp);
                }
        }
                        set_thread_call_rcu_data(crdp);
                }
        }
-       while (goflag == GOFLAG_INIT)
+       while (uatomic_read(&goflag) == GOFLAG_INIT)
                (void) poll(NULL, 0, 1);
                (void) poll(NULL, 0, 1);
-       while (goflag == GOFLAG_RUN) {
+       while (uatomic_read(&goflag) == GOFLAG_RUN) {
                synchronize_rcu();
                (void) poll(NULL, 0, 1);
        }
                synchronize_rcu();
                (void) poll(NULL, 0, 1);
        }
@@ -462,12 +520,14 @@ void *rcu_fake_update_stress_test(void *arg)
        return NULL;
 }
 
        return NULL;
 }
 
+static
 int stresstest(int nreaders)
 {
        int i;
        int t;
        long long *p;
        long long sum;
 int stresstest(int nreaders)
 {
        int i;
        int t;
        long long *p;
        long long sum;
+       int ret;
 
        init_per_thread(n_reads_pt, 0LL);
        for_each_thread(t) {
 
        init_per_thread(n_reads_pt, 0LL);
        for_each_thread(t) {
@@ -483,13 +543,9 @@ int stresstest(int nreaders)
        create_thread(rcu_update_stress_test, NULL);
        for (i = 0; i < 5; i++)
                create_thread(rcu_fake_update_stress_test, NULL);
        create_thread(rcu_update_stress_test, NULL);
        for (i = 0; i < 5; i++)
                create_thread(rcu_fake_update_stress_test, NULL);
-       cmm_smp_mb();
-       goflag = GOFLAG_RUN;
-       cmm_smp_mb();
+       uatomic_set(&goflag, GOFLAG_RUN);
        sleep(10);
        sleep(10);
-       cmm_smp_mb();
-       goflag = GOFLAG_STOP;
-       cmm_smp_mb();
+       uatomic_set(&goflag, GOFLAG_STOP);
        wait_all_threads();
        for_each_thread(t)
                n_reads += per_thread(n_reads_pt, t);
        wait_all_threads();
        for_each_thread(t)
                n_reads += per_thread(n_reads_pt, t);
@@ -497,11 +553,19 @@ int stresstest(int nreaders)
               n_reads, n_updates, n_mberror);
        rdiag_start();
        rdiag("rcu_stress_count:");
               n_reads, n_updates, n_mberror);
        rdiag_start();
        rdiag("rcu_stress_count:");
+       ret = 0;
        for (i = 0; i <= RCU_STRESS_PIPE_LEN; i++) {
                sum = 0LL;
                for_each_thread(t) {
                        sum += per_thread(rcu_stress_count, t)[i];
                }
        for (i = 0; i <= RCU_STRESS_PIPE_LEN; i++) {
                sum = 0LL;
                for_each_thread(t) {
                        sum += per_thread(rcu_stress_count, t)[i];
                }
+               /*
+                * If any entries past the first two are non-zero, RCU is
+                * broken. See details above about rcu_stress_count.
+                */
+               if (i > 1 && sum != 0) {
+                       ret = -1;
+               }
                rdiag(" %lld", sum);
        }
        rdiag_end();
                rdiag(" %lld", sum);
        }
        rdiag_end();
@@ -509,17 +573,20 @@ int stresstest(int nreaders)
                diag("Deallocating per-CPU call_rcu threads.");
                free_all_cpu_call_rcu_data();
        }
                diag("Deallocating per-CPU call_rcu threads.");
                free_all_cpu_call_rcu_data();
        }
-       if (!n_mberror)
-               return 0;
-       else
-               return -1;
+       if (n_mberror)
+               ret = -1;
+       return ret;
 }
 
 /*
  * Mainprogram.
  */
 
 }
 
 /*
  * Mainprogram.
  */
 
-void usage(int argc, char *argv[])
+static
+void usage(char *argv[]) __attribute__((__noreturn__));
+
+static
+void usage(char *argv[])
 {
        diag("Usage: %s nreaders [ perf | rperf | uperf | stress ] [ stride ] [ callrcu_global | callrcu_percpu | callrcu_perthread ]\n", argv[0]);
        exit(-1);
 {
        diag("Usage: %s nreaders [ perf | rperf | uperf | stress ] [ stride ] [ callrcu_global | callrcu_percpu | callrcu_perthread ]\n", argv[0]);
        exit(-1);
@@ -544,7 +611,7 @@ int main(int argc, char *argv[])
                } else if (strcmp(callrcu_str, "callrcu_perthread") == 0) {
                        callrcu_type = CALLRCU_PERTHREAD;
                } else {
                } else if (strcmp(callrcu_str, "callrcu_perthread") == 0) {
                        callrcu_type = CALLRCU_PERTHREAD;
                } else {
-                       usage(argc, argv);
+                       usage(argv);
                        goto end;
                }
        }
                        goto end;
                }
        }
@@ -574,7 +641,7 @@ int main(int argc, char *argv[])
        if (argc > 1) {
                if (strcmp(argv[1], "-h") == 0
                                || strcmp(argv[1], "--help") == 0) {
        if (argc > 1) {
                if (strcmp(argv[1], "-h") == 0
                                || strcmp(argv[1], "--help") == 0) {
-                       usage(argc, argv);
+                       usage(argv);
                        goto end;
                }
                nreaders = strtoul(argv[1], NULL, 0);
                        goto end;
                }
                nreaders = strtoul(argv[1], NULL, 0);
@@ -603,9 +670,9 @@ int main(int argc, char *argv[])
                                "stresstest readers: %d, stride: %d",
                                nreaders, cpustride);
                else
                                "stresstest readers: %d, stride: %d",
                                nreaders, cpustride);
                else
-                       usage(argc, argv);
+                       usage(argv);
        } else {
        } else {
-               usage(argc, argv);
+               usage(argv);
        }
 end:
        return exit_status();
        }
 end:
        return exit_status();
diff --git a/tests/regression/rcutorture_urcu_bp_perf_global.tap.in b/tests/regression/rcutorture_urcu_bp_perf_global.tap.in
deleted file mode 100644 (file)
index 3dc7ff4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_bp `@NPROC_CMD@` perf 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_bp_perf_percpu.tap.in b/tests/regression/rcutorture_urcu_bp_perf_percpu.tap.in
deleted file mode 100644 (file)
index 5bbaa92..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_bp `@NPROC_CMD@` perf 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_bp_perf_perthread.tap.in b/tests/regression/rcutorture_urcu_bp_perf_perthread.tap.in
deleted file mode 100644 (file)
index d89ceb8..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_bp `@NPROC_CMD@` perf 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_bp_rperf_global.tap.in b/tests/regression/rcutorture_urcu_bp_rperf_global.tap.in
deleted file mode 100644 (file)
index f992f26..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_bp `@NPROC_CMD@` rperf 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_bp_rperf_percpu.tap.in b/tests/regression/rcutorture_urcu_bp_rperf_percpu.tap.in
deleted file mode 100644 (file)
index 8ac8212..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_bp `@NPROC_CMD@` rperf 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_bp_rperf_perthread.tap.in b/tests/regression/rcutorture_urcu_bp_rperf_perthread.tap.in
deleted file mode 100644 (file)
index 69a7fbd..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_bp `@NPROC_CMD@` rperf 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_bp_stress_global.tap.in b/tests/regression/rcutorture_urcu_bp_stress_global.tap.in
deleted file mode 100644 (file)
index 7c6ee1f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_bp `@NPROC_CMD@` stress 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_bp_stress_percpu.tap.in b/tests/regression/rcutorture_urcu_bp_stress_percpu.tap.in
deleted file mode 100644 (file)
index a0b19c3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_bp `@NPROC_CMD@` stress 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_bp_stress_perthread.tap.in b/tests/regression/rcutorture_urcu_bp_stress_perthread.tap.in
deleted file mode 100644 (file)
index dbacd3f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_bp `@NPROC_CMD@` stress 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_bp_uperf_global.tap.in b/tests/regression/rcutorture_urcu_bp_uperf_global.tap.in
deleted file mode 100644 (file)
index b157d24..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_bp `@NPROC_CMD@` uperf 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_bp_uperf_percpu.tap.in b/tests/regression/rcutorture_urcu_bp_uperf_percpu.tap.in
deleted file mode 100644 (file)
index 2c44eaa..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_bp `@NPROC_CMD@` uperf 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_bp_uperf_perthread.tap.in b/tests/regression/rcutorture_urcu_bp_uperf_perthread.tap.in
deleted file mode 100644 (file)
index 15e7d7d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_bp `@NPROC_CMD@` uperf 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_mb_perf_global.tap.in b/tests/regression/rcutorture_urcu_mb_perf_global.tap.in
deleted file mode 100644 (file)
index 65603e7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_mb `@NPROC_CMD@` perf 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_mb_perf_percpu.tap.in b/tests/regression/rcutorture_urcu_mb_perf_percpu.tap.in
deleted file mode 100644 (file)
index 9b877c4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_mb `@NPROC_CMD@` perf 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_mb_perf_perthread.tap.in b/tests/regression/rcutorture_urcu_mb_perf_perthread.tap.in
deleted file mode 100644 (file)
index 7da5afe..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_mb `@NPROC_CMD@` perf 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_mb_rperf_global.tap.in b/tests/regression/rcutorture_urcu_mb_rperf_global.tap.in
deleted file mode 100644 (file)
index 1928d7d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_mb `@NPROC_CMD@` rperf 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_mb_rperf_percpu.tap.in b/tests/regression/rcutorture_urcu_mb_rperf_percpu.tap.in
deleted file mode 100644 (file)
index ffa90fb..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_mb `@NPROC_CMD@` rperf 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_mb_rperf_perthread.tap.in b/tests/regression/rcutorture_urcu_mb_rperf_perthread.tap.in
deleted file mode 100644 (file)
index 37be26e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_mb `@NPROC_CMD@` rperf 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_mb_stress_global.tap.in b/tests/regression/rcutorture_urcu_mb_stress_global.tap.in
deleted file mode 100644 (file)
index 6a1cdd9..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_mb `@NPROC_CMD@` stress 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_mb_stress_percpu.tap.in b/tests/regression/rcutorture_urcu_mb_stress_percpu.tap.in
deleted file mode 100644 (file)
index d9994cd..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_mb `@NPROC_CMD@` stress 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_mb_stress_perthread.tap.in b/tests/regression/rcutorture_urcu_mb_stress_perthread.tap.in
deleted file mode 100644 (file)
index 1eb07a3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_mb `@NPROC_CMD@` stress 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_mb_uperf_global.tap.in b/tests/regression/rcutorture_urcu_mb_uperf_global.tap.in
deleted file mode 100644 (file)
index 3d41a7c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_mb `@NPROC_CMD@` uperf 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_mb_uperf_percpu.tap.in b/tests/regression/rcutorture_urcu_mb_uperf_percpu.tap.in
deleted file mode 100644 (file)
index 30ec884..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_mb `@NPROC_CMD@` uperf 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_mb_uperf_perthread.tap.in b/tests/regression/rcutorture_urcu_mb_uperf_perthread.tap.in
deleted file mode 100644 (file)
index de5c153..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_mb `@NPROC_CMD@` uperf 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_membarrier_perf_global.tap.in b/tests/regression/rcutorture_urcu_membarrier_perf_global.tap.in
deleted file mode 100644 (file)
index a277d4e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_membarrier `@NPROC_CMD@` perf 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_membarrier_perf_percpu.tap.in b/tests/regression/rcutorture_urcu_membarrier_perf_percpu.tap.in
deleted file mode 100644 (file)
index 768a294..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_membarrier `@NPROC_CMD@` perf 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_membarrier_perf_perthread.tap.in b/tests/regression/rcutorture_urcu_membarrier_perf_perthread.tap.in
deleted file mode 100644 (file)
index a7baba4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_membarrier `@NPROC_CMD@` perf 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_membarrier_rperf_global.tap.in b/tests/regression/rcutorture_urcu_membarrier_rperf_global.tap.in
deleted file mode 100644 (file)
index 29000bb..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_membarrier `@NPROC_CMD@` rperf 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_membarrier_rperf_percpu.tap.in b/tests/regression/rcutorture_urcu_membarrier_rperf_percpu.tap.in
deleted file mode 100644 (file)
index 47c7351..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_membarrier `@NPROC_CMD@` rperf 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_membarrier_rperf_perthread.tap.in b/tests/regression/rcutorture_urcu_membarrier_rperf_perthread.tap.in
deleted file mode 100644 (file)
index d947fd3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_membarrier `@NPROC_CMD@` rperf 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_membarrier_stress_global.tap.in b/tests/regression/rcutorture_urcu_membarrier_stress_global.tap.in
deleted file mode 100644 (file)
index f956efb..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_membarrier `@NPROC_CMD@` stress 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_membarrier_stress_percpu.tap.in b/tests/regression/rcutorture_urcu_membarrier_stress_percpu.tap.in
deleted file mode 100644 (file)
index 6cf1504..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_membarrier `@NPROC_CMD@` stress 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_membarrier_stress_perthread.tap.in b/tests/regression/rcutorture_urcu_membarrier_stress_perthread.tap.in
deleted file mode 100644 (file)
index e6be1e6..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_membarrier `@NPROC_CMD@` stress 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_membarrier_uperf_global.tap.in b/tests/regression/rcutorture_urcu_membarrier_uperf_global.tap.in
deleted file mode 100644 (file)
index bd6d20e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_membarrier `@NPROC_CMD@` uperf 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_membarrier_uperf_percpu.tap.in b/tests/regression/rcutorture_urcu_membarrier_uperf_percpu.tap.in
deleted file mode 100644 (file)
index 54c3cbe..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_membarrier `@NPROC_CMD@` uperf 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_membarrier_uperf_perthread.tap.in b/tests/regression/rcutorture_urcu_membarrier_uperf_perthread.tap.in
deleted file mode 100644 (file)
index fb0dd5a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_membarrier `@NPROC_CMD@` uperf 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_qsbr_perf_global.tap.in b/tests/regression/rcutorture_urcu_qsbr_perf_global.tap.in
deleted file mode 100644 (file)
index ddcac7a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_qsbr `@NPROC_CMD@` perf 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_qsbr_perf_percpu.tap.in b/tests/regression/rcutorture_urcu_qsbr_perf_percpu.tap.in
deleted file mode 100644 (file)
index 219646c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_qsbr `@NPROC_CMD@` perf 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_qsbr_perf_perthread.tap.in b/tests/regression/rcutorture_urcu_qsbr_perf_perthread.tap.in
deleted file mode 100644 (file)
index d063fe4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_qsbr `@NPROC_CMD@` perf 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_qsbr_rperf_global.tap.in b/tests/regression/rcutorture_urcu_qsbr_rperf_global.tap.in
deleted file mode 100644 (file)
index ef2dbed..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_qsbr `@NPROC_CMD@` rperf 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_qsbr_rperf_percpu.tap.in b/tests/regression/rcutorture_urcu_qsbr_rperf_percpu.tap.in
deleted file mode 100644 (file)
index 4c5d8d5..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_qsbr `@NPROC_CMD@` rperf 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_qsbr_rperf_perthread.tap.in b/tests/regression/rcutorture_urcu_qsbr_rperf_perthread.tap.in
deleted file mode 100644 (file)
index badd161..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_qsbr `@NPROC_CMD@` rperf 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_qsbr_stress_global.tap.in b/tests/regression/rcutorture_urcu_qsbr_stress_global.tap.in
deleted file mode 100644 (file)
index e3d1c4c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_qsbr `@NPROC_CMD@` stress 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_qsbr_stress_percpu.tap.in b/tests/regression/rcutorture_urcu_qsbr_stress_percpu.tap.in
deleted file mode 100644 (file)
index f3018fe..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_qsbr `@NPROC_CMD@` stress 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_qsbr_stress_perthread.tap.in b/tests/regression/rcutorture_urcu_qsbr_stress_perthread.tap.in
deleted file mode 100644 (file)
index 451072e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_qsbr `@NPROC_CMD@` stress 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_qsbr_uperf_global.tap.in b/tests/regression/rcutorture_urcu_qsbr_uperf_global.tap.in
deleted file mode 100644 (file)
index 1cdb803..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_qsbr `@NPROC_CMD@` uperf 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_qsbr_uperf_percpu.tap.in b/tests/regression/rcutorture_urcu_qsbr_uperf_percpu.tap.in
deleted file mode 100644 (file)
index ee2c1bd..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_qsbr `@NPROC_CMD@` uperf 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_qsbr_uperf_perthread.tap.in b/tests/regression/rcutorture_urcu_qsbr_uperf_perthread.tap.in
deleted file mode 100644 (file)
index fbabf97..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_qsbr `@NPROC_CMD@` uperf 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_signal_perf_global.tap.in b/tests/regression/rcutorture_urcu_signal_perf_global.tap.in
deleted file mode 100644 (file)
index 20f967f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_signal `@NPROC_CMD@` perf 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_signal_perf_percpu.tap.in b/tests/regression/rcutorture_urcu_signal_perf_percpu.tap.in
deleted file mode 100644 (file)
index 53ec18e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_signal `@NPROC_CMD@` perf 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_signal_perf_perthread.tap.in b/tests/regression/rcutorture_urcu_signal_perf_perthread.tap.in
deleted file mode 100644 (file)
index d8ca7ef..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_signal `@NPROC_CMD@` perf 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_signal_rperf_global.tap.in b/tests/regression/rcutorture_urcu_signal_rperf_global.tap.in
deleted file mode 100644 (file)
index 2da3a93..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_signal `@NPROC_CMD@` rperf 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_signal_rperf_percpu.tap.in b/tests/regression/rcutorture_urcu_signal_rperf_percpu.tap.in
deleted file mode 100644 (file)
index 5497f2f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_signal `@NPROC_CMD@` rperf 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_signal_rperf_perthread.tap.in b/tests/regression/rcutorture_urcu_signal_rperf_perthread.tap.in
deleted file mode 100644 (file)
index 6c62c15..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_signal `@NPROC_CMD@` rperf 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_signal_stress_global.tap.in b/tests/regression/rcutorture_urcu_signal_stress_global.tap.in
deleted file mode 100644 (file)
index c667dbf..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_signal `@NPROC_CMD@` stress 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_signal_stress_percpu.tap.in b/tests/regression/rcutorture_urcu_signal_stress_percpu.tap.in
deleted file mode 100644 (file)
index 429b731..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_signal `@NPROC_CMD@` stress 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_signal_stress_perthread.tap.in b/tests/regression/rcutorture_urcu_signal_stress_perthread.tap.in
deleted file mode 100644 (file)
index 62d190d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_signal `@NPROC_CMD@` stress 1 callrcu_perthread
diff --git a/tests/regression/rcutorture_urcu_signal_uperf_global.tap.in b/tests/regression/rcutorture_urcu_signal_uperf_global.tap.in
deleted file mode 100644 (file)
index e86b6d7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_signal `@NPROC_CMD@` uperf 1 callrcu_global
diff --git a/tests/regression/rcutorture_urcu_signal_uperf_percpu.tap.in b/tests/regression/rcutorture_urcu_signal_uperf_percpu.tap.in
deleted file mode 100644 (file)
index c212711..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_signal `@NPROC_CMD@` uperf 1 callrcu_percpu
diff --git a/tests/regression/rcutorture_urcu_signal_uperf_perthread.tap.in b/tests/regression/rcutorture_urcu_signal_uperf_perthread.tap.in
deleted file mode 100644 (file)
index 1d92879..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./rcutorture_urcu_signal `@NPROC_CMD@` uperf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_bp_perf_global.tap b/tests/regression/test_rcutorture_urcu_bp_perf_global.tap
new file mode 100755 (executable)
index 0000000..96a640d
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp" "$(urcu_nproc)" perf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_bp_perf_global_cxx.tap b/tests/regression/test_rcutorture_urcu_bp_perf_global_cxx.tap
new file mode 100755 (executable)
index 0000000..9c324bd
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp_cxx" "$(urcu_nproc)" perf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_bp_perf_percpu.tap b/tests/regression/test_rcutorture_urcu_bp_perf_percpu.tap
new file mode 100755 (executable)
index 0000000..f697116
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp" "$(urcu_nproc)" perf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_bp_perf_percpu_cxx.tap b/tests/regression/test_rcutorture_urcu_bp_perf_percpu_cxx.tap
new file mode 100755 (executable)
index 0000000..e30d6f5
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp_cxx" "$(urcu_nproc)" perf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_bp_perf_perthread.tap b/tests/regression/test_rcutorture_urcu_bp_perf_perthread.tap
new file mode 100755 (executable)
index 0000000..f18dc8c
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp" "$(urcu_nproc)" perf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_bp_perf_perthread_cxx.tap b/tests/regression/test_rcutorture_urcu_bp_perf_perthread_cxx.tap
new file mode 100755 (executable)
index 0000000..54c09ec
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp_cxx" "$(urcu_nproc)" perf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_bp_rperf_global.tap b/tests/regression/test_rcutorture_urcu_bp_rperf_global.tap
new file mode 100755 (executable)
index 0000000..c003127
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp" "$(urcu_nproc)" rperf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_bp_rperf_global_cxx.tap b/tests/regression/test_rcutorture_urcu_bp_rperf_global_cxx.tap
new file mode 100755 (executable)
index 0000000..4109798
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp_cxx" "$(urcu_nproc)" rperf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_bp_rperf_percpu.tap b/tests/regression/test_rcutorture_urcu_bp_rperf_percpu.tap
new file mode 100755 (executable)
index 0000000..96d3674
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp" "$(urcu_nproc)" rperf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_bp_rperf_percpu_cxx.tap b/tests/regression/test_rcutorture_urcu_bp_rperf_percpu_cxx.tap
new file mode 100755 (executable)
index 0000000..9ce9e9f
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp_cxx" "$(urcu_nproc)" rperf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_bp_rperf_perthread.tap b/tests/regression/test_rcutorture_urcu_bp_rperf_perthread.tap
new file mode 100755 (executable)
index 0000000..9635caa
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp" "$(urcu_nproc)" rperf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_bp_rperf_perthread_cxx.tap b/tests/regression/test_rcutorture_urcu_bp_rperf_perthread_cxx.tap
new file mode 100755 (executable)
index 0000000..66668fe
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp_cxx" "$(urcu_nproc)" rperf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_bp_stress_global.tap b/tests/regression/test_rcutorture_urcu_bp_stress_global.tap
new file mode 100755 (executable)
index 0000000..1fad3ac
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp" "$(urcu_nproc)" stress 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_bp_stress_global_cxx.tap b/tests/regression/test_rcutorture_urcu_bp_stress_global_cxx.tap
new file mode 100755 (executable)
index 0000000..f807630
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp_cxx" "$(urcu_nproc)" stress 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_bp_stress_percpu.tap b/tests/regression/test_rcutorture_urcu_bp_stress_percpu.tap
new file mode 100755 (executable)
index 0000000..b4daa59
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp" "$(urcu_nproc)" stress 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_bp_stress_percpu_cxx.tap b/tests/regression/test_rcutorture_urcu_bp_stress_percpu_cxx.tap
new file mode 100755 (executable)
index 0000000..84d0a4a
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp_cxx" "$(urcu_nproc)" stress 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_bp_stress_perthread.tap b/tests/regression/test_rcutorture_urcu_bp_stress_perthread.tap
new file mode 100755 (executable)
index 0000000..440327b
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp" "$(urcu_nproc)" stress 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_bp_stress_perthread_cxx.tap b/tests/regression/test_rcutorture_urcu_bp_stress_perthread_cxx.tap
new file mode 100755 (executable)
index 0000000..05df988
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp_cxx" "$(urcu_nproc)" stress 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_bp_uperf_global.tap b/tests/regression/test_rcutorture_urcu_bp_uperf_global.tap
new file mode 100755 (executable)
index 0000000..fa908a9
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp" "$(urcu_nproc)" uperf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_bp_uperf_global_cxx.tap b/tests/regression/test_rcutorture_urcu_bp_uperf_global_cxx.tap
new file mode 100755 (executable)
index 0000000..550049f
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp_cxx" "$(urcu_nproc)" uperf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_bp_uperf_percpu.tap b/tests/regression/test_rcutorture_urcu_bp_uperf_percpu.tap
new file mode 100755 (executable)
index 0000000..0a84e68
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp" "$(urcu_nproc)" uperf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_bp_uperf_percpu_cxx.tap b/tests/regression/test_rcutorture_urcu_bp_uperf_percpu_cxx.tap
new file mode 100755 (executable)
index 0000000..2231c00
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp_cxx" "$(urcu_nproc)" uperf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_bp_uperf_perthread.tap b/tests/regression/test_rcutorture_urcu_bp_uperf_perthread.tap
new file mode 100755 (executable)
index 0000000..a33820f
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp" "$(urcu_nproc)" uperf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_bp_uperf_perthread_cxx.tap b/tests/regression/test_rcutorture_urcu_bp_uperf_perthread_cxx.tap
new file mode 100755 (executable)
index 0000000..3ef20d9
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_bp_cxx" "$(urcu_nproc)" uperf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_mb_perf_global.tap b/tests/regression/test_rcutorture_urcu_mb_perf_global.tap
new file mode 100755 (executable)
index 0000000..f0f3370
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb" "$(urcu_nproc)" perf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_mb_perf_global_cxx.tap b/tests/regression/test_rcutorture_urcu_mb_perf_global_cxx.tap
new file mode 100755 (executable)
index 0000000..416dc31
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb_cxx" "$(urcu_nproc)" perf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_mb_perf_percpu.tap b/tests/regression/test_rcutorture_urcu_mb_perf_percpu.tap
new file mode 100755 (executable)
index 0000000..6a6c0ee
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb" "$(urcu_nproc)" perf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_mb_perf_percpu_cxx.tap b/tests/regression/test_rcutorture_urcu_mb_perf_percpu_cxx.tap
new file mode 100755 (executable)
index 0000000..ffb2e93
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb_cxx" "$(urcu_nproc)" perf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_mb_perf_perthread.tap b/tests/regression/test_rcutorture_urcu_mb_perf_perthread.tap
new file mode 100755 (executable)
index 0000000..898629e
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb" "$(urcu_nproc)" perf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_mb_perf_perthread_cxx.tap b/tests/regression/test_rcutorture_urcu_mb_perf_perthread_cxx.tap
new file mode 100755 (executable)
index 0000000..718da74
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb_cxx" "$(urcu_nproc)" perf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_mb_rperf_global.tap b/tests/regression/test_rcutorture_urcu_mb_rperf_global.tap
new file mode 100755 (executable)
index 0000000..61543ea
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb" "$(urcu_nproc)" rperf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_mb_rperf_global_cxx.tap b/tests/regression/test_rcutorture_urcu_mb_rperf_global_cxx.tap
new file mode 100755 (executable)
index 0000000..379ae65
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb_cxx" "$(urcu_nproc)" rperf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_mb_rperf_percpu.tap b/tests/regression/test_rcutorture_urcu_mb_rperf_percpu.tap
new file mode 100755 (executable)
index 0000000..5fdca8a
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb" "$(urcu_nproc)" rperf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_mb_rperf_percpu_cxx.tap b/tests/regression/test_rcutorture_urcu_mb_rperf_percpu_cxx.tap
new file mode 100755 (executable)
index 0000000..c153c78
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb_cxx" "$(urcu_nproc)" rperf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_mb_rperf_perthread.tap b/tests/regression/test_rcutorture_urcu_mb_rperf_perthread.tap
new file mode 100755 (executable)
index 0000000..254d171
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb" "$(urcu_nproc)" rperf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_mb_rperf_perthread_cxx.tap b/tests/regression/test_rcutorture_urcu_mb_rperf_perthread_cxx.tap
new file mode 100755 (executable)
index 0000000..0f1cb64
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb_cxx" "$(urcu_nproc)" rperf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_mb_stress_global.tap b/tests/regression/test_rcutorture_urcu_mb_stress_global.tap
new file mode 100755 (executable)
index 0000000..a07fcec
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb" "$(urcu_nproc)" stress 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_mb_stress_global_cxx.tap b/tests/regression/test_rcutorture_urcu_mb_stress_global_cxx.tap
new file mode 100755 (executable)
index 0000000..a896058
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb_cxx" "$(urcu_nproc)" stress 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_mb_stress_percpu.tap b/tests/regression/test_rcutorture_urcu_mb_stress_percpu.tap
new file mode 100755 (executable)
index 0000000..bf1f9d1
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb" "$(urcu_nproc)" stress 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_mb_stress_percpu_cxx.tap b/tests/regression/test_rcutorture_urcu_mb_stress_percpu_cxx.tap
new file mode 100755 (executable)
index 0000000..67135dc
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb_cxx" "$(urcu_nproc)" stress 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_mb_stress_perthread.tap b/tests/regression/test_rcutorture_urcu_mb_stress_perthread.tap
new file mode 100755 (executable)
index 0000000..73a6f04
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb" "$(urcu_nproc)" stress 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_mb_stress_perthread_cxx.tap b/tests/regression/test_rcutorture_urcu_mb_stress_perthread_cxx.tap
new file mode 100755 (executable)
index 0000000..520960d
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb_cxx" "$(urcu_nproc)" stress 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_mb_uperf_global.tap b/tests/regression/test_rcutorture_urcu_mb_uperf_global.tap
new file mode 100755 (executable)
index 0000000..2455a48
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb" "$(urcu_nproc)" uperf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_mb_uperf_global_cxx.tap b/tests/regression/test_rcutorture_urcu_mb_uperf_global_cxx.tap
new file mode 100755 (executable)
index 0000000..dbbca53
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb_cxx" "$(urcu_nproc)" uperf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_mb_uperf_percpu.tap b/tests/regression/test_rcutorture_urcu_mb_uperf_percpu.tap
new file mode 100755 (executable)
index 0000000..36bc4b0
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb" "$(urcu_nproc)" uperf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_mb_uperf_percpu_cxx.tap b/tests/regression/test_rcutorture_urcu_mb_uperf_percpu_cxx.tap
new file mode 100755 (executable)
index 0000000..7115576
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb_cxx" "$(urcu_nproc)" uperf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_mb_uperf_perthread.tap b/tests/regression/test_rcutorture_urcu_mb_uperf_perthread.tap
new file mode 100755 (executable)
index 0000000..d6628bf
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb" "$(urcu_nproc)" uperf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_mb_uperf_perthread_cxx.tap b/tests/regression/test_rcutorture_urcu_mb_uperf_perthread_cxx.tap
new file mode 100755 (executable)
index 0000000..759a068
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_mb_cxx" "$(urcu_nproc)" uperf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_perf_global.tap b/tests/regression/test_rcutorture_urcu_membarrier_perf_global.tap
new file mode 100755 (executable)
index 0000000..05f22ac
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier" "$(urcu_nproc)" perf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_perf_global_cxx.tap b/tests/regression/test_rcutorture_urcu_membarrier_perf_global_cxx.tap
new file mode 100755 (executable)
index 0000000..f88e08b
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier_cxx" "$(urcu_nproc)" perf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_perf_percpu.tap b/tests/regression/test_rcutorture_urcu_membarrier_perf_percpu.tap
new file mode 100755 (executable)
index 0000000..7c4cc53
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier" "$(urcu_nproc)" perf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_perf_percpu_cxx.tap b/tests/regression/test_rcutorture_urcu_membarrier_perf_percpu_cxx.tap
new file mode 100755 (executable)
index 0000000..f24a04b
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier_cxx" "$(urcu_nproc)" perf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_perf_perthread.tap b/tests/regression/test_rcutorture_urcu_membarrier_perf_perthread.tap
new file mode 100755 (executable)
index 0000000..2b5c1b8
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier" "$(urcu_nproc)" perf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_perf_perthread_cxx.tap b/tests/regression/test_rcutorture_urcu_membarrier_perf_perthread_cxx.tap
new file mode 100755 (executable)
index 0000000..c40de4c
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier_cxx" "$(urcu_nproc)" perf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_rperf_global.tap b/tests/regression/test_rcutorture_urcu_membarrier_rperf_global.tap
new file mode 100755 (executable)
index 0000000..edea741
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier" "$(urcu_nproc)" rperf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_rperf_global_cxx.tap b/tests/regression/test_rcutorture_urcu_membarrier_rperf_global_cxx.tap
new file mode 100755 (executable)
index 0000000..5b48589
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier_cxx" "$(urcu_nproc)" rperf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_rperf_percpu.tap b/tests/regression/test_rcutorture_urcu_membarrier_rperf_percpu.tap
new file mode 100755 (executable)
index 0000000..dd585cf
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier" "$(urcu_nproc)" rperf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_rperf_percpu_cxx.tap b/tests/regression/test_rcutorture_urcu_membarrier_rperf_percpu_cxx.tap
new file mode 100755 (executable)
index 0000000..864fa63
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier_cxx" "$(urcu_nproc)" rperf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_rperf_perthread.tap b/tests/regression/test_rcutorture_urcu_membarrier_rperf_perthread.tap
new file mode 100755 (executable)
index 0000000..9875d1e
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier" "$(urcu_nproc)" rperf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_rperf_perthread_cxx.tap b/tests/regression/test_rcutorture_urcu_membarrier_rperf_perthread_cxx.tap
new file mode 100755 (executable)
index 0000000..3d60e0f
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier_cxx" "$(urcu_nproc)" rperf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_stress_global.tap b/tests/regression/test_rcutorture_urcu_membarrier_stress_global.tap
new file mode 100755 (executable)
index 0000000..4642ce4
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier" "$(urcu_nproc)" stress 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_stress_global_cxx.tap b/tests/regression/test_rcutorture_urcu_membarrier_stress_global_cxx.tap
new file mode 100755 (executable)
index 0000000..0cc7783
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier_cxx" "$(urcu_nproc)" stress 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_stress_percpu.tap b/tests/regression/test_rcutorture_urcu_membarrier_stress_percpu.tap
new file mode 100755 (executable)
index 0000000..3f9efbf
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier" "$(urcu_nproc)" stress 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_stress_percpu_cxx.tap b/tests/regression/test_rcutorture_urcu_membarrier_stress_percpu_cxx.tap
new file mode 100755 (executable)
index 0000000..f5d1c3f
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier_cxx" "$(urcu_nproc)" stress 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_stress_perthread.tap b/tests/regression/test_rcutorture_urcu_membarrier_stress_perthread.tap
new file mode 100755 (executable)
index 0000000..1b239a5
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier" "$(urcu_nproc)" stress 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_stress_perthread_cxx.tap b/tests/regression/test_rcutorture_urcu_membarrier_stress_perthread_cxx.tap
new file mode 100755 (executable)
index 0000000..a7c5daa
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier_cxx" "$(urcu_nproc)" stress 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_uperf_global.tap b/tests/regression/test_rcutorture_urcu_membarrier_uperf_global.tap
new file mode 100755 (executable)
index 0000000..f738f24
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier" "$(urcu_nproc)" uperf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_uperf_global_cxx.tap b/tests/regression/test_rcutorture_urcu_membarrier_uperf_global_cxx.tap
new file mode 100755 (executable)
index 0000000..0b18350
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier_cxx" "$(urcu_nproc)" uperf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_uperf_percpu.tap b/tests/regression/test_rcutorture_urcu_membarrier_uperf_percpu.tap
new file mode 100755 (executable)
index 0000000..d1d24ea
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier" "$(urcu_nproc)" uperf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_uperf_percpu_cxx.tap b/tests/regression/test_rcutorture_urcu_membarrier_uperf_percpu_cxx.tap
new file mode 100755 (executable)
index 0000000..a85bd48
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier_cxx" "$(urcu_nproc)" uperf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_uperf_perthread.tap b/tests/regression/test_rcutorture_urcu_membarrier_uperf_perthread.tap
new file mode 100755 (executable)
index 0000000..dd19f6c
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier" "$(urcu_nproc)" uperf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_membarrier_uperf_perthread_cxx.tap b/tests/regression/test_rcutorture_urcu_membarrier_uperf_perthread_cxx.tap
new file mode 100755 (executable)
index 0000000..7d79de1
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_membarrier_cxx" "$(urcu_nproc)" uperf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_perf_global.tap b/tests/regression/test_rcutorture_urcu_qsbr_perf_global.tap
new file mode 100755 (executable)
index 0000000..0b75a48
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr" "$(urcu_nproc)" perf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_perf_global_cxx.tap b/tests/regression/test_rcutorture_urcu_qsbr_perf_global_cxx.tap
new file mode 100755 (executable)
index 0000000..eba1e88
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr_cxx" "$(urcu_nproc)" perf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_perf_percpu.tap b/tests/regression/test_rcutorture_urcu_qsbr_perf_percpu.tap
new file mode 100755 (executable)
index 0000000..8d7c804
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr" "$(urcu_nproc)" perf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_perf_percpu_cxx.tap b/tests/regression/test_rcutorture_urcu_qsbr_perf_percpu_cxx.tap
new file mode 100755 (executable)
index 0000000..21e6e63
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr_cxx" "$(urcu_nproc)" perf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_perf_perthread.tap b/tests/regression/test_rcutorture_urcu_qsbr_perf_perthread.tap
new file mode 100755 (executable)
index 0000000..7058cec
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr" "$(urcu_nproc)" perf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_perf_perthread_cxx.tap b/tests/regression/test_rcutorture_urcu_qsbr_perf_perthread_cxx.tap
new file mode 100755 (executable)
index 0000000..93069f6
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr_cxx" "$(urcu_nproc)" perf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_rperf_global.tap b/tests/regression/test_rcutorture_urcu_qsbr_rperf_global.tap
new file mode 100755 (executable)
index 0000000..3b0c68d
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr" "$(urcu_nproc)" rperf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_rperf_global_cxx.tap b/tests/regression/test_rcutorture_urcu_qsbr_rperf_global_cxx.tap
new file mode 100755 (executable)
index 0000000..d6cf3ff
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr_cxx" "$(urcu_nproc)" rperf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_rperf_percpu.tap b/tests/regression/test_rcutorture_urcu_qsbr_rperf_percpu.tap
new file mode 100755 (executable)
index 0000000..df0bbc8
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr" "$(urcu_nproc)" rperf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_rperf_percpu_cxx.tap b/tests/regression/test_rcutorture_urcu_qsbr_rperf_percpu_cxx.tap
new file mode 100755 (executable)
index 0000000..d722551
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr_cxx" "$(urcu_nproc)" rperf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_rperf_perthread.tap b/tests/regression/test_rcutorture_urcu_qsbr_rperf_perthread.tap
new file mode 100755 (executable)
index 0000000..5fc6d3d
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr" "$(urcu_nproc)" rperf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_rperf_perthread_cxx.tap b/tests/regression/test_rcutorture_urcu_qsbr_rperf_perthread_cxx.tap
new file mode 100755 (executable)
index 0000000..35563ea
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr_cxx" "$(urcu_nproc)" rperf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_stress_global.tap b/tests/regression/test_rcutorture_urcu_qsbr_stress_global.tap
new file mode 100755 (executable)
index 0000000..b7140ab
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr" "$(urcu_nproc)" stress 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_stress_global_cxx.tap b/tests/regression/test_rcutorture_urcu_qsbr_stress_global_cxx.tap
new file mode 100755 (executable)
index 0000000..cd45337
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr_cxx" "$(urcu_nproc)" stress 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_stress_percpu.tap b/tests/regression/test_rcutorture_urcu_qsbr_stress_percpu.tap
new file mode 100755 (executable)
index 0000000..38f3836
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr" "$(urcu_nproc)" stress 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_stress_percpu_cxx.tap b/tests/regression/test_rcutorture_urcu_qsbr_stress_percpu_cxx.tap
new file mode 100755 (executable)
index 0000000..ee9e944
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr_cxx" "$(urcu_nproc)" stress 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_stress_perthread.tap b/tests/regression/test_rcutorture_urcu_qsbr_stress_perthread.tap
new file mode 100755 (executable)
index 0000000..696192d
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr" "$(urcu_nproc)" stress 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_stress_perthread_cxx.tap b/tests/regression/test_rcutorture_urcu_qsbr_stress_perthread_cxx.tap
new file mode 100755 (executable)
index 0000000..4e79a37
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr_cxx" "$(urcu_nproc)" stress 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_uperf_global.tap b/tests/regression/test_rcutorture_urcu_qsbr_uperf_global.tap
new file mode 100755 (executable)
index 0000000..ef8dce8
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr" "$(urcu_nproc)" uperf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_uperf_global_cxx.tap b/tests/regression/test_rcutorture_urcu_qsbr_uperf_global_cxx.tap
new file mode 100755 (executable)
index 0000000..678a9ff
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr_cxx" "$(urcu_nproc)" uperf 1 callrcu_global
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_uperf_percpu.tap b/tests/regression/test_rcutorture_urcu_qsbr_uperf_percpu.tap
new file mode 100755 (executable)
index 0000000..c360c75
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr" "$(urcu_nproc)" uperf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_uperf_percpu_cxx.tap b/tests/regression/test_rcutorture_urcu_qsbr_uperf_percpu_cxx.tap
new file mode 100755 (executable)
index 0000000..24addb9
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr_cxx" "$(urcu_nproc)" uperf 1 callrcu_percpu
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_uperf_perthread.tap b/tests/regression/test_rcutorture_urcu_qsbr_uperf_perthread.tap
new file mode 100755 (executable)
index 0000000..0fd439a
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr" "$(urcu_nproc)" uperf 1 callrcu_perthread
diff --git a/tests/regression/test_rcutorture_urcu_qsbr_uperf_perthread_cxx.tap b/tests/regression/test_rcutorture_urcu_qsbr_uperf_perthread_cxx.tap
new file mode 100755 (executable)
index 0000000..e64df13
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+
+"${URCU_TESTS_BUILDDIR}/regression/rcutorture_urcu_qsbr_cxx" "$(urcu_nproc)" uperf 1 callrcu_perthread
index 8118be7be325d28953e3acf32e61efd19b389ac3..52ccce756b293ab401c4abb6644b4294c51fe8e5 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_fork.c
- *
  * Userspace RCU library - test program (fork)
  * Userspace RCU library - test program (fork)
- *
- * Copyright February 2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <stdio.h>
  */
 
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <assert.h>
 #include <sched.h>
 #include <errno.h>
 
 #include <sched.h>
 #include <errno.h>
 
+#include <urcu/assert.h>
 #include <urcu/arch.h>
 #include <urcu/tls-compat.h>
 
 #include <urcu/arch.h>
 #include <urcu/tls-compat.h>
 
@@ -88,8 +74,8 @@ static void test_rcu(void)
        rcu_read_lock();
        rcu_read_unlock();
 
        rcu_read_lock();
        rcu_read_unlock();
 
-       node = malloc(sizeof(*node));
-       assert(node);
+       node = (struct test_node *) malloc(sizeof(*node));
+       urcu_posix_assert(node);
 
        call_rcu(&node->head, cb);
 
 
        call_rcu(&node->head, cb);
 
@@ -163,7 +149,7 @@ static int do_fork(const char *execname)
        }
 }
 
        }
 }
 
-int main(int argc, char **argv)
+int main(int argc __attribute__((unused)), char **argv)
 {
        unsigned int i;
 
 {
        unsigned int i;
 
diff --git a/tests/regression/test_urcu_fork_cxx.cpp b/tests/regression/test_urcu_fork_cxx.cpp
new file mode 100644 (file)
index 0000000..2f65b46
--- /dev/null
@@ -0,0 +1,5 @@
+// SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "test_urcu_fork.c"
index 5e9b0596fc1570a1b909d78687cb8c36c10419ce..ed256ea0a13358e7fcae0d640f23eba65f88f217 100644 (file)
@@ -1,3 +1,7 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 #include <string.h>
 #include <sys/time.h>
 #include <poll.h>
 #include <string.h>
 #include <sys/time.h>
 #include <poll.h>
@@ -11,9 +15,6 @@
 #ifdef RCU_MEMBARRIER
 #include <urcu.h>
 #endif
 #ifdef RCU_MEMBARRIER
 #include <urcu.h>
 #endif
-#ifdef RCU_SIGNAL
-#include <urcu.h>
-#endif
 #ifdef RCU_MB
 #include <urcu.h>
 #endif
 #ifdef RCU_MB
 #include <urcu.h>
 #endif
diff --git a/tests/regression/urcutorture_cxx.cpp b/tests/regression/urcutorture_cxx.cpp
new file mode 100644 (file)
index 0000000..cacd0bf
--- /dev/null
@@ -0,0 +1,5 @@
+// SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "urcutorture.c"
index 1cc9da316f8aa23df862d9684281e50d460e0425..5884ccbe0dcb9c2c62ff6e396b1bb70e6fe64628 100644 (file)
@@ -1,16 +1,72 @@
-AM_CFLAGS += -I$(top_srcdir)/include -I$(top_builddir)/include -I$(top_srcdir)/src -I$(top_srcdir)/tests/utils -I$(top_srcdir)/tests/common -g
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
+
+AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/tests/utils -I$(top_srcdir)/tests/common
 
 LOG_DRIVER_FLAGS = --merge --comments
 
 LOG_DRIVER_FLAGS = --merge --comments
-LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \
-       $(top_srcdir)/config/tap-driver.sh
+LOG_DRIVER = env AM_TAP_AWK='$(AWK)' \
+       URCU_TESTS_SRCDIR='$(abs_top_srcdir)/tests' \
+       URCU_TESTS_BUILDDIR='$(abs_top_builddir)/tests' \
+       $(SHELL) $(top_srcdir)/tests/utils/tap-driver.sh
 
 
-noinst_PROGRAMS = test_uatomic \
+noinst_PROGRAMS = \
+       get_cpu_mask_from_sysfs \
+       get_cpu_mask_from_sysfs_cxx \
+       get_max_cpuid_from_sysfs \
+       get_max_cpuid_from_sysfs_cxx \
+       test_arch \
+       test_arch_cxx \
+       test_get_max_cpuid_from_mask \
+       test_get_max_cpuid_from_mask_cxx \
+       test_get_possible_cpus_array_len \
+       test_get_possible_cpus_array_len_cxx \
+       test_uatomic \
+       test_uatomic_cxx \
        test_urcu_multiflavor \
        test_urcu_multiflavor \
+       test_urcu_multiflavor_cxx \
        test_urcu_multiflavor_dynlink \
        test_urcu_multiflavor_dynlink \
+       test_urcu_multiflavor_dynlink_cxx \
        test_urcu_multiflavor_single_unit \
        test_urcu_multiflavor_single_unit \
-       test_urcu_multiflavor_single_unit_dynlink
+       test_urcu_multiflavor_single_unit_cxx \
+       test_urcu_multiflavor_single_unit_dynlink \
+       test_urcu_multiflavor_single_unit_dynlink_cxx \
+       test_build \
+       test_build_cxx \
+       test_build_dynlink \
+       test_build_dynlink_cxx
+
+dist_noinst_SCRIPTS = \
+       test_get_cpu_mask_from_sysfs \
+       test_get_cpu_mask_from_sysfs_cxx \
+       test_get_max_cpuid_from_sysfs \
+       test_get_max_cpuid_from_sysfs_cxx
 
 
-TESTS = $(noinst_PROGRAMS)
+TESTS = \
+       test_arch \
+       test_arch_cxx \
+       test_get_cpu_mask_from_sysfs \
+       test_get_cpu_mask_from_sysfs_cxx \
+       test_get_max_cpuid_from_mask \
+       test_get_max_cpuid_from_mask_cxx \
+       test_get_max_cpuid_from_sysfs \
+       test_get_max_cpuid_from_sysfs_cxx \
+       test_get_possible_cpus_array_len \
+       test_get_possible_cpus_array_len_cxx \
+       test_uatomic \
+       test_uatomic_cxx \
+       test_urcu_multiflavor \
+       test_urcu_multiflavor_cxx \
+       test_urcu_multiflavor_dynlink \
+       test_urcu_multiflavor_dynlink_cxx \
+       test_urcu_multiflavor_single_unit \
+       test_urcu_multiflavor_single_unit_cxx \
+       test_urcu_multiflavor_single_unit_dynlink \
+       test_urcu_multiflavor_single_unit_dynlink_cxx \
+       test_build \
+       test_build_cxx \
+       test_build_dynlink \
+       test_build_dynlink_cxx
 
 noinst_HEADERS = test_urcu_multiflavor.h
 
 
 noinst_HEADERS = test_urcu_multiflavor.h
 
@@ -18,53 +74,105 @@ URCU_COMMON_LIB=$(top_builddir)/src/liburcu-common.la
 URCU_LIB=$(top_builddir)/src/liburcu.la
 URCU_QSBR_LIB=$(top_builddir)/src/liburcu-qsbr.la
 URCU_MB_LIB=$(top_builddir)/src/liburcu-mb.la
 URCU_LIB=$(top_builddir)/src/liburcu.la
 URCU_QSBR_LIB=$(top_builddir)/src/liburcu-qsbr.la
 URCU_MB_LIB=$(top_builddir)/src/liburcu-mb.la
-URCU_SIGNAL_LIB=$(top_builddir)/src/liburcu-signal.la
 URCU_BP_LIB=$(top_builddir)/src/liburcu-bp.la
 URCU_CDS_LIB=$(top_builddir)/src/liburcu-cds.la
 TAP_LIB=$(top_builddir)/tests/utils/libtap.a
 
 URCU_BP_LIB=$(top_builddir)/src/liburcu-bp.la
 URCU_CDS_LIB=$(top_builddir)/src/liburcu-cds.la
 TAP_LIB=$(top_builddir)/tests/utils/libtap.a
 
+get_cpu_mask_from_sysfs_cxx_SOURCES = get_cpu_mask_from_sysfs_cxx.cpp
+get_cpu_mask_from_sysfs_SOURCES = get_cpu_mask_from_sysfs.c
+get_max_cpuid_from_sysfs_cxx_SOURCES = get_max_cpuid_from_sysfs_cxx.cpp
+get_max_cpuid_from_sysfs_SOURCES = get_max_cpuid_from_sysfs.c
+
+test_arch_SOURCES = test_arch.c
+test_arch_LDADD = $(URCU_COMMON_LIB) $(TAP_LIB)
+
+test_arch_cxx_SOURCES = test_arch_cxx.cpp
+test_arch_cxx_LDADD = $(URCU_COMMO_LIB) $(TAP_LIB)
+
+test_get_max_cpuid_from_mask_SOURCES = test_get_max_cpuid_from_mask.c
+test_get_max_cpuid_from_mask_LDADD = $(TAP_LIB)
+
+test_get_max_cpuid_from_mask_cxx_SOURCES = test_get_max_cpuid_from_mask_cxx.cpp
+test_get_max_cpuid_from_mask_cxx_LDADD = $(TAP_LIB)
+
+test_get_possible_cpus_array_len_SOURCES = test_get_possible_cpus_array_len.c
+test_get_possible_cpus_array_len_LDADD = $(TAP_LIB)
+
+test_get_possible_cpus_array_len_cxx_SOURCES = test_get_possible_cpus_array_len_cxx.cpp
+test_get_possible_cpus_array_len_cxx_LDADD = $(TAP_LIB)
+
 test_uatomic_SOURCES = test_uatomic.c
 test_uatomic_LDADD = $(URCU_COMMON_LIB) $(TAP_LIB)
 
 test_uatomic_SOURCES = test_uatomic.c
 test_uatomic_LDADD = $(URCU_COMMON_LIB) $(TAP_LIB)
 
+test_uatomic_cxx_SOURCES = test_uatomic_cxx.cpp
+test_uatomic_cxx_LDADD = $(URCU_COMMON_LIB) $(TAP_LIB)
+
 test_urcu_multiflavor_SOURCES = test_urcu_multiflavor.c \
        test_urcu_multiflavor-memb.c \
        test_urcu_multiflavor-mb.c \
 test_urcu_multiflavor_SOURCES = test_urcu_multiflavor.c \
        test_urcu_multiflavor-memb.c \
        test_urcu_multiflavor-mb.c \
-       test_urcu_multiflavor-signal.c \
        test_urcu_multiflavor-qsbr.c \
        test_urcu_multiflavor-bp.c
 test_urcu_multiflavor_LDADD = $(URCU_LIB) $(URCU_MB_LIB) \
        test_urcu_multiflavor-qsbr.c \
        test_urcu_multiflavor-bp.c
 test_urcu_multiflavor_LDADD = $(URCU_LIB) $(URCU_MB_LIB) \
-       $(URCU_SIGNAL_LIB) $(URCU_QSBR_LIB) $(URCU_BP_LIB) $(TAP_LIB)
+       $(URCU_QSBR_LIB) $(URCU_BP_LIB) $(TAP_LIB)
+
+test_urcu_multiflavor_cxx_SOURCES = test_urcu_multiflavor_cxx.cpp \
+       test_urcu_multiflavor-memb_cxx.cpp \
+       test_urcu_multiflavor-mb_cxx.cpp \
+       test_urcu_multiflavor-qsbr_cxx.cpp \
+       test_urcu_multiflavor-bp_cxx.cpp
+test_urcu_multiflavor_cxx_LDADD = $(URCU_LIB) $(URCU_MB_LIB) \
+       $(URCU_QSBR_LIB) $(URCU_BP_LIB) $(TAP_LIB)
 
 test_urcu_multiflavor_dynlink_SOURCES = test_urcu_multiflavor.c \
        test_urcu_multiflavor-memb.c \
        test_urcu_multiflavor-mb.c \
 
 test_urcu_multiflavor_dynlink_SOURCES = test_urcu_multiflavor.c \
        test_urcu_multiflavor-memb.c \
        test_urcu_multiflavor-mb.c \
-       test_urcu_multiflavor-signal.c \
        test_urcu_multiflavor-qsbr.c \
        test_urcu_multiflavor-bp.c
 test_urcu_multiflavor_dynlink_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 test_urcu_multiflavor_dynlink_LDADD = $(URCU_LIB) $(URCU_MB_LIB) \
        test_urcu_multiflavor-qsbr.c \
        test_urcu_multiflavor-bp.c
 test_urcu_multiflavor_dynlink_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 test_urcu_multiflavor_dynlink_LDADD = $(URCU_LIB) $(URCU_MB_LIB) \
-       $(URCU_SIGNAL_LIB) $(URCU_QSBR_LIB) $(URCU_BP_LIB) $(TAP_LIB)
+       $(URCU_QSBR_LIB) $(URCU_BP_LIB) $(TAP_LIB)
+
+test_urcu_multiflavor_dynlink_cxx_SOURCES = test_urcu_multiflavor_cxx.cpp \
+       test_urcu_multiflavor-memb_cxx.cpp \
+       test_urcu_multiflavor-mb_cxx.cpp \
+       test_urcu_multiflavor-qsbr_cxx.cpp \
+       test_urcu_multiflavor-bp_cxx.cpp
+test_urcu_multiflavor_dynlink_cxx_CXXFLAGS = -DDYNAMIC_LINK_TEST $(AM_CXXFLAGS)
+test_urcu_multiflavor_dynlink_cxx_LDADD = $(URCU_LIB) $(URCU_MB_LIB) \
+       $(URCU_QSBR_LIB) $(URCU_BP_LIB) $(TAP_LIB)
 
 test_urcu_multiflavor_single_unit_SOURCES = test_urcu_multiflavor_single_unit.c
 test_urcu_multiflavor_single_unit_LDADD = $(URCU_LIB) $(URCU_MB_LIB) \
 
 test_urcu_multiflavor_single_unit_SOURCES = test_urcu_multiflavor_single_unit.c
 test_urcu_multiflavor_single_unit_LDADD = $(URCU_LIB) $(URCU_MB_LIB) \
-       $(URCU_SIGNAL_LIB) $(URCU_QSBR_LIB) $(URCU_BP_LIB) $(TAP_LIB)
+       $(URCU_QSBR_LIB) $(URCU_BP_LIB) $(TAP_LIB)
+
+test_urcu_multiflavor_single_unit_cxx_SOURCES = test_urcu_multiflavor_single_unit_cxx.cpp
+test_urcu_multiflavor_single_unit_cxx_LDADD = $(URCU_LIB) $(URCU_MB_LIB) \
+       $(URCU_QSBR_LIB) $(URCU_BP_LIB) $(TAP_LIB)
 
 test_urcu_multiflavor_single_unit_dynlink_SOURCES = test_urcu_multiflavor_single_unit.c
 test_urcu_multiflavor_single_unit_dynlink_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 test_urcu_multiflavor_single_unit_dynlink_LDADD = $(URCU_LIB) $(URCU_MB_LIB) \
 
 test_urcu_multiflavor_single_unit_dynlink_SOURCES = test_urcu_multiflavor_single_unit.c
 test_urcu_multiflavor_single_unit_dynlink_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
 test_urcu_multiflavor_single_unit_dynlink_LDADD = $(URCU_LIB) $(URCU_MB_LIB) \
-       $(URCU_SIGNAL_LIB) $(URCU_QSBR_LIB) $(URCU_BP_LIB) $(TAP_LIB)
-
-all-local:
-       @if [ x"$(srcdir)" != x"$(builddir)" ]; then \
-               for script in $(SCRIPT_LIST); do \
-                       cp -f $(srcdir)/$$script $(builddir); \
-               done; \
-       fi
-
-clean-local:
-       @if [ x"$(srcdir)" != x"$(builddir)" ]; then \
-               for script in $(SCRIPT_LIST); do \
-                       rm -f $(builddir)/$$script; \
-               done; \
-       fi
+       $(URCU_QSBR_LIB) $(URCU_BP_LIB) $(TAP_LIB)
+
+test_urcu_multiflavor_single_unit_dynlink_cxx_SOURCES = test_urcu_multiflavor_single_unit_cxx.cpp
+test_urcu_multiflavor_single_unit_dynlink_cxx_CXXFLAGS = -DDYNAMIC_LINK_TEST $(AM_CXXFLAGS)
+test_urcu_multiflavor_single_unit_dynlink_cxx_LDADD = $(URCU_LIB) $(URCU_MB_LIB) \
+       $(URCU_QSBR_LIB) $(URCU_BP_LIB) $(TAP_LIB)
+
+test_build_SOURCES = \
+       test_build.c
+test_build_LDADD = $(URCU_COMMON_LIB) $(URCU_CDS_LIB) $(TAP_LIB)
+
+test_build_cxx_SOURCES = \
+       test_build_cxx.cpp
+test_build_cxx_LDADD = $(URCU_COMMON_LIB) $(URCU_CDS_LIB) $(TAP_LIB)
+
+test_build_dynlink_SOURCES = \
+       test_build.c
+test_build_dynlink_CFLAGS = -DDYNAMIC_LINK_TEST $(AM_CFLAGS)
+test_build_dynlink_LDADD = $(URCU_LIB) $(URCU_COMMON_LIB) $(URCU_CDS_LIB) $(TAP_LIB)
 
 
+test_build_dynlink_cxx_SOURCES = \
+       test_build_cxx.cpp
+test_build_dynlink_cxx_CXXFLAGS = -DDYNAMIC_LINK_TEST $(AM_CXXFLAGS)
+test_build_dynlink_cxx_LDADD = $(URCU_LIB) $(URCU_COMMON_LIB) $(URCU_CDS_LIB) $(TAP_LIB)
diff --git a/tests/unit/get_cpu_mask_from_sysfs.c b/tests/unit/get_cpu_mask_from_sysfs.c
new file mode 100644 (file)
index 0000000..7938f23
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * Copyright (C) 2022 Michael Jeanson <mjeanson@efficios.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef __linux__
+
+#include "compat-smp.h"
+
+int main(int argc, char *argv[])
+{
+       int ret;
+       char buf[URCU_CPUMASK_SIZE];
+
+       if( argc < 2 ) {
+               fprintf(stderr, "Missing argument.\n");
+               return EXIT_FAILURE;
+       }
+
+       ret = get_cpu_mask_from_sysfs((char *) &buf, URCU_CPUMASK_SIZE, argv[1]);
+
+       printf("%s", buf);
+
+       if (ret >= 0)
+               return EXIT_SUCCESS;
+       else
+               return EXIT_FAILURE;
+}
+
+#else
+
+int main(void)
+{
+       return EXIT_SUCCESS;
+}
+#endif
diff --git a/tests/unit/get_cpu_mask_from_sysfs_cxx.cpp b/tests/unit/get_cpu_mask_from_sysfs_cxx.cpp
new file mode 100644 (file)
index 0000000..a413f3c
--- /dev/null
@@ -0,0 +1,5 @@
+// SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "get_cpu_mask_from_sysfs.c"
diff --git a/tests/unit/get_max_cpuid_from_sysfs.c b/tests/unit/get_max_cpuid_from_sysfs.c
new file mode 100644 (file)
index 0000000..37c4b3d
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * Copyright (C) 2022 Michael Jeanson <mjeanson@efficios.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef __linux__
+
+#include "compat-smp.h"
+
+int main(int argc, char *argv[])
+{
+       int ret;
+
+       if( argc < 2 ) {
+               fprintf(stderr, "Missing argument.\n");
+               return EXIT_FAILURE;
+       }
+
+       ret = _get_max_cpuid_from_sysfs(argv[1]);
+
+       printf("%d\n", ret);
+
+       if (ret >= 0)
+               return EXIT_SUCCESS;
+       else
+               return EXIT_FAILURE;
+}
+
+#else
+
+int main(void)
+{
+       return EXIT_SUCCESS;
+}
+#endif
diff --git a/tests/unit/get_max_cpuid_from_sysfs_cxx.cpp b/tests/unit/get_max_cpuid_from_sysfs_cxx.cpp
new file mode 100644 (file)
index 0000000..4e46dfb
--- /dev/null
@@ -0,0 +1,5 @@
+// SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "get_max_cpuid_from_sysfs.c"
diff --git a/tests/unit/test_arch.c b/tests/unit/test_arch.c
new file mode 100644 (file)
index 0000000..141c564
--- /dev/null
@@ -0,0 +1,34 @@
+// SPDX-FileCopyrightText: 2021 Michael Jeanson <mjeanson@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include <stdio.h>
+#include <urcu/arch.h>
+
+#include "tap.h"
+
+#define NR_TESTS 1
+
+
+/*
+ * This is only to make sure the static inline caa_get_cycles() in the public
+ * headers builds properly.
+ */
+static
+void test_caa_get_cycles(void) {
+       caa_cycles_t cycles = 0;
+
+
+       cycles = caa_get_cycles();
+
+       ok(cycles != 0, "caa_get_cycles works");
+}
+
+int main(void)
+{
+       plan_tests(NR_TESTS);
+
+       test_caa_get_cycles();
+
+       return exit_status();
+}
diff --git a/tests/unit/test_arch_cxx.cpp b/tests/unit/test_arch_cxx.cpp
new file mode 100644 (file)
index 0000000..6c6c972
--- /dev/null
@@ -0,0 +1,5 @@
+// SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "test_arch.c"
diff --git a/tests/unit/test_build.c b/tests/unit/test_build.c
new file mode 100644 (file)
index 0000000..99ddbcd
--- /dev/null
@@ -0,0 +1,135 @@
+// SPDX-FileCopyrightText: 2021 Simon Marchi <simon.marchi@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+/*
+ * This file is meant to verify that headers are compatible with both C and
+ * C++.  It includes all exported headers and is compiled as C and C++ source.
+ */
+
+#ifndef DYNAMIC_LINK_TEST
+# define _LGPL_SOURCE
+#endif
+
+#include <urcu/arch.h>
+#include <urcu/call-rcu.h>
+#include <urcu/cds.h>
+#include <urcu/compiler.h>
+#include <urcu/debug.h>
+#include <urcu/defer.h>
+#include <urcu/flavor.h>
+#include <urcu/futex.h>
+#include <urcu/hlist.h>
+#include <urcu/lfstack.h>
+#include <urcu/list.h>
+#include <urcu/pointer.h>
+#include <urcu/rcuhlist.h>
+#include <urcu/rculfhash.h>
+#include <urcu/rculfqueue.h>
+#include <urcu/rculfstack.h>
+#include <urcu/rculist.h>
+#include <urcu/ref.h>
+#include <urcu/syscall-compat.h>
+#include <urcu/system.h>
+#include <urcu/tls-compat.h>
+#include <urcu/uatomic.h>
+#include <urcu/urcu-bp.h>
+#include <urcu/urcu.h>
+#include <urcu/urcu-mb.h>
+#include <urcu/urcu-memb.h>
+#include <urcu/urcu-qsbr.h>
+#include <urcu/wfcqueue.h>
+#include <urcu/wfqueue.h>
+#include <urcu/wfstack.h>
+
+#include "tap.h"
+
+struct my_tls_struct {
+       int int1;
+       char char1;
+       void *void1;
+};
+
+static DEFINE_URCU_TLS(int, my_tls_int);
+static DEFINE_URCU_TLS(struct my_tls_struct, my_tls_struct);
+
+static void test_lfstack(void)
+{
+       struct cds_lfs_stack s;
+
+       cds_lfs_init(&s);
+       ok(cds_lfs_empty(&s), "cds_lfs_empty");
+}
+
+static void test_wfstack(void)
+{
+       struct cds_wfs_stack s;
+
+       cds_wfs_init(&s);
+       ok(cds_wfs_empty(&s), "cds_lfs_empty");
+}
+
+static void test_wfcqueue(void)
+{
+       struct cds_wfcq_head head;
+       struct cds_wfcq_tail tail;
+
+       cds_wfcq_init(&head, &tail);
+       ok(cds_wfcq_empty(&head, &tail), "cds_wfcq_empty");
+}
+
+static
+void test_build_cds_list_head_init(void)
+{
+       /* Test that the CDS_LIST_HEAD_INIT macro builds correctly.  */
+       struct struct_with_list {
+               struct cds_list_head head;
+       };
+
+       struct struct_with_list list = {
+               .head = CDS_LIST_HEAD_INIT(list.head),
+       };
+}
+
+static
+void test_urcu_tls(void)
+{
+       URCU_TLS(my_tls_int) = 1;
+       URCU_TLS(my_tls_struct).int1 = 1;
+       URCU_TLS(my_tls_struct).char1 = 'a';
+       URCU_TLS(my_tls_struct).void1 = NULL;
+}
+
+struct an_opaque_struct;
+struct a_clear_struct
+{
+       int x;
+};
+
+static
+void test_build_rcu_dereference(void)
+{
+       static struct an_opaque_struct *opaque = NULL;
+       static struct an_opaque_struct *const opaque_const = NULL;
+       static struct a_clear_struct *clear = NULL;
+       static struct a_clear_struct *const clear_const = NULL;
+
+       (void) rcu_dereference(opaque);
+       (void) rcu_dereference(opaque_const);
+       (void) rcu_dereference(clear);
+       (void) rcu_dereference(clear_const);
+}
+
+int main(void)
+{
+       plan_tests(3);
+
+       test_lfstack();
+       test_wfstack();
+       test_wfcqueue();
+       test_build_cds_list_head_init();
+       test_urcu_tls();
+       test_build_rcu_dereference();
+
+       return exit_status();
+}
diff --git a/tests/unit/test_build_cxx.cpp b/tests/unit/test_build_cxx.cpp
new file mode 100644 (file)
index 0000000..0d557e5
--- /dev/null
@@ -0,0 +1,5 @@
+// SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "test_build.c"
diff --git a/tests/unit/test_get_cpu_mask_from_sysfs b/tests/unit/test_get_cpu_mask_from_sysfs
new file mode 100755 (executable)
index 0000000..0709892
--- /dev/null
@@ -0,0 +1,58 @@
+#!/usr/bin/env bash
+
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+# shellcheck source=../../utils/tap.sh
+source "$URCU_TESTS_SRCDIR/utils/tap.sh"
+
+CURDIR="${URCU_TESTS_BUILDDIR}/unit"
+
+NUM_TESTS=8
+
+TESTFILE=$(mktemp)
+
+populate_testfile() {
+       local cpumask="$1"
+
+       # shellcheck disable=SC2059
+       printf "$cpumask" > "$TESTFILE"
+}
+
+test_test_get_cpu_mask_from_sysfs() {
+       local cpumask="$1"
+       local result
+
+       # Without '\n'
+       populate_testfile "$cpumask"
+       result=$("${CURDIR}/get_cpu_mask_from_sysfs" "$TESTFILE")
+       test "$cpumask" == "$result"
+       ok $? "test_get_cpu_mask_from_sysfs - without '\n' expected: '$cpumask', result: '$result'"
+
+       # With '\n'
+       populate_testfile "$cpumask\n"
+       result=$("${CURDIR}/get_cpu_mask_from_sysfs" "$TESTFILE")
+       test "$cpumask" == "$result"
+       ok $? "test_get_cpu_mask_from_sysfs - with '\n' expected: '$cpumask', result: '$result'"
+}
+
+if [ "$URCU_TESTS_OS_TYPE" == "linux" ]; then
+       plan_tests $NUM_TESTS
+
+       test_test_get_cpu_mask_from_sysfs ""
+       test_test_get_cpu_mask_from_sysfs "0"
+       test_test_get_cpu_mask_from_sysfs "0-3"
+       test_test_get_cpu_mask_from_sysfs "0,3-7,9"
+else
+       plan_skip_all "Linux specific tests."
+fi
diff --git a/tests/unit/test_get_cpu_mask_from_sysfs_cxx b/tests/unit/test_get_cpu_mask_from_sysfs_cxx
new file mode 100755 (executable)
index 0000000..4ed4ebd
--- /dev/null
@@ -0,0 +1,58 @@
+#!/usr/bin/env bash
+
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+# shellcheck source=../../utils/tap.sh
+source "$URCU_TESTS_SRCDIR/utils/tap.sh"
+
+CURDIR="${URCU_TESTS_BUILDDIR}/unit"
+
+NUM_TESTS=8
+
+TESTFILE=$(mktemp)
+
+populate_testfile() {
+       local cpumask="$1"
+
+       # shellcheck disable=SC2059
+       printf "$cpumask" > "$TESTFILE"
+}
+
+test_test_get_cpu_mask_from_sysfs_cxx() {
+       local cpumask="$1"
+       local result
+
+       # Without '\n'
+       populate_testfile "$cpumask"
+       result=$("${CURDIR}/get_cpu_mask_from_sysfs_cxx" "$TESTFILE")
+       test "$cpumask" == "$result"
+       ok $? "test_get_cpu_mask_from_sysfs_cxx - without '\n' expected: '$cpumask', result: '$result'"
+
+       # With '\n'
+       populate_testfile "$cpumask\n"
+       result=$("${CURDIR}/get_cpu_mask_from_sysfs_cxx" "$TESTFILE")
+       test "$cpumask" == "$result"
+       ok $? "test_get_cpu_mask_from_sysfs_cxx - with '\n' expected: '$cpumask', result: '$result'"
+}
+
+if [ "$URCU_TESTS_OS_TYPE" == "linux" ]; then
+       plan_tests $NUM_TESTS
+
+       test_test_get_cpu_mask_from_sysfs_cxx ""
+       test_test_get_cpu_mask_from_sysfs_cxx "0"
+       test_test_get_cpu_mask_from_sysfs_cxx "0-3"
+       test_test_get_cpu_mask_from_sysfs_cxx "0,3-7,9"
+else
+       plan_skip_all "Linux specific tests."
+fi
diff --git a/tests/unit/test_get_max_cpuid_from_mask.c b/tests/unit/test_get_max_cpuid_from_mask.c
new file mode 100644 (file)
index 0000000..25a2417
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * Copyright (C) 2022 Michael Jeanson <mjeanson@efficios.com>
+ */
+
+#include <string.h>
+
+#include "tap.h"
+
+#include "compat-smp.h"
+
+#ifdef __linux__
+struct parse_test_data {
+       const char *buf;
+       int expected;
+};
+
+static struct parse_test_data parse_test_data[] = {
+       { "", -1 },
+       { "abc", -1 },
+       { ",,,", -1 },
+       { "--", -1 },
+       { ",", -1 },
+       { "-", -1 },
+       { "2147483647", -1 },
+       { "18446744073709551615", -1 },
+       { "0-2147483647", -1 },
+       { "0-18446744073709551615", -1 },
+       { "0", 0 },
+       { "1", 1 },
+       { "0-1", 1 },
+       { "1-3", 3 },
+       { "0,2", 2 },
+       { "1,2", 2 },
+       { "0,4-6,127", 127 },
+       { "0-4095", 4095 },
+
+       { "\n", -1 },
+       { "abc\n", -1 },
+       { ",,,\n", -1 },
+       { "--\n", -1 },
+       { ",\n", -1 },
+       { "-\n", -1 },
+       { "2147483647\n", -1 },
+       { "18446744073709551615\n", -1 },
+       { "0-2147483647\n", -1 },
+       { "0-18446744073709551615\n", -1 },
+       { "0\n", 0 },
+       { "1\n", 1 },
+       { "0-1\n", 1 },
+       { "1-3\n", 3 },
+       { "0,2\n", 2 },
+       { "1,2\n", 2 },
+       { "0,4-6,127\n", 127 },
+       { "0-4095\n", 4095 },
+};
+
+static int parse_test_data_len = sizeof(parse_test_data) / sizeof(parse_test_data[0]);
+
+int main(void)
+{
+       int ret, i;
+
+       plan_tests(parse_test_data_len);
+
+       diag("Testing smp helpers");
+
+       for (i = 0; i < parse_test_data_len; i++) {
+               ret = get_max_cpuid_from_mask(parse_test_data[i].buf,
+                               strlen(parse_test_data[i].buf));
+               ok(ret == parse_test_data[i].expected,
+                       "get_max_cpuid_from_mask '%s', expected: '%d', result: '%d'",
+                       parse_test_data[i].buf, parse_test_data[i].expected, ret);
+       }
+
+       return exit_status();
+}
+
+#else
+
+int main(void)
+{
+       plan_skip_all("Linux specific tests.");
+
+       return exit_status();
+}
+#endif
diff --git a/tests/unit/test_get_max_cpuid_from_mask_cxx.cpp b/tests/unit/test_get_max_cpuid_from_mask_cxx.cpp
new file mode 100644 (file)
index 0000000..bd91459
--- /dev/null
@@ -0,0 +1,5 @@
+// SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "test_get_max_cpuid_from_mask.c"
diff --git a/tests/unit/test_get_max_cpuid_from_sysfs b/tests/unit/test_get_max_cpuid_from_sysfs
new file mode 100755 (executable)
index 0000000..7c0abce
--- /dev/null
@@ -0,0 +1,96 @@
+#!/usr/bin/env bash
+
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+# shellcheck source=../../utils/tap.sh
+source "$URCU_TESTS_SRCDIR/utils/tap.sh"
+
+CURDIR="${URCU_TESTS_BUILDDIR}/unit"
+
+STD_OUTPUT="/dev/null"
+STD_ERROR="/dev/null"
+
+NUM_TESTS=13
+
+TESTDIR=$(mktemp -d)
+
+populate_testdir() {
+       local cpus=("$@")
+
+       mkdir "$TESTDIR"
+
+       for i in "${cpus[@]}"; do
+               mkdir "$TESTDIR/$i"
+       done
+}
+
+test_get_max_cpuid_from_sysfs() {
+       local num_cpus=$1
+       shift
+       local current_cpus=("$@")
+       local result
+
+       populate_testdir "${current_cpus[@]}" >"$STD_OUTPUT" 2>"$STD_ERROR"
+       result=$("${CURDIR}/get_max_cpuid_from_sysfs" "$TESTDIR")
+       is "$result" "$num_cpus" "get_max_cpuid_from_sysfs - cpu set: '${current_cpus[*]}', expected: '$num_cpus', result: '$result'"
+       rm -rf "$TESTDIR"
+}
+
+if [ "$URCU_TESTS_OS_TYPE" == "linux" ]; then
+       plan_tests $NUM_TESTS
+
+       diag "get_max_cpuid_from_sysfs"
+
+       test_data=(0 "cpu0")
+       test_get_max_cpuid_from_sysfs "${test_data[@]}"
+
+       test_data=(1 "cpu0" "cpu1")
+       test_get_max_cpuid_from_sysfs "${test_data[@]}"
+
+       test_data=(1 "cpu1" "cpu0")
+       test_get_max_cpuid_from_sysfs "${test_data[@]}"
+
+       test_data=(3 "cpu3")
+       test_get_max_cpuid_from_sysfs "${test_data[@]}"
+
+       test_data=(99 "cpu99")
+       test_get_max_cpuid_from_sysfs "${test_data[@]}"
+
+       test_data=(3 "cpu0" "cpu3")
+       test_get_max_cpuid_from_sysfs "${test_data[@]}"
+
+       test_data=(3 "cpufreq" "cpuidle" "cpu0" "cpu1" "cpu2" "cpu3")
+       test_get_max_cpuid_from_sysfs "${test_data[@]}"
+
+       test_data=(0 "cpu" "cpu0")
+       test_get_max_cpuid_from_sysfs "${test_data[@]}"
+
+       test_data=(5 "cpu" "cpu5")
+       test_get_max_cpuid_from_sysfs "${test_data[@]}"
+
+
+       test_data=(-1 "toto")
+       test_get_max_cpuid_from_sysfs "${test_data[@]}"
+
+       test_data=(-1 "cpu")
+       test_get_max_cpuid_from_sysfs "${test_data[@]}"
+
+       test_data=(-1 "cpua" "cpud")
+       test_get_max_cpuid_from_sysfs "${test_data[@]}"
+
+       test_data=(-1 "cpufreq" "cpuidle")
+       test_get_max_cpuid_from_sysfs "${test_data[@]}"
+else
+       plan_skip_all "Linux specific tests."
+fi
diff --git a/tests/unit/test_get_max_cpuid_from_sysfs_cxx b/tests/unit/test_get_max_cpuid_from_sysfs_cxx
new file mode 100755 (executable)
index 0000000..2283a04
--- /dev/null
@@ -0,0 +1,96 @@
+#!/usr/bin/env bash
+
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+if [ "x${URCU_TESTS_SRCDIR:-}" != "x" ]; then
+       UTILSSH="$URCU_TESTS_SRCDIR/utils/utils.sh"
+else
+       UTILSSH="$(dirname "$0")/../utils/utils.sh"
+fi
+
+# shellcheck source=../utils/utils.sh
+source "$UTILSSH"
+
+# shellcheck source=../../utils/tap.sh
+source "$URCU_TESTS_SRCDIR/utils/tap.sh"
+
+CURDIR="${URCU_TESTS_BUILDDIR}/unit"
+
+STD_OUTPUT="/dev/null"
+STD_ERROR="/dev/null"
+
+NUM_TESTS=13
+
+TESTDIR=$(mktemp -d)
+
+populate_testdir() {
+       local cpus=("$@")
+
+       mkdir "$TESTDIR"
+
+       for i in "${cpus[@]}"; do
+               mkdir "$TESTDIR/$i"
+       done
+}
+
+test_get_max_cpuid_from_sysfs_cxx() {
+       local num_cpus=$1
+       shift
+       local current_cpus=("$@")
+       local result
+
+       populate_testdir "${current_cpus[@]}" >"$STD_OUTPUT" 2>"$STD_ERROR"
+       result=$("${CURDIR}/get_max_cpuid_from_sysfs_cxx" "$TESTDIR")
+       is "$result" "$num_cpus" "get_max_cpuid_from_sysfs_cxx - cpu set: '${current_cpus[*]}', expected: '$num_cpus', result: '$result'"
+       rm -rf "$TESTDIR"
+}
+
+if [ "$URCU_TESTS_OS_TYPE" == "linux" ]; then
+       plan_tests $NUM_TESTS
+
+       diag "get_max_cpuid_from_sysfs_cxx"
+
+       test_data=(0 "cpu0")
+       test_get_max_cpuid_from_sysfs_cxx "${test_data[@]}"
+
+       test_data=(1 "cpu0" "cpu1")
+       test_get_max_cpuid_from_sysfs_cxx "${test_data[@]}"
+
+       test_data=(1 "cpu1" "cpu0")
+       test_get_max_cpuid_from_sysfs_cxx "${test_data[@]}"
+
+       test_data=(3 "cpu3")
+       test_get_max_cpuid_from_sysfs_cxx "${test_data[@]}"
+
+       test_data=(99 "cpu99")
+       test_get_max_cpuid_from_sysfs_cxx "${test_data[@]}"
+
+       test_data=(3 "cpu0" "cpu3")
+       test_get_max_cpuid_from_sysfs_cxx "${test_data[@]}"
+
+       test_data=(3 "cpufreq" "cpuidle" "cpu0" "cpu1" "cpu2" "cpu3")
+       test_get_max_cpuid_from_sysfs_cxx "${test_data[@]}"
+
+       test_data=(0 "cpu" "cpu0")
+       test_get_max_cpuid_from_sysfs_cxx "${test_data[@]}"
+
+       test_data=(5 "cpu" "cpu5")
+       test_get_max_cpuid_from_sysfs_cxx "${test_data[@]}"
+
+
+       test_data=(-1 "toto")
+       test_get_max_cpuid_from_sysfs_cxx "${test_data[@]}"
+
+       test_data=(-1 "cpu")
+       test_get_max_cpuid_from_sysfs_cxx "${test_data[@]}"
+
+       test_data=(-1 "cpua" "cpud")
+       test_get_max_cpuid_from_sysfs_cxx "${test_data[@]}"
+
+       test_data=(-1 "cpufreq" "cpuidle")
+       test_get_max_cpuid_from_sysfs_cxx "${test_data[@]}"
+else
+       plan_skip_all "Linux specific tests."
+fi
diff --git a/tests/unit/test_get_possible_cpus_array_len.c b/tests/unit/test_get_possible_cpus_array_len.c
new file mode 100644 (file)
index 0000000..c5ab2b4
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * Copyright (C) 2022 Michael Jeanson <mjeanson@efficios.com>
+ */
+
+#include <stdio.h>
+
+#include "tap.h"
+
+#include "compat-smp.h"
+
+int main(void)
+{
+       int ret;
+
+       plan_tests(2);
+
+       ret = get_possible_cpus_array_len();
+       ok(ret > 0, "get_possible_cpus_array_len (%d > 0)", ret);
+
+#ifdef __linux__
+       ret = get_num_possible_cpus_fallback();
+       ok(ret > 0, "get_num_possible_cpus_fallback (%d > 0)", ret);
+#else
+       skip(1, "Linux specific test.");
+#endif
+
+       return exit_status();
+}
diff --git a/tests/unit/test_get_possible_cpus_array_len_cxx.cpp b/tests/unit/test_get_possible_cpus_array_len_cxx.cpp
new file mode 100644 (file)
index 0000000..536c509
--- /dev/null
@@ -0,0 +1,5 @@
+// SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "test_get_possible_cpus_array_len.c"
diff --git a/tests/unit/test_lfstack.c b/tests/unit/test_lfstack.c
new file mode 100644 (file)
index 0000000..03d1632
--- /dev/null
@@ -0,0 +1,78 @@
+// SPDX-FileCopyrightText: 2023 Olivier Dion <odion@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+/*
+ * test_lfstack.c
+ *
+ * Userspace RCU library - test wftack race conditions
+ */
+
+#define _LGPL_SOURCE
+
+#include <stdlib.h>
+
+#include <pthread.h>
+
+#include <urcu/lfstack.h>
+
+#include "tap.h"
+
+#define NR_TESTS 1
+#define NR_PRODUCERS 4
+#define LOOP 100
+
+static void async_run(struct cds_lfs_stack *queue)
+{
+       struct cds_lfs_node *node = malloc(sizeof(*node));
+
+       cds_lfs_node_init(node);
+
+       cds_lfs_push(queue, node);
+}
+
+static void *async_loop(void *queue)
+{
+       size_t k = 0;
+
+       while (k < LOOP * NR_PRODUCERS) {
+               free(cds_lfs_pop_blocking(queue));
+               ++k;
+       }
+
+       return NULL;
+}
+
+static void *spawn_jobs(void *queue)
+{
+       for (size_t k = 0; k < LOOP; ++k) {
+               async_run(queue);
+       }
+
+       return 0;
+}
+
+int main(void)
+{
+       pthread_t consumer;
+       pthread_t producers[NR_PRODUCERS];
+       struct cds_lfs_stack queue;
+
+       plan_tests(NR_TESTS);
+
+       cds_lfs_init(&queue);
+       pthread_create(&consumer, NULL, async_loop, &queue);
+
+       for (size_t k = 0; k < NR_PRODUCERS; ++k) {
+               pthread_create(&producers[k], NULL, spawn_jobs, &queue);
+       }
+
+       pthread_join(consumer, NULL);
+       for (size_t k = 0; k < NR_PRODUCERS; ++k) {
+               pthread_join(producers[k], NULL);
+       }
+
+       ok1("No race conditions");
+
+       return exit_status();
+}
index fe2a6c1b8751794190261539d9cb276958fcee48..d9c70e0ac912747d5a68fcf7ee90872b0e25a3e8 100644 (file)
@@ -1,24 +1,6 @@
-/*
- * test_uatomic.c
- *
- * Userspace RCU library - test atomic operations
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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.
- */
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
 
 #include <stdio.h>
 #include <urcu/uatomic.h>
 
 #include <stdio.h>
 #include <urcu/uatomic.h>
 
 #define NR_TESTS 17
 
 
 #define NR_TESTS 17
 
+#define BYTE_PER_LONG  (sizeof(unsigned long) / sizeof(unsigned char))
+#define SHORT_PER_LONG (sizeof(unsigned long) / sizeof(unsigned short))
+#define INT_PER_LONG   (sizeof(unsigned long) / sizeof(unsigned int))
+
 struct testvals {
 #ifdef UATOMIC_HAS_ATOMIC_BYTE
 struct testvals {
 #ifdef UATOMIC_HAS_ATOMIC_BYTE
-       unsigned char c;
+       unsigned char c[BYTE_PER_LONG];
 #endif
 #ifdef UATOMIC_HAS_ATOMIC_SHORT
 #endif
 #ifdef UATOMIC_HAS_ATOMIC_SHORT
-       unsigned short s;
+       unsigned short s[SHORT_PER_LONG];
 #endif
 #endif
-       unsigned int i;
+       unsigned int i[INT_PER_LONG];
        unsigned long l;
 };
 
        unsigned long l;
 };
 
@@ -91,27 +77,38 @@ do {                                                \
                                                \
 } while (0)
 
                                                \
 } while (0)
 
-int main(int argc, char **argv)
+int main(void)
 {
 {
-       int nr_run = 2;
+       int nr_run = INT_PER_LONG + 1;
+       unsigned long i;
+
 #ifdef UATOMIC_HAS_ATOMIC_BYTE
 #ifdef UATOMIC_HAS_ATOMIC_BYTE
-       nr_run += 1;
+       nr_run += BYTE_PER_LONG;
 #endif
 #ifdef UATOMIC_HAS_ATOMIC_SHORT
 #endif
 #ifdef UATOMIC_HAS_ATOMIC_SHORT
-       nr_run += 1;
+       nr_run += SHORT_PER_LONG;
 #endif
 
        plan_tests(nr_run * NR_TESTS);
 #ifdef UATOMIC_HAS_ATOMIC_BYTE
 #endif
 
        plan_tests(nr_run * NR_TESTS);
 #ifdef UATOMIC_HAS_ATOMIC_BYTE
-       diag("Test atomic ops on byte");
-       do_test(&vals.c);
+       for (i = 0; i < BYTE_PER_LONG; i++) {
+               diag("Test atomic ops on byte with %lu byte offset from long alignment",
+                       i);
+               do_test(&vals.c[i]);
+       }
 #endif
 #ifdef UATOMIC_HAS_ATOMIC_SHORT
 #endif
 #ifdef UATOMIC_HAS_ATOMIC_SHORT
-       diag("Test atomic ops on short");
-       do_test(&vals.s);
+       for (i = 0; i < SHORT_PER_LONG; i++) {
+               diag("Test atomic ops on short with %lu byte offset from long alignment",
+                       i * sizeof(unsigned short));
+               do_test(&vals.s[i]);
+       }
 #endif
 #endif
-       diag("Test atomic ops on int");
-       do_test(&vals.i);
+       for (i = 0; i < INT_PER_LONG; i++) {
+               diag("Test atomic ops on int with %lu byte offset from long alignment",
+                       i * sizeof(unsigned int));
+               do_test(&vals.i[i]);
+       }
        diag("Test atomic ops on long");
        do_test(&vals.l);
 
        diag("Test atomic ops on long");
        do_test(&vals.l);
 
diff --git a/tests/unit/test_uatomic_cxx.cpp b/tests/unit/test_uatomic_cxx.cpp
new file mode 100644 (file)
index 0000000..0f9e275
--- /dev/null
@@ -0,0 +1,5 @@
+// SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "test_uatomic.c"
index 199818b69c185ea3601f4525f76bfdf488d4b685..460cfa6129afb4831529b719031463a62dce4c09 100644 (file)
@@ -1,30 +1,15 @@
+// SPDX-FileCopyrightText: 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_multiflavor-bp.c
- *
  * Userspace RCU library - test multiple RCU flavors into one program
  * Userspace RCU library - test multiple RCU flavors into one program
- *
- * Copyright February 2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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.
  */
 
 #ifndef DYNAMIC_LINK_TEST
 #define _LGPL_SOURCE
 #endif
 
  */
 
 #ifndef DYNAMIC_LINK_TEST
 #define _LGPL_SOURCE
 #endif
 
-#define RCU_SIGNAL
 #include <urcu-bp.h>
 #include "test_urcu_multiflavor.h"
 
 #include <urcu-bp.h>
 #include "test_urcu_multiflavor.h"
 
diff --git a/tests/unit/test_urcu_multiflavor-bp_cxx.cpp b/tests/unit/test_urcu_multiflavor-bp_cxx.cpp
new file mode 100644 (file)
index 0000000..d38d159
--- /dev/null
@@ -0,0 +1,5 @@
+// SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "test_urcu_multiflavor-bp.c"
index e4ba6a4d0d3e2fd83ffdf67997f23e9bad180b71..e2d48781aecb1b13cb08cf63c291618015dd7c3b 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_multiflavor-mb.c
- *
  * Userspace RCU library - test multiple RCU flavors into one program
  * Userspace RCU library - test multiple RCU flavors into one program
- *
- * Copyright February 2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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.
  */
 
 #ifndef DYNAMIC_LINK_TEST
  */
 
 #ifndef DYNAMIC_LINK_TEST
diff --git a/tests/unit/test_urcu_multiflavor-mb_cxx.cpp b/tests/unit/test_urcu_multiflavor-mb_cxx.cpp
new file mode 100644 (file)
index 0000000..67691de
--- /dev/null
@@ -0,0 +1,5 @@
+// SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "test_urcu_multiflavor-mb.c"
index 583f2e14041f047f1a138d1b88285bc139ba5aec..43d0afa555303ce7b69a5c323968123012e9a16f 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_multiflavor-memb.c
- *
  * Userspace RCU library - test multiple RCU flavors into one program
  * Userspace RCU library - test multiple RCU flavors into one program
- *
- * Copyright February 2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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.
  */
 
 #ifndef DYNAMIC_LINK_TEST
  */
 
 #ifndef DYNAMIC_LINK_TEST
diff --git a/tests/unit/test_urcu_multiflavor-memb_cxx.cpp b/tests/unit/test_urcu_multiflavor-memb_cxx.cpp
new file mode 100644 (file)
index 0000000..d9fabef
--- /dev/null
@@ -0,0 +1,5 @@
+// SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "test_urcu_multiflavor-memb.c"
index 64f32f4e30547fb12449c70423ed27c782dfdeb6..fa478cae67523582cf6433170a1e156d00600cc0 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_multiflavor-qsbr.c
- *
  * Userspace RCU library - test multiple RCU flavors into one program
  * Userspace RCU library - test multiple RCU flavors into one program
- *
- * Copyright February 2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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.
  */
 
 #ifndef DYNAMIC_LINK_TEST
  */
 
 #ifndef DYNAMIC_LINK_TEST
diff --git a/tests/unit/test_urcu_multiflavor-qsbr_cxx.cpp b/tests/unit/test_urcu_multiflavor-qsbr_cxx.cpp
new file mode 100644 (file)
index 0000000..b52f783
--- /dev/null
@@ -0,0 +1,5 @@
+// SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "test_urcu_multiflavor-qsbr.c"
diff --git a/tests/unit/test_urcu_multiflavor-signal.c b/tests/unit/test_urcu_multiflavor-signal.c
deleted file mode 100644 (file)
index 816c615..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * test_urcu_multiflavor-signal.c
- *
- * Userspace RCU library - test multiple RCU flavors into one program
- *
- * Copyright February 2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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.
- */
-
-#ifndef DYNAMIC_LINK_TEST
-#define _LGPL_SOURCE
-#endif
-
-#define RCU_SIGNAL
-#include <urcu.h>
-#include "test_urcu_multiflavor.h"
-
-int test_mf_signal(void)
-{
-       rcu_register_thread();
-       rcu_read_lock();
-       rcu_read_unlock();
-       synchronize_rcu();
-       rcu_unregister_thread();
-       return 0;
-}
index 192884eb239b70de1468da954eed609b15523338..ef7605a1d90c0a47efc7b51d65ff0b41ddb351ed 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_multiflavor.c
- *
  * Userspace RCU library - test multiple RCU flavors into one program
  * Userspace RCU library - test multiple RCU flavors into one program
- *
- * Copyright February 2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <stdlib.h>
  */
 
 #include <stdlib.h>
 
 #include "tap.h"
 
 
 #include "tap.h"
 
-int main(int argc, char **argv)
+int main(void)
 {
 {
-       plan_tests(5);
+       plan_tests(4);
 
        ok1(!test_mf_memb());
 
        ok1(!test_mf_mb());
 
        ok1(!test_mf_memb());
 
        ok1(!test_mf_mb());
-       ok1(!test_mf_signal());
        ok1(!test_mf_qsbr());
        ok1(!test_mf_bp());
 
        ok1(!test_mf_qsbr());
        ok1(!test_mf_bp());
 
index 419ad5d7cf1b5226b52f3fc1b616a24dd4f97cd4..27e59f0de65fa42a7f1e65ae6a10888226208d98 100644 (file)
@@ -1,29 +1,14 @@
+// SPDX-FileCopyrightText: 2012 Lai Jiangshan <laijs@cn.fujitsu.com>
+// SPDX-FileCopyrightText: 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_multiflavor.h
- *
  * Userspace RCU library - test multiple RCU flavors into one program
  * Userspace RCU library - test multiple RCU flavors into one program
- *
- * Copyright February 2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright February 2012 - Lai Jiangshan <laijs@cn.fujitsu.com>
- *
- * 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.
  */
 
 extern int test_mf_memb(void);
 extern int test_mf_mb(void);
  */
 
 extern int test_mf_memb(void);
 extern int test_mf_mb(void);
-extern int test_mf_signal(void);
 extern int test_mf_qsbr(void);
 extern int test_mf_bp(void);
 
 extern int test_mf_qsbr(void);
 extern int test_mf_bp(void);
 
diff --git a/tests/unit/test_urcu_multiflavor_cxx.cpp b/tests/unit/test_urcu_multiflavor_cxx.cpp
new file mode 100644 (file)
index 0000000..6794731
--- /dev/null
@@ -0,0 +1,5 @@
+// SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "test_urcu_multiflavor.c"
index 909d4d2aaa131410a88604cb7962d84fbd5c4378..5548744e2f6ea4bfb75de28ee9566c552e8c62a7 100644 (file)
@@ -1,23 +1,9 @@
+// SPDX-FileCopyrightText: 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
 /*
- * test_urcu_multiflavor.c
- *
  * Userspace RCU library - test multiple RCU flavors into one program
  * Userspace RCU library - test multiple RCU flavors into one program
- *
- * Copyright February 2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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.
  */
 
 #ifndef DYNAMIC_LINK_TEST
  */
 
 #ifndef DYNAMIC_LINK_TEST
@@ -27,7 +13,6 @@
 #include <urcu/urcu-mb.h>
 #include <urcu/urcu-bp.h>
 #include <urcu/urcu-memb.h>
 #include <urcu/urcu-mb.h>
 #include <urcu/urcu-bp.h>
 #include <urcu/urcu-memb.h>
-#include <urcu/urcu-signal.h>
 #include <urcu/urcu-qsbr.h>
 
 #include <stdlib.h>
 #include <urcu/urcu-qsbr.h>
 
 #include <stdlib.h>
@@ -63,16 +48,6 @@ static int test_mf_memb(void)
        return 0;
 }
 
        return 0;
 }
 
-static int test_mf_signal(void)
-{
-       urcu_signal_register_thread();
-       urcu_signal_read_lock();
-       urcu_signal_read_unlock();
-       urcu_signal_synchronize_rcu();
-       urcu_signal_unregister_thread();
-       return 0;
-}
-
 static int test_mf_qsbr(void)
 {
        urcu_qsbr_register_thread();
 static int test_mf_qsbr(void)
 {
        urcu_qsbr_register_thread();
@@ -83,14 +58,13 @@ static int test_mf_qsbr(void)
        return 0;
 }
 
        return 0;
 }
 
-int main(int argc, char **argv)
+int main(void)
 {
 {
-       plan_tests(5);
+       plan_tests(4);
 
        ok1(!test_mf_mb());
        ok1(!test_mf_bp());
        ok1(!test_mf_memb());
 
        ok1(!test_mf_mb());
        ok1(!test_mf_bp());
        ok1(!test_mf_memb());
-       ok1(!test_mf_signal());
        ok1(!test_mf_qsbr());
 
        return exit_status();
        ok1(!test_mf_qsbr());
 
        return exit_status();
diff --git a/tests/unit/test_urcu_multiflavor_single_unit_cxx.cpp b/tests/unit/test_urcu_multiflavor_single_unit_cxx.cpp
new file mode 100644 (file)
index 0000000..f7cdf21
--- /dev/null
@@ -0,0 +1,5 @@
+// SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "test_urcu_multiflavor_single_unit.c"
diff --git a/tests/unit/test_wfcqueue.c b/tests/unit/test_wfcqueue.c
new file mode 100644 (file)
index 0000000..45c4988
--- /dev/null
@@ -0,0 +1,107 @@
+// SPDX-FileCopyrightText: 2023 Olivier Dion <odion@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+/*
+ * test_wfcqueue.c
+ *
+ * Userspace RCU library - test wfcqueue race conditions
+ */
+
+#define _LGPL_SOURCE
+
+#include <stdlib.h>
+
+#include <pthread.h>
+
+#include <urcu/wfcqueue.h>
+
+#include "tap.h"
+
+#define NR_TESTS 1
+#define NR_PRODUCERS 4
+#define LOOP 100
+
+struct queue {
+       struct cds_wfcq_head head;
+       struct cds_wfcq_tail tail;
+};
+
+static void async_run(struct queue *queue)
+{
+       struct cds_wfcq_node *node = malloc(sizeof(*node));
+
+       cds_wfcq_node_init(node);
+
+       cds_wfcq_enqueue(&queue->head, &queue->tail, node);
+}
+static void do_async_loop(size_t *k, struct queue *queue)
+{
+       struct queue my_queue;
+       enum cds_wfcq_ret state;
+       struct cds_wfcq_node *node, *next;
+
+       cds_wfcq_init(&my_queue.head, &my_queue.tail);
+
+       state = cds_wfcq_splice_blocking(&my_queue.head,
+                                       &my_queue.tail,
+                                       &queue->head,
+                                       &queue->tail);
+
+       if (state == CDS_WFCQ_RET_SRC_EMPTY) {
+               return;
+       }
+
+       __cds_wfcq_for_each_blocking_safe(&my_queue.head,
+                                       &my_queue.tail,
+                                       node, next) {
+               free(node);
+               (*k)++;
+       }
+}
+
+static void *async_loop(void *queue)
+{
+       size_t k = 0;
+
+       while (k < LOOP * NR_PRODUCERS) {
+               (void) poll(NULL, 0, 10);
+               do_async_loop(&k, queue);
+       }
+
+       return NULL;
+}
+
+static void *spawn_jobs(void *queue)
+{
+       for (size_t k = 0; k < LOOP; ++k) {
+               async_run(queue);
+       }
+
+       return 0;
+}
+
+int main(void)
+{
+       pthread_t consumer;
+       pthread_t producers[NR_PRODUCERS];
+       struct queue queue;
+
+       plan_tests(NR_TESTS);
+
+       cds_wfcq_init(&queue.head, &queue.tail);
+       pthread_create(&consumer, NULL, async_loop, &queue);
+
+       for (size_t k = 0; k < NR_PRODUCERS; ++k) {
+               pthread_create(&producers[k], NULL, spawn_jobs, &queue);
+       }
+
+       pthread_join(consumer, NULL);
+       for (size_t k = 0; k < NR_PRODUCERS; ++k) {
+               pthread_join(producers[k], NULL);
+       }
+
+       ok1("No race conditions");
+
+       return exit_status();
+}
diff --git a/tests/unit/test_wfqueue.c b/tests/unit/test_wfqueue.c
new file mode 100644 (file)
index 0000000..944c49a
--- /dev/null
@@ -0,0 +1,79 @@
+// SPDX-FileCopyrightText: 2023 Olivier Dion <odion@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+/*
+ * test_wfqueue.c
+ *
+ * Userspace RCU library - test wfqueue race conditions
+ */
+
+#define _LGPL_SOURCE
+
+#include <stdlib.h>
+
+#include <pthread.h>
+
+#define CDS_WFQ_DEPRECATED
+#include <urcu/wfqueue.h>
+
+#include "tap.h"
+
+#define NR_TESTS 1
+#define NR_PRODUCERS 4
+#define LOOP 100
+
+static void async_run(struct cds_wfq_queue *queue)
+{
+       struct cds_wfq_node *node = malloc(sizeof(*node));
+
+       cds_wfq_node_init(node);
+
+       cds_wfq_enqueue(queue, node);
+}
+
+static void *async_loop(void *queue)
+{
+       size_t k = 0;
+
+       while (k < LOOP * NR_PRODUCERS) {
+               free(cds_wfq_dequeue_blocking(queue));
+               ++k;
+       }
+
+       return NULL;
+}
+
+static void *spawn_jobs(void *queue)
+{
+       for (size_t k = 0; k < LOOP; ++k) {
+               async_run(queue);
+       }
+
+       return 0;
+}
+
+int main(void)
+{
+       pthread_t consumer;
+       pthread_t producers[NR_PRODUCERS];
+       struct cds_wfq_queue queue;
+
+       plan_tests(NR_TESTS);
+
+       cds_wfq_init(&queue);
+       pthread_create(&consumer, NULL, async_loop, &queue);
+
+       for (size_t k = 0; k < NR_PRODUCERS; ++k) {
+               pthread_create(&producers[k], NULL, spawn_jobs, &queue);
+       }
+
+       pthread_join(consumer, NULL);
+       for (size_t k = 0; k < NR_PRODUCERS; ++k) {
+               pthread_join(producers[k], NULL);
+       }
+
+       ok1("No race conditions");
+
+       return exit_status();
+}
diff --git a/tests/unit/test_wfstack.c b/tests/unit/test_wfstack.c
new file mode 100644 (file)
index 0000000..17901ce
--- /dev/null
@@ -0,0 +1,78 @@
+// SPDX-FileCopyrightText: 2023 Olivier Dion <odion@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+/*
+ * test_wfstack.c
+ *
+ * Userspace RCU library - test wftack race conditions
+ */
+
+#define _LGPL_SOURCE
+
+#include <stdlib.h>
+
+#include <pthread.h>
+
+#include <urcu/wfstack.h>
+
+#include "tap.h"
+
+#define NR_TESTS 1
+#define NR_PRODUCERS 4
+#define LOOP 100
+
+static void async_run(struct cds_wfs_stack *queue)
+{
+       struct cds_wfs_node *node = malloc(sizeof(*node));
+
+       cds_wfs_node_init(node);
+
+       cds_wfs_push(queue, node);
+}
+
+static void *async_loop(void *queue)
+{
+       size_t k = 0;
+
+       while (k < LOOP * NR_PRODUCERS) {
+               free(cds_wfs_pop_blocking(queue));
+               ++k;
+       }
+
+       return NULL;
+}
+
+static void *spawn_jobs(void *queue)
+{
+       for (size_t k = 0; k < LOOP; ++k) {
+               async_run(queue);
+       }
+
+       return 0;
+}
+
+int main(void)
+{
+       pthread_t consumer;
+       pthread_t producers[NR_PRODUCERS];
+       struct cds_wfs_stack queue;
+
+       plan_tests(NR_TESTS);
+
+       cds_wfs_init(&queue);
+       pthread_create(&consumer, NULL, async_loop, &queue);
+
+       for (size_t k = 0; k < NR_PRODUCERS; ++k) {
+               pthread_create(&producers[k], NULL, spawn_jobs, &queue);
+       }
+
+       pthread_join(consumer, NULL);
+       for (size_t k = 0; k < NR_PRODUCERS; ++k) {
+               pthread_join(producers[k], NULL);
+       }
+
+       ok1("No race conditions");
+
+       return exit_status();
+}
index b616d3486c90a8d1ad7888e50186e5045f64e460..202854f899cfac02d1a4f1f4f086d6bcaf446fcd 100644 (file)
@@ -1,23 +1,11 @@
+// SPDX-FileCopyrightText: 2009 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
  * urcu-asm.c
  *
  * Userspace RCU library - assembly dump of primitives
 /*
  * urcu-asm.c
  *
  * Userspace RCU library - assembly dump of primitives
- *
- * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * 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 <urcu.h>
  */
 
 #include <urcu.h>
diff --git a/tests/unit/urcu-asm_cxx.cpp b/tests/unit/urcu-asm_cxx.cpp
new file mode 100644 (file)
index 0000000..883e7b9
--- /dev/null
@@ -0,0 +1,5 @@
+// SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "urcu-asm.c"
index 31d7913e2d4864b2f04443e6afaf613e288192ca..605d64c953deb5540b3971ad47cd6f828379e608 100644 (file)
@@ -1,22 +1,13 @@
-AM_CFLAGS += -I$(top_srcdir)/include -I$(top_builddir)/include -I$(top_srcdir)/src
+# SPDX-FileCopyrightText: 2023 EfficiOS Inc.
+#
+# SPDX-License-Identifier: MIT
+
+AM_CPPFLAGS += -I$(top_srcdir)/src
 
 noinst_LIBRARIES = libtap.a
 libtap_a_SOURCES = tap.c tap.h
 
 
 noinst_LIBRARIES = libtap.a
 libtap_a_SOURCES = tap.c tap.h
 
-SCRIPT_LIST = tap.sh
-
-dist_noinst_SCRIPTS = $(SCRIPT_LIST)
-
-all-local:
-       @if [ x"$(srcdir)" != x"$(builddir)" ]; then \
-               for script in $(SCRIPT_LIST); do \
-                       cp -f $(srcdir)/$$script $(builddir); \
-               done; \
-       fi
-
-clean-local:
-       @if [ x"$(srcdir)" != x"$(builddir)" ]; then \
-               for script in $(SCRIPT_LIST); do \
-                       rm -f $(builddir)/$$script; \
-               done; \
-       fi
+dist_check_SCRIPTS = \
+       tap-driver.sh \
+       tap.sh \
+       utils.sh
diff --git a/tests/utils/env.sh.in b/tests/utils/env.sh.in
new file mode 100644 (file)
index 0000000..6fa2733
--- /dev/null
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+### Base paths to test suite ###
+if [ "x${URCU_TESTS_SRCDIR:-}" = "x" ]; then
+       URCU_TESTS_SRCDIR="@abs_top_srcdir@/tests"
+fi
+export URCU_TESTS_SRCDIR
+
+if [ "x${URCU_TESTS_BUILDDIR:-}" = "x" ]; then
+       URCU_TESTS_BUILDDIR="@abs_top_builddir@/tests"
+fi
+export URCU_TESTS_BUILDDIR
+
+
+### External Tools ###
+if [ "x${URCU_TESTS_NPROC_BIN:-}" = "x" ]; then
+       URCU_TESTS_NPROC_BIN="@NPROC@"
+fi
+export URCU_TESTS_NPROC_BIN
+
+if [ "x${URCU_TESTS_GETCONF_BIN:-}" = "x" ]; then
+       URCU_TESTS_GETCONF_BIN="@GETCONF@"
+fi
+export URCU_TESTS_GETCONF_BIN
+
+if [ "x${URCU_TESTS_TIME_BIN:-}" = "x" ]; then
+       URCU_TESTS_TIME_BIN="@TIME@"
+fi
+export URCU_TESTS_TIME_BIN
+
diff --git a/tests/utils/tap-driver.sh b/tests/utils/tap-driver.sh
new file mode 100755 (executable)
index 0000000..921e38f
--- /dev/null
@@ -0,0 +1,643 @@
+#! /bin/sh
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# Copyright (C) 2011-2018 Free Software Foundation, Inc.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+scriptversion=2013-12-23.17; # UTC
+
+# Make unconditional expansion of undefined variables an error.  This
+# helps a lot in preventing typo-related bugs.
+set -u
+
+me=tap-driver.sh
+
+fatal ()
+{
+  echo "$me: fatal: $*" >&2
+  exit 1
+}
+
+usage_error ()
+{
+  echo "$me: $*" >&2
+  print_usage >&2
+  exit 2
+}
+
+print_usage ()
+{
+  cat <<END
+Usage:
+  tap-driver.sh --test-name=NAME --log-file=PATH --trs-file=PATH
+                [--expect-failure={yes|no}] [--color-tests={yes|no}]
+                [--enable-hard-errors={yes|no}] [--ignore-exit]
+                [--diagnostic-string=STRING] [--merge|--no-merge]
+                [--comments|--no-comments] [--] TEST-COMMAND
+The '--test-name', '-log-file' and '--trs-file' options are mandatory.
+END
+}
+
+# TODO: better error handling in option parsing (in particular, ensure
+# TODO: $log_file, $trs_file and $test_name are defined).
+test_name= # Used for reporting.
+log_file=  # Where to save the result and output of the test script.
+trs_file=  # Where to save the metadata of the test run.
+expect_failure=0
+color_tests=0
+merge=0
+ignore_exit=0
+comments=0
+diag_string='#'
+while test $# -gt 0; do
+  case $1 in
+  --help) print_usage; exit $?;;
+  --version) echo "$me $scriptversion"; exit $?;;
+  --test-name) test_name=$2; shift;;
+  --log-file) log_file=$2; shift;;
+  --trs-file) trs_file=$2; shift;;
+  --color-tests) color_tests=$2; shift;;
+  --expect-failure) expect_failure=$2; shift;;
+  --enable-hard-errors) shift;; # No-op.
+  --merge) merge=1;;
+  --no-merge) merge=0;;
+  --ignore-exit) ignore_exit=1;;
+  --comments) comments=1;;
+  --no-comments) comments=0;;
+  --diagnostic-string) diag_string=$2; shift;;
+  --) shift; break;;
+  -*) usage_error "invalid option: '$1'";;
+  esac
+  shift
+done
+
+test $# -gt 0 || usage_error "missing test command"
+
+case $expect_failure in
+  yes) expect_failure=1;;
+    *) expect_failure=0;;
+esac
+
+if test $color_tests = yes; then
+  init_colors='
+    color_map["red"]="\e[0;31m" # Red.
+    color_map["grn"]="\e[0;32m" # Green.
+    color_map["lgn"]="\e[1;32m" # Light green.
+    color_map["blu"]="\e[1;34m" # Blue.
+    color_map["mgn"]="\e[0;35m" # Magenta.
+    color_map["std"]="\e[m"     # No color.
+    color_for_result["ERROR"] = "mgn"
+    color_for_result["PASS"]  = "grn"
+    color_for_result["XPASS"] = "red"
+    color_for_result["FAIL"]  = "red"
+    color_for_result["XFAIL"] = "lgn"
+    color_for_result["SKIP"]  = "blu"'
+else
+  init_colors=''
+fi
+
+# :; is there to work around a bug in bash 3.2 (and earlier) which
+# does not always set '$?' properly on redirection failure.
+# See the Autoconf manual for more details.
+:;{
+  (
+    # Ignore common signals (in this subshell only!), to avoid potential
+    # problems with Korn shells.  Some Korn shells are known to propagate
+    # to themselves signals that have killed a child process they were
+    # waiting for; this is done at least for SIGINT (and usually only for
+    # it, in truth).  Without the `trap' below, such a behaviour could
+    # cause a premature exit in the current subshell, e.g., in case the
+    # test command it runs gets terminated by a SIGINT.  Thus, the awk
+    # script we are piping into would never seen the exit status it
+    # expects on its last input line (which is displayed below by the
+    # last `echo $?' statement), and would thus die reporting an internal
+    # error.
+    # For more information, see the Autoconf manual and the threads:
+    # <https://lists.gnu.org/archive/html/bug-autoconf/2011-09/msg00004.html>
+    # <http://mail.opensolaris.org/pipermail/ksh93-integration-discuss/2009-February/004121.html>
+    trap : 1 3 2 13 15
+    if test $merge -gt 0; then
+      exec 2>&1
+    else
+      exec 2>&3
+    fi
+    "$@"
+    echo $?
+  ) | LC_ALL=C ${AM_TAP_AWK-awk} \
+        -v me="$me" \
+        -v test_script_name="$test_name" \
+        -v log_file="$log_file" \
+        -v trs_file="$trs_file" \
+        -v expect_failure="$expect_failure" \
+        -v merge="$merge" \
+        -v ignore_exit="$ignore_exit" \
+        -v comments="$comments" \
+        -v diag_string="$diag_string" \
+'
+# TODO: the usages of "cat >&3" below could be optimized when using
+#       GNU awk, and/on on systems that supports /dev/fd/.
+
+# Implementation note: in what follows, `result_obj` will be an
+# associative array that (partly) simulates a TAP result object
+# from the `TAP::Parser` perl module.
+
+## ----------- ##
+##  FUNCTIONS  ##
+## ----------- ##
+
+function fatal(msg)
+{
+  print me ": " msg | "cat >&2"
+  exit 1
+}
+
+function abort(where)
+{
+  fatal("internal error " where)
+}
+
+# Convert a boolean to a "yes"/"no" string.
+function yn(bool)
+{
+  return bool ? "yes" : "no";
+}
+
+function add_test_result(result)
+{
+  if (!test_results_index)
+    test_results_index = 0
+  test_results_list[test_results_index] = result
+  test_results_index += 1
+  test_results_seen[result] = 1;
+}
+
+# Whether the test script should be re-run by "make recheck".
+function must_recheck()
+{
+  for (k in test_results_seen)
+    if (k != "XFAIL" && k != "PASS" && k != "SKIP")
+      return 1
+  return 0
+}
+
+# Whether the content of the log file associated to this test should
+# be copied into the "global" test-suite.log.
+function copy_in_global_log()
+{
+  for (k in test_results_seen)
+    if (k != "PASS")
+      return 1
+  return 0
+}
+
+function get_global_test_result()
+{
+    if ("ERROR" in test_results_seen)
+      return "ERROR"
+    if ("FAIL" in test_results_seen || "XPASS" in test_results_seen)
+      return "FAIL"
+    all_skipped = 1
+    for (k in test_results_seen)
+      if (k != "SKIP")
+        all_skipped = 0
+    if (all_skipped)
+      return "SKIP"
+    return "PASS";
+}
+
+function stringify_result_obj(result_obj)
+{
+  if (result_obj["is_unplanned"] || result_obj["number"] != testno)
+    return "ERROR"
+
+  if (plan_seen == LATE_PLAN)
+    return "ERROR"
+
+  if (result_obj["directive"] == "TODO")
+    return result_obj["is_ok"] ? "XPASS" : "XFAIL"
+
+  if (result_obj["directive"] == "SKIP")
+    return result_obj["is_ok"] ? "SKIP" : COOKED_FAIL;
+
+  if (length(result_obj["directive"]))
+      abort("in function stringify_result_obj()")
+
+  return result_obj["is_ok"] ? COOKED_PASS : COOKED_FAIL
+}
+
+function decorate_result(result)
+{
+  color_name = color_for_result[result]
+  if (color_name)
+    return color_map[color_name] "" result "" color_map["std"]
+  # If we are not using colorized output, or if we do not know how
+  # to colorize the given result, we should return it unchanged.
+  return result
+}
+
+function report(result, details)
+{
+  if (result ~ /^(X?(PASS|FAIL)|SKIP|ERROR)/)
+    {
+      msg = ": " test_script_name
+      add_test_result(result)
+    }
+  else if (result == "#")
+    {
+      msg = " " test_script_name ":"
+    }
+  else
+    {
+      abort("in function report()")
+    }
+  if (length(details))
+    msg = msg " " details
+  # Output on console might be colorized.
+  print decorate_result(result) msg
+  # Flush stdout after each test result, this is useful when stdout
+  # is buffered, for example in a CI system.
+  fflush()
+  # Log the result in the log file too, to help debugging (this is
+  # especially true when said result is a TAP error or "Bail out!").
+  print result msg | "cat >&3";
+}
+
+function testsuite_error(error_message)
+{
+  report("ERROR", "- " error_message)
+}
+
+function handle_tap_result()
+{
+  details = result_obj["number"];
+  if (length(result_obj["description"]))
+    details = details " " result_obj["description"]
+
+  if (plan_seen == LATE_PLAN)
+    {
+      details = details " # AFTER LATE PLAN";
+    }
+  else if (result_obj["is_unplanned"])
+    {
+       details = details " # UNPLANNED";
+    }
+  else if (result_obj["number"] != testno)
+    {
+       details = sprintf("%s # OUT-OF-ORDER (expecting %d)",
+                         details, testno);
+    }
+  else if (result_obj["directive"])
+    {
+      details = details " # " result_obj["directive"];
+      if (length(result_obj["explanation"]))
+        details = details " " result_obj["explanation"]
+    }
+
+  report(stringify_result_obj(result_obj), details)
+}
+
+# `skip_reason` should be empty whenever planned > 0.
+function handle_tap_plan(planned, skip_reason)
+{
+  planned += 0 # Avoid getting confused if, say, `planned` is "00"
+  if (length(skip_reason) && planned > 0)
+    abort("in function handle_tap_plan()")
+  if (plan_seen)
+    {
+      # Error, only one plan per stream is acceptable.
+      testsuite_error("multiple test plans")
+      return;
+    }
+  planned_tests = planned
+  # The TAP plan can come before or after *all* the TAP results; we speak
+  # respectively of an "early" or a "late" plan.  If we see the plan line
+  # after at least one TAP result has been seen, assume we have a late
+  # plan; in this case, any further test result seen after the plan will
+  # be flagged as an error.
+  plan_seen = (testno >= 1 ? LATE_PLAN : EARLY_PLAN)
+  # If testno > 0, we have an error ("too many tests run") that will be
+  # automatically dealt with later, so do not worry about it here.  If
+  # $plan_seen is true, we have an error due to a repeated plan, and that
+  # has already been dealt with above.  Otherwise, we have a valid "plan
+  # with SKIP" specification, and should report it as a particular kind
+  # of SKIP result.
+  if (planned == 0 && testno == 0)
+    {
+      if (length(skip_reason))
+        skip_reason = "- "  skip_reason;
+      report("SKIP", skip_reason);
+    }
+}
+
+function extract_tap_comment(line)
+{
+  if (index(line, diag_string) == 1)
+    {
+      # Strip leading `diag_string` from `line`.
+      line = substr(line, length(diag_string) + 1)
+      # And strip any leading and trailing whitespace left.
+      sub("^[ \t]*", "", line)
+      sub("[ \t]*$", "", line)
+      # Return what is left (if any).
+      return line;
+    }
+  return "";
+}
+
+# When this function is called, we know that line is a TAP result line,
+# so that it matches the (perl) RE "^(not )?ok\b".
+function setup_result_obj(line)
+{
+  # Get the result, and remove it from the line.
+  result_obj["is_ok"] = (substr(line, 1, 2) == "ok" ? 1 : 0)
+  sub("^(not )?ok[ \t]*", "", line)
+
+  # If the result has an explicit number, get it and strip it; otherwise,
+  # automatically assign the next progresive number to it.
+  if (line ~ /^[0-9]+$/ || line ~ /^[0-9]+[^a-zA-Z0-9_]/)
+    {
+      match(line, "^[0-9]+")
+      # The final `+ 0` is to normalize numbers with leading zeros.
+      result_obj["number"] = substr(line, 1, RLENGTH) + 0
+      line = substr(line, RLENGTH + 1)
+    }
+  else
+    {
+      result_obj["number"] = testno
+    }
+
+  if (plan_seen == LATE_PLAN)
+    # No further test results are acceptable after a "late" TAP plan
+    # has been seen.
+    result_obj["is_unplanned"] = 1
+  else if (plan_seen && testno > planned_tests)
+    result_obj["is_unplanned"] = 1
+  else
+    result_obj["is_unplanned"] = 0
+
+  # Strip trailing and leading whitespace.
+  sub("^[ \t]*", "", line)
+  sub("[ \t]*$", "", line)
+
+  # This will have to be corrected if we have a "TODO"/"SKIP" directive.
+  result_obj["description"] = line
+  result_obj["directive"] = ""
+  result_obj["explanation"] = ""
+
+  if (index(line, "#") == 0)
+    return # No possible directive, nothing more to do.
+
+  # Directives are case-insensitive.
+  rx = "[ \t]*#[ \t]*([tT][oO][dD][oO]|[sS][kK][iI][pP])[ \t]*"
+
+  # See whether we have the directive, and if yes, where.
+  pos = match(line, rx "$")
+  if (!pos)
+    pos = match(line, rx "[^a-zA-Z0-9_]")
+
+  # If there was no TAP directive, we have nothing more to do.
+  if (!pos)
+    return
+
+  # Let`s now see if the TAP directive has been escaped.  For example:
+  #  escaped:     ok \# SKIP
+  #  not escaped: ok \\# SKIP
+  #  escaped:     ok \\\\\# SKIP
+  #  not escaped: ok \ # SKIP
+  if (substr(line, pos, 1) == "#")
+    {
+      bslash_count = 0
+      for (i = pos; i > 1 && substr(line, i - 1, 1) == "\\"; i--)
+        bslash_count += 1
+      if (bslash_count % 2)
+        return # Directive was escaped.
+    }
+
+  # Strip the directive and its explanation (if any) from the test
+  # description.
+  result_obj["description"] = substr(line, 1, pos - 1)
+  # Now remove the test description from the line, that has been dealt
+  # with already.
+  line = substr(line, pos)
+  # Strip the directive, and save its value (normalized to upper case).
+  sub("^[ \t]*#[ \t]*", "", line)
+  result_obj["directive"] = toupper(substr(line, 1, 4))
+  line = substr(line, 5)
+  # Now get the explanation for the directive (if any), with leading
+  # and trailing whitespace removed.
+  sub("^[ \t]*", "", line)
+  sub("[ \t]*$", "", line)
+  result_obj["explanation"] = line
+}
+
+function get_test_exit_message(status)
+{
+  if (status == 0)
+    return ""
+  if (status !~ /^[1-9][0-9]*$/)
+    abort("getting exit status")
+  if (status < 127)
+    exit_details = ""
+  else if (status == 127)
+    exit_details = " (command not found?)"
+  else if (status >= 128 && status <= 255)
+    exit_details = sprintf(" (terminated by signal %d?)", status - 128)
+  else if (status > 256 && status <= 384)
+    # We used to report an "abnormal termination" here, but some Korn
+    # shells, when a child process die due to signal number n, can leave
+    # in $? an exit status of 256+n instead of the more standard 128+n.
+    # Apparently, both behaviours are allowed by POSIX (2008), so be
+    # prepared to handle them both.  See also Austing Group report ID
+    # 0000051 <http://www.austingroupbugs.net/view.php?id=51>
+    exit_details = sprintf(" (terminated by signal %d?)", status - 256)
+  else
+    # Never seen in practice.
+    exit_details = " (abnormal termination)"
+  return sprintf("exited with status %d%s", status, exit_details)
+}
+
+function write_test_results()
+{
+  print ":global-test-result: " get_global_test_result() > trs_file
+  print ":recheck: "  yn(must_recheck()) > trs_file
+  print ":copy-in-global-log: " yn(copy_in_global_log()) > trs_file
+  for (i = 0; i < test_results_index; i += 1)
+    print ":test-result: " test_results_list[i] > trs_file
+  close(trs_file);
+}
+
+BEGIN {
+
+## ------- ##
+##  SETUP  ##
+## ------- ##
+
+'"$init_colors"'
+
+# Properly initialized once the TAP plan is seen.
+planned_tests = 0
+
+COOKED_PASS = expect_failure ? "XPASS": "PASS";
+COOKED_FAIL = expect_failure ? "XFAIL": "FAIL";
+
+# Enumeration-like constants to remember which kind of plan (if any)
+# has been seen.  It is important that NO_PLAN evaluates "false" as
+# a boolean.
+NO_PLAN = 0
+EARLY_PLAN = 1
+LATE_PLAN = 2
+
+testno = 0     # Number of test results seen so far.
+bailed_out = 0 # Whether a "Bail out!" directive has been seen.
+
+# Whether the TAP plan has been seen or not, and if yes, which kind
+# it is ("early" is seen before any test result, "late" otherwise).
+plan_seen = NO_PLAN
+
+## --------- ##
+##  PARSING  ##
+## --------- ##
+
+is_first_read = 1
+
+while (1)
+  {
+    # Involutions required so that we are able to read the exit status
+    # from the last input line.
+    st = getline
+    if (st < 0) # I/O error.
+      fatal("I/O error while reading from input stream")
+    else if (st == 0) # End-of-input
+      {
+        if (is_first_read)
+          abort("in input loop: only one input line")
+        break
+      }
+    if (is_first_read)
+      {
+        is_first_read = 0
+        nextline = $0
+        continue
+      }
+    else
+      {
+        curline = nextline
+        nextline = $0
+        $0 = curline
+      }
+    # Copy any input line verbatim into the log file.
+    print | "cat >&3"
+    # Parsing of TAP input should stop after a "Bail out!" directive.
+    if (bailed_out)
+      continue
+
+    # TAP test result.
+    if ($0 ~ /^(not )?ok$/ || $0 ~ /^(not )?ok[^a-zA-Z0-9_]/)
+      {
+        testno += 1
+        setup_result_obj($0)
+        handle_tap_result()
+      }
+    # TAP plan (normal or "SKIP" without explanation).
+    else if ($0 ~ /^1\.\.[0-9]+[ \t]*$/)
+      {
+        # The next two lines will put the number of planned tests in $0.
+        sub("^1\\.\\.", "")
+        sub("[^0-9]*$", "")
+        handle_tap_plan($0, "")
+        continue
+      }
+    # TAP "SKIP" plan, with an explanation.
+    else if ($0 ~ /^1\.\.0+[ \t]*#/)
+      {
+        # The next lines will put the skip explanation in $0, stripping
+        # any leading and trailing whitespace.  This is a little more
+        # tricky in truth, since we want to also strip a potential leading
+        # "SKIP" string from the message.
+        sub("^[^#]*#[ \t]*(SKIP[: \t][ \t]*)?", "")
+        sub("[ \t]*$", "");
+        handle_tap_plan(0, $0)
+      }
+    # "Bail out!" magic.
+    # Older versions of prove and TAP::Harness (e.g., 3.17) did not
+    # recognize a "Bail out!" directive when preceded by leading
+    # whitespace, but more modern versions (e.g., 3.23) do.  So we
+    # emulate the latter, "more modern" behaviour.
+    else if ($0 ~ /^[ \t]*Bail out!/)
+      {
+        bailed_out = 1
+        # Get the bailout message (if any), with leading and trailing
+        # whitespace stripped.  The message remains stored in `$0`.
+        sub("^[ \t]*Bail out![ \t]*", "");
+        sub("[ \t]*$", "");
+        # Format the error message for the
+        bailout_message = "Bail out!"
+        if (length($0))
+          bailout_message = bailout_message " " $0
+        testsuite_error(bailout_message)
+      }
+    # Maybe we have too look for dianogtic comments too.
+    else if (comments != 0)
+      {
+        comment = extract_tap_comment($0);
+        if (length(comment))
+          report("#", comment);
+      }
+  }
+
+## -------- ##
+##  FINISH  ##
+## -------- ##
+
+# A "Bail out!" directive should cause us to ignore any following TAP
+# error, as well as a non-zero exit status from the TAP producer.
+if (!bailed_out)
+  {
+    if (!plan_seen)
+      {
+        testsuite_error("missing test plan")
+      }
+    else if (planned_tests != testno)
+      {
+        bad_amount = testno > planned_tests ? "many" : "few"
+        testsuite_error(sprintf("too %s tests run (expected %d, got %d)",
+                                bad_amount, planned_tests, testno))
+      }
+    if (!ignore_exit)
+      {
+        # Fetch exit status from the last line.
+        exit_message = get_test_exit_message(nextline)
+        if (exit_message)
+          testsuite_error(exit_message)
+      }
+  }
+
+write_test_results()
+
+exit 0
+
+} # End of "BEGIN" block.
+'
+
+# TODO: document that we consume the file descriptor 3 :-(
+} 3>"$log_file"
+
+test $? -eq 0 || fatal "I/O or internal error"
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
index 573ae3366faca1a2a8b51957ff42df4eb2252819..97a1c60d73b77be3303bb213e6b005ff196fc01e 100644 (file)
@@ -1,33 +1,17 @@
-/*-
- * Copyright (c) 2004 Nik Clayton
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
  *
  *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
+ * Copyright (C) 2004 Nik Clayton
+ * Copyright (C) 2017 Jérémie Galarneau
  */
 
 #include <ctype.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
  */
 
 #include <ctype.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <assert.h>
 
 #include "tap.h"
 
 
 #include "tap.h"
 
@@ -38,7 +22,7 @@ static unsigned int test_count = 0; /* Number of tests that have been run */
 static unsigned int e_tests = 0; /* Expected number of tests to run */
 static unsigned int failures = 0; /* Number of tests that failed */
 static char *todo_msg = NULL;
 static unsigned int e_tests = 0; /* Expected number of tests to run */
 static unsigned int failures = 0; /* Number of tests that failed */
 static char *todo_msg = NULL;
-static char *todo_msg_fixed = "libtap malloc issue";
+static const char *todo_msg_fixed = "libtap malloc issue";
 static int todo = 0;
 static int test_died = 0;
 static int tap_is_disabled = 0;
 static int todo = 0;
 static int test_died = 0;
 static int tap_is_disabled = 0;
@@ -59,6 +43,18 @@ static void _expected_tests(unsigned int);
 static void _tap_init(void);
 static void _cleanup(void);
 
 static void _tap_init(void);
 static void _cleanup(void);
 
+#ifdef __MINGW32__
+static inline
+void flockfile (FILE * filehandle) {
+       return;
+}
+
+static inline
+void funlockfile(FILE * filehandle) {
+       return;
+}
+#endif
+
 /*
  * Generate a test result.
  *
 /*
  * Generate a test result.
  *
@@ -67,8 +63,8 @@ static void _cleanup(void);
  * test_comment -- a comment to print afterwards, may be NULL
  */
 unsigned int
  * test_comment -- a comment to print afterwards, may be NULL
  */
 unsigned int
-_gen_result(int ok, const char *func, char *file, unsigned int line,
-           char *test_name, ...)
+_gen_result(int ok, const char *func, const char *file, unsigned int line,
+           const char *test_name, ...)
 {
        va_list ap;
        char *local_test_name = NULL;
 {
        va_list ap;
        char *local_test_name = NULL;
@@ -94,7 +90,7 @@ _gen_result(int ok, const char *func, char *file, unsigned int line,
                if(local_test_name) {
                        name_is_digits = 1;
                        for(c = local_test_name; *c != '\0'; c++) {
                if(local_test_name) {
                        name_is_digits = 1;
                        for(c = local_test_name; *c != '\0'; c++) {
-                               if(!isdigit(*c) && !isspace(*c)) {
+                               if(!isdigit((unsigned char) *c) && !isspace((unsigned char) *c)) {
                                        name_is_digits = 0;
                                        break;
                                }
                                        name_is_digits = 0;
                                        break;
                                }
@@ -213,7 +209,7 @@ plan_no_plan(void)
  * Note that the plan is to skip all tests
  */
 int
  * Note that the plan is to skip all tests
  */
 int
-plan_skip_all(char *reason)
+plan_skip_all(const char *reason)
 {
 
        LOCK;
 {
 
        LOCK;
@@ -269,7 +265,7 @@ plan_tests(unsigned int tests)
 }
 
 unsigned int
 }
 
 unsigned int
-diag(char *fmt, ...)
+diag(const char *fmt, ...)
 {
        va_list ap;
 
 {
        va_list ap;
 
@@ -292,7 +288,7 @@ rdiag_start(void)
 }
 
 unsigned int
 }
 
 unsigned int
-rdiag(char *fmt, ...)
+rdiag(const char *fmt, ...)
 {
        va_list ap;
 
 {
        va_list ap;
 
@@ -310,6 +306,28 @@ rdiag_end(void)
        return 0;
 }
 
        return 0;
 }
 
+void
+diag_multiline(const char *val)
+{
+       size_t len, i, line_start_idx = 0;
+
+       assert(val);
+       len = strlen(val);
+
+       for (i = 0; i < len; i++) {
+               int line_length;
+
+               if (val[i] != '\n') {
+                       continue;
+               }
+
+               assert((i - line_start_idx + 1) <= INT_MAX);
+               line_length = i - line_start_idx + 1;
+               fprintf(stderr, "# %.*s", line_length, &val[line_start_idx]);
+               line_start_idx = i + 1;
+       }
+}
+
 void
 _expected_tests(unsigned int tests)
 {
 void
 _expected_tests(unsigned int tests)
 {
@@ -319,7 +337,7 @@ _expected_tests(unsigned int tests)
 }
 
 int
 }
 
 int
-skip(unsigned int n, char *fmt, ...)
+skip(unsigned int n, const char *fmt, ...)
 {
        va_list ap;
        char *skip_msg = NULL;
 {
        va_list ap;
        char *skip_msg = NULL;
@@ -327,7 +345,7 @@ skip(unsigned int n, char *fmt, ...)
        LOCK;
 
        va_start(ap, fmt);
        LOCK;
 
        va_start(ap, fmt);
-       if (asprintf(&skip_msg, fmt, ap) == -1) {
+       if (vasprintf(&skip_msg, fmt, ap) == -1) {
                skip_msg = NULL;
        }
        va_end(ap);
                skip_msg = NULL;
        }
        va_end(ap);
@@ -347,7 +365,7 @@ skip(unsigned int n, char *fmt, ...)
 }
 
 void
 }
 
 void
-todo_start(char *fmt, ...)
+todo_start(const char *fmt, ...)
 {
        va_list ap;
 
 {
        va_list ap;
 
index 9118bf53363da5db1ae673f10257f254f68fbf89..966706fe903447d683e5160d863eca5f9b37b38b 100644 (file)
@@ -1,53 +1,14 @@
-/*-
- * Copyright (c) 2004 Nik Clayton
- * All rights reserved.
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
  *
  *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
+ * Copyright (C) 2004 Nik Clayton
+ * Copyright (C) 2017 Jérémie Galarneau
  */
 
  */
 
-/* '## __VA_ARGS__' is a gcc'ism. C99 doesn't allow the token pasting
-   and requires the caller to add the final comma if they've ommitted
-   the optional arguments */
-#ifdef __GNUC__
-# define ok(e, test, ...) ((e) ?                                       \
-                          _gen_result(1, __func__, __FILE__, __LINE__, \
-                                      test, ## __VA_ARGS__) :          \
-                          _gen_result(0, __func__, __FILE__, __LINE__, \
-                                      test, ## __VA_ARGS__))
-
-# define ok1(e) ((e) ?                                                 \
-                _gen_result(1, __func__, __FILE__, __LINE__, "%s", #e) : \
-                _gen_result(0, __func__, __FILE__, __LINE__, "%s", #e))
-
-# define pass(test, ...) ok(1, test, ## __VA_ARGS__);
-# define fail(test, ...) ok(0, test, ## __VA_ARGS__);
+#ifdef __cplusplus
+extern "C" {
+#endif
 
 
-# define skip_start(test, n, fmt, ...)                 \
-       do {                                            \
-               if((test)) {                            \
-                       skip(n, fmt, ## __VA_ARGS__);   \
-                       continue;                       \
-               }
-#elif __STDC_VERSION__ >= 199901L /* __GNUC__ */
 # define ok(e, ...) ((e) ?                                             \
                     _gen_result(1, __func__, __FILE__, __LINE__,       \
                                 __VA_ARGS__) :                         \
 # define ok(e, ...) ((e) ?                                             \
                     _gen_result(1, __func__, __FILE__, __LINE__,       \
                                 __VA_ARGS__) :                         \
@@ -58,8 +19,8 @@
                 _gen_result(1, __func__, __FILE__, __LINE__, "%s", #e) : \
                 _gen_result(0, __func__, __FILE__, __LINE__, "%s", #e))
 
                 _gen_result(1, __func__, __FILE__, __LINE__, "%s", #e) : \
                 _gen_result(0, __func__, __FILE__, __LINE__, "%s", #e))
 
-# define pass(...) ok(1, __VA_ARGS__);
-# define fail(...) ok(0, __VA_ARGS__);
+# define pass(...) ok(1, __VA_ARGS__)
+# define fail(...) ok(0, __VA_ARGS__)
 
 # define skip_start(test, n, ...)                      \
        do {                                            \
 
 # define skip_start(test, n, ...)                      \
        do {                                            \
                        skip(n,  __VA_ARGS__);          \
                        continue;                       \
                }
                        skip(n,  __VA_ARGS__);          \
                        continue;                       \
                }
-#else /* __STDC_VERSION__ */
-# error "Needs gcc or C99 compiler for variadic macros."
-#endif /* __STDC_VERSION__ */
 
 #define skip_end() } while(0);
 
 
 #define skip_end() } while(0);
 
-unsigned int _gen_result(int, const char *, char *, unsigned int, char *, ...);
+#ifdef __MINGW_PRINTF_FORMAT
+# define TAP_PRINTF_FORMAT __MINGW_PRINTF_FORMAT
+#else
+# define TAP_PRINTF_FORMAT printf
+#endif
+
+__attribute__((format(TAP_PRINTF_FORMAT, 5, 6)))
+unsigned int _gen_result(int, const char *, const char *, unsigned int, const char *, ...);
 
 int plan_no_plan(void);
 
 int plan_no_plan(void);
-int plan_skip_all(char *);
+__attribute__((__noreturn__))
+int plan_skip_all(const char *);
 int plan_tests(unsigned int);
 
 int plan_tests(unsigned int);
 
-unsigned int diag(char *, ...);
+__attribute__((format(TAP_PRINTF_FORMAT, 1, 2)))
+unsigned int diag(const char *, ...);
+void diag_multiline(const char *);
 
 
-int skip(unsigned int, char *, ...);
+__attribute__((format(TAP_PRINTF_FORMAT, 2, 3)))
+int skip(unsigned int, const char *, ...);
 
 
-void todo_start(char *, ...);
+__attribute__((format(TAP_PRINTF_FORMAT, 1, 2)))
+void todo_start(const char *, ...);
 void todo_end(void);
 
 int exit_status(void);
 void todo_end(void);
 
 int exit_status(void);
@@ -91,5 +61,10 @@ int exit_status(void);
 void tap_disable(void);
 
 unsigned int rdiag_start(void);
 void tap_disable(void);
 
 unsigned int rdiag_start(void);
-unsigned int rdiag(char *fmt, ...);
+__attribute__((format(TAP_PRINTF_FORMAT, 1, 2)))
+unsigned int rdiag(const char *fmt, ...);
 unsigned int rdiag_end(void);
 unsigned int rdiag_end(void);
+
+#ifdef __cplusplus
+}
+#endif
index 24ac1aa250d6a092ef9cd8a2c4bb21e9ea75d331..47b140722a36e2d5b67f0c28d7a195f33cf3b569 100755 (executable)
@@ -1,20 +1,9 @@
-#!/bin/bash
+#!/usr/bin/env bash
 #
 #
-# Copyright 2010 Patrick LeBoutillier <patrick.leboutillier@gmail.com>
+# SPDX-License-Identifier: GPL-3.0-or-later
 #
 #
-#    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 3 of the License, or
-#    (at your option) any later version.
+# SPDX-FileCopyrightText: 2010 Patrick LeBoutillier <patrick.leboutillier@gmail.com>
 #
 #
-#    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, see <http://www.gnu.org/licenses/>.
-
 
 _version='1.01'
 
 
 _version='1.01'
 
@@ -65,7 +54,7 @@ OTHER:
   diag MSG
 
 EXAMPLE:
   diag MSG
 
 EXAMPLE:
-  #!/bin/bash
+  #!/usr/bin/env bash
 
   . tap-functions
 
 
   . tap-functions
 
diff --git a/tests/utils/utils.sh b/tests/utils/utils.sh
new file mode 100755 (executable)
index 0000000..5c96fb0
--- /dev/null
@@ -0,0 +1,112 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# SPDX-FileCopyrightText: 2022 EfficiOS Inc.
+#
+
+# This file is meant to be sourced at the start of shell script-based tests.
+
+
+# Error out when encountering an undefined variable
+set -u
+
+# If "readlink -f" is available, get a resolved absolute path to the
+# tests source dir, otherwise make do with a relative path.
+scriptdir="$(dirname "${BASH_SOURCE[0]}")"
+if readlink -f "." >/dev/null 2>&1; then
+       testsdir=$(readlink -f "$scriptdir/..")
+else
+       testsdir="$scriptdir/.."
+fi
+
+# The OS on which we are running. See [1] for possible values of 'uname -s'.
+# We do a bit of translation to ease our life down the road for comparison.
+# Export it so that called executables can use it.
+# [1] https://en.wikipedia.org/wiki/Uname#Examples
+if [ "x${URCU_TESTS_OS_TYPE:-}" = "x" ]; then
+       URCU_TESTS_OS_TYPE="$(uname -s)"
+       case "$URCU_TESTS_OS_TYPE" in
+       MINGW*)
+               URCU_TESTS_OS_TYPE="mingw"
+               ;;
+       Darwin)
+               URCU_TESTS_OS_TYPE="darwin"
+               ;;
+       Linux)
+               URCU_TESTS_OS_TYPE="linux"
+               ;;
+       CYGWIN*)
+               URCU_TESTS_OS_TYPE="cygwin"
+               ;;
+       *)
+               URCU_TESTS_OS_TYPE="unsupported"
+               ;;
+       esac
+fi
+export URCU_TESTS_OS_TYPE
+
+# Allow overriding the source and build directories
+if [ "x${URCU_TESTS_SRCDIR:-}" = "x" ]; then
+       URCU_TESTS_SRCDIR="$testsdir"
+fi
+export URCU_TESTS_SRCDIR
+
+if [ "x${URCU_TESTS_BUILDDIR:-}" = "x" ]; then
+       URCU_TESTS_BUILDDIR="$testsdir"
+fi
+export URCU_TESTS_BUILDDIR
+
+# Source the generated environment file if it's present.
+if [ -f "${URCU_TESTS_BUILDDIR}/utils/env.sh" ]; then
+       # shellcheck source=./env.sh
+       . "${URCU_TESTS_BUILDDIR}/utils/env.sh"
+fi
+
+
+### External Tools ###
+
+if [ "x${URCU_TESTS_NPROC_BIN:-}" = "x" ]; then
+       URCU_TESTS_NPROC_BIN="nproc"
+fi
+export URCU_TESTS_NPROC_BIN
+
+if [ "x${URCU_TESTS_GETCONF_BIN:-}" = "x" ]; then
+       URCU_TESTS_GETCONF_BIN="getconf"
+fi
+export URCU_TESTS_GETCONF_BIN
+
+
+# By default, it will not source tap.sh.  If you to tap output directly from
+# the test script, define the 'SH_TAP' variable to '1' before sourcing this
+# script.
+if [ "x${SH_TAP:-}" = x1 ]; then
+       # shellcheck source=./tap.sh
+       . "${URCU_TESTS_SRCDIR}/utils/tap.sh"
+fi
+
+
+### Functions ###
+
+# Print the number of online CPUs, fallback to '1' if no tools to count CPUs
+# are found in the environment.
+urcu_nproc() {
+       if command -v "${URCU_TESTS_NPROC_BIN}" >/dev/null 2>&1; then
+               "${URCU_TESTS_NPROC_BIN}"
+       elif command -v "${URCU_TESTS_GETCONF_BIN}" >/dev/null 2>&1; then
+               "${URCU_TESTS_GETCONF_BIN}" _NPROCESSORS_ONLN
+       else
+               # Fallback to '1'
+               echo 1
+       fi
+}
+
+# Shell implementation of the 'seq' command.
+urcu_xseq() {
+       local i=$1
+
+       while [[ "$i" -le "$2" ]]; do
+               echo "$i"
+               i=$(( i + 1 ))
+       done
+}
This page took 1.120178 seconds and 4 git commands to generate.