Download raw body.
UPDATE: liburcu
Here is a diff to add futex support for liburcu.
Index: Makefile
===================================================================
RCS file: /cvs/ports/devel/liburcu/Makefile,v
retrieving revision 1.28
diff -u -p -u -p -r1.28 Makefile
--- Makefile 17 Oct 2023 06:17:19 -0000 1.28
+++ Makefile 4 Jun 2024 04:00:59 -0000
@@ -3,7 +3,7 @@ COMMENT = user-level RCU implementation
V = 0.14.0
DISTNAME = userspace-rcu-$V
PKGNAME = liburcu-$V
-REVISION = 0
+REVISION = 1
SHARED_LIBS += urcu-bp 3.0 # 9.0
SHARED_LIBS += urcu-cds 2.1 # 9.0
@@ -34,5 +34,13 @@ COMPILER = base-clang ports-gcc
USE_GMAKE = Yes
CONFIGURE_STYLE = gnu
+
+TEST_DEPENDS += shells/bash
+
+# Adjust shell scripts to allow Bash in other locations
+# da56d5cad05a280a8171ef51f185e6d0d29610f0
+post-extract:
+ find ${WRKSRC}/tests -exec grep -q '/bin/bash' {} \; -print |\
+ xargs sed -i "s#/bin/bash#/usr/bin/env bash#g"
.include <bsd.port.mk>
Index: patches/patch-include_urcu_futex_h
===================================================================
RCS file: patches/patch-include_urcu_futex_h
diff -N patches/patch-include_urcu_futex_h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-include_urcu_futex_h 4 Jun 2024 04:00:59 -0000
@@ -0,0 +1,121 @@
+- Use futex on OpenBSD
+ e9af364c26b0e474b87a7fe5fb2222a399f8e180
+- futex.h: Use urcu_posix_assert to validate unused values
+ e463c38f0ec65d06e544681d1916991808a6a2b9
+
+Index: include/urcu/futex.h
+--- include/urcu/futex.h.orig
++++ include/urcu/futex.h
+@@ -39,20 +39,28 @@
+ #include <errno.h>
+ #include <urcu/compiler.h>
+ #include <urcu/arch.h>
++#include <urcu/assert.h>
+
+ #elif defined(__FreeBSD__)
+
+ #include <sys/types.h>
+ #include <sys/umtx.h>
+
++#elif defined(__OpenBSD__)
++
++#include <sys/time.h>
++#include <sys/futex.h>
++
+ #endif
+
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+
++#ifndef __OpenBSD__
+ #define FUTEX_WAIT 0
+ #define FUTEX_WAKE 1
++#endif
+
+ /*
+ * sys_futex compatibility header.
+@@ -78,8 +86,7 @@ extern int compat_futex_async(int32_t *uaddr, int op,
+ static inline int futex(int32_t *uaddr, int op, int32_t val,
+ const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
+ {
+- return syscall(__NR_futex, uaddr, op, val, timeout,
+- uaddr2, val3);
++ return syscall(__NR_futex, uaddr, op, val, timeout, uaddr2, val3);
+ }
+
+ static inline int futex_noasync(int32_t *uaddr, int op, int32_t val,
+@@ -121,9 +128,7 @@ static inline int futex_async(int32_t *uaddr, int op,
+ #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)))
++ const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
+ {
+ int umtx_op;
+ void *umtx_uaddr = NULL, *umtx_uaddr2 = NULL;
+@@ -132,6 +137,13 @@ static inline int futex_async(int32_t *uaddr, int op,
+ ._clockid = CLOCK_MONOTONIC,
+ };
+
++ /*
++ * Check if NULL or zero. Don't let users expect that they are
++ * taken into account.
++ */
++ urcu_posix_assert(!uaddr2);
++ urcu_posix_assert(!val3);
++
+ switch (op) {
+ case FUTEX_WAIT:
+ /* On FreeBSD, a "u_int" is a 32-bit integer. */
+@@ -158,6 +170,48 @@ static inline int futex_noasync(int32_t *uaddr, int op
+ const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
+ {
+ return futex_async(uaddr, op, val, timeout, uaddr2, val3);
++}
++
++#elif defined(__OpenBSD__)
++
++static inline int futex_noasync(int32_t *uaddr, int op, int32_t val,
++ const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
++{
++ int ret;
++
++ /*
++ * Check that val3 is zero. Don't let users expect that it is
++ * taken into account.
++ */
++ urcu_posix_assert(!val3);
++
++ ret = futex((volatile uint32_t *) uaddr, op, val, timeout,
++ (volatile uint32_t *) uaddr2);
++ if (caa_unlikely(ret < 0 && errno == ENOSYS)) {
++ return compat_futex_noasync(uaddr, op, val, timeout,
++ uaddr2, val3);
++ }
++ return ret;
++}
++
++static inline int futex_async(int32_t *uaddr, int op, int32_t val,
++ const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
++{
++ int ret;
++
++ /*
++ * Check that val3 is zero. Don't let users expect that it is
++ * taken into account.
++ */
++ urcu_posix_assert(!val3);
++
++ ret = futex((volatile uint32_t *) uaddr, op, val, timeout,
++ (volatile uint32_t *) uaddr2);
++ if (caa_unlikely(ret < 0 && errno == ENOSYS)) {
++ return compat_futex_async(uaddr, op, val, timeout,
++ uaddr2, val3);
++ }
++ return ret;
+ }
+
+ #elif defined(__CYGWIN__)
Index: patches/patch-include_urcu_syscall-compat_h
===================================================================
RCS file: /cvs/ports/devel/liburcu/patches/patch-include_urcu_syscall-compat_h,v
retrieving revision 1.3
diff -u -p -u -p -r1.3 patch-include_urcu_syscall-compat_h
--- patches/patch-include_urcu_syscall-compat_h 10 Mar 2022 00:04:05 -0000 1.3
+++ patches/patch-include_urcu_syscall-compat_h 4 Jun 2024 04:00:59 -0000
@@ -1,12 +1,16 @@
+Add support for OpenBSD
+11f3d1c24e6179abf8247611c5308f41d95389a1
+
Index: include/urcu/syscall-compat.h
--- include/urcu/syscall-compat.h.orig
+++ include/urcu/syscall-compat.h
-@@ -33,7 +33,7 @@
+@@ -33,7 +33,8 @@
#include <syscall.h>
#elif defined(__CYGWIN__) || defined(__APPLE__) || \
- defined(__FreeBSD__) || defined(__DragonFly__)
-+ defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)
++ defined(__FreeBSD__) || defined(__DragonFly__) || \
++ defined(__OpenBSD__)
/* Don't include anything on these platforms. */
#else
Index: patches/patch-tests_common_thread-id_h
===================================================================
RCS file: /cvs/ports/devel/liburcu/patches/patch-tests_common_thread-id_h,v
retrieving revision 1.4
diff -u -p -u -p -r1.4 patch-tests_common_thread-id_h
--- patches/patch-tests_common_thread-id_h 10 Mar 2022 00:04:05 -0000 1.4
+++ patches/patch-tests_common_thread-id_h 4 Jun 2024 04:00:59 -0000
@@ -1,4 +1,5 @@
-XXX not portable, but used by tests only.
+Add support for OpenBSD
+11f3d1c24e6179abf8247611c5308f41d95389a1
Index: tests/common/thread-id.h
--- tests/common/thread-id.h.orig
@@ -8,7 +9,7 @@ Index: tests/common/thread-id.h
}
+#elif defined(__OpenBSD__)
-+# include <unistd.h>
++#include <unistd.h>
+
+static inline
+unsigned long urcu_get_thread_id(void)
UPDATE: liburcu