* [PATCH v4] Use _umtx_op for futex on FreeBSD [not found] <20200128011722.36025-1-alex_y_xu.ref@yahoo.ca> @ 2020-01-28 1:17 ` Alex Xu (Hello71) via lttng-dev 2020-01-30 18:34 ` Mathieu Desnoyers 0 siblings, 1 reply; 2+ messages in thread From: Alex Xu (Hello71) via lttng-dev @ 2020-01-28 1:17 UTC (permalink / raw) To: lttng-dev Tested with "make check", "make regtest" and a knotd slave. --- include/urcu/futex.h | 45 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/include/urcu/futex.h b/include/urcu/futex.h index c206c6f..0777d95 100644 --- a/include/urcu/futex.h +++ b/include/urcu/futex.h @@ -24,6 +24,7 @@ */ #include <urcu/config.h> +#include <errno.h> #include <stdint.h> #include <time.h> @@ -103,6 +104,50 @@ static inline int futex_async(int32_t *uaddr, int op, int32_t val, return ret; } +#elif defined(__FreeBSD__) + +#include <sys/types.h> +#include <sys/umtx.h> + +static inline int futex_async(int32_t *uaddr, int op, int32_t val, + const struct timespec *timeout, int32_t *uaddr2, int32_t val3) +{ + 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__) /* -- 2.25.0 ^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v4] Use _umtx_op for futex on FreeBSD 2020-01-28 1:17 ` [PATCH v4] Use _umtx_op for futex on FreeBSD Alex Xu (Hello71) via lttng-dev @ 2020-01-30 18:34 ` Mathieu Desnoyers 0 siblings, 0 replies; 2+ messages in thread From: Mathieu Desnoyers @ 2020-01-30 18:34 UTC (permalink / raw) To: Alex Xu; +Cc: lttng-dev, paulmck Merged with small cosmetic tweaks into liburcu master, thanks! Mathieu ----- On Jan 27, 2020, at 8:17 PM, lttng-dev lttng-dev@lists.lttng.org wrote: > Tested with "make check", "make regtest" and a knotd slave. > --- > include/urcu/futex.h | 45 ++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 45 insertions(+) > > diff --git a/include/urcu/futex.h b/include/urcu/futex.h > index c206c6f..0777d95 100644 > --- a/include/urcu/futex.h > +++ b/include/urcu/futex.h > @@ -24,6 +24,7 @@ > */ > > #include <urcu/config.h> > +#include <errno.h> > #include <stdint.h> > #include <time.h> > > @@ -103,6 +104,50 @@ static inline int futex_async(int32_t *uaddr, int op, > int32_t val, > return ret; > } > > +#elif defined(__FreeBSD__) > + > +#include <sys/types.h> > +#include <sys/umtx.h> > + > +static inline int futex_async(int32_t *uaddr, int op, int32_t val, > + const struct timespec *timeout, int32_t *uaddr2, int32_t val3) > +{ > + 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__) > > /* > -- > 2.25.0 > > _______________________________________________ > lttng-dev mailing list > lttng-dev@lists.lttng.org > https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com ^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2020-01-30 18:34 UTC | newest] Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- [not found] <20200128011722.36025-1-alex_y_xu.ref@yahoo.ca> 2020-01-28 1:17 ` [PATCH v4] Use _umtx_op for futex on FreeBSD Alex Xu (Hello71) via lttng-dev 2020-01-30 18:34 ` Mathieu Desnoyers
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).