svn commit: r357614 - in head/sys: kern sys
Conrad Meyer
cem at freebsd.org
Thu Feb 6 16:37:05 UTC 2020
Hi Pawel,
I don't think the (notyet) static assertion is quite right.
On Thu, Feb 6, 2020 at 4:46 AM Pawel Biernacki <kaktus at freebsd.org> wrote:
>
> Author: kaktus
> Date: Thu Feb 6 12:45:58 2020
> New Revision: 357614
> URL: https://svnweb.freebsd.org/changeset/base/357614
>
> Log:
> sysctl(9): add CTLFLAG_NEEDGIANT flag
> ...
> Modified: head/sys/sys/sysctl.h
> ==============================================================================
> --- head/sys/sys/sysctl.h Thu Feb 6 10:11:41 2020 (r357613)
> +++ head/sys/sys/sysctl.h Thu Feb 6 12:45:58 2020 (r357614)
> @@ -105,6 +105,13 @@ struct ctlname {
> ...
> + * One, and only one of CTLFLAG_MPSAFE or CTLFLAG_NEEDGIANT is required
> + * for SYSCTL_PROC and SYSCTL_NODE.
> ...
> @@ -263,6 +270,14 @@ TAILQ_HEAD(sysctl_ctx_list, sysctl_ctx_entry);
> #define __DESCR(d) ""
> #endif
>
> +#ifdef notyet
> +#define SYSCTL_ENFORCE_FLAGS(x) \
> + _Static_assert(((CTLFLAG_MPSAFE ^ CTLFLAG_NEEDGIANT) & (x)), \
> + "Has to be either CTLFLAG_MPSAFE or CTLFLAG_NEEDGIANT")
The current (notyet) assertion checks for one or both flags being set,
but you want to disallow both being set. The XOR operator here is
meaningless; it is the same as OR for different bit flags.
That would be something like:
#define _CTLFLAG_MUTUALLY_EXCLUSIVE (CTLFLAG_MPSAFE | CTLFLAG_NEEDGIANT);
#define SYSCTL_ENFORCE_FLAGS(x) do { \
_Static_assert(((x) & _CTLFLAG_MUTUALLY_EXCLUSIVE) != 0 && \
((x) & _CTLFLAG_MUTUALLY_EXCLUSIVE) !=
_CTLFLAG_MUTUALLY_EXCLUSIVE, \
"Must set exactly one of CTLFLAG_MPSAFE, CTLFLAG_NEEDGIANT"); \
} while (0)
Best,
Conrad
More information about the svn-src-head
mailing list