git: 44c5db52e258 - main - Add eventfd(3) wrappers to libc.

Konstantin Belousov kib at FreeBSD.org
Sun Dec 27 10:57:39 UTC 2020


The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=44c5db52e258aebed0c5d01047c79bc3d8487966

commit 44c5db52e258aebed0c5d01047c79bc3d8487966
Author:     Konstantin Belousov <kib at FreeBSD.org>
AuthorDate: 2020-12-23 14:16:35 +0000
Commit:     Konstantin Belousov <kib at FreeBSD.org>
CommitDate: 2020-12-27 10:57:26 +0000

    Add eventfd(3) wrappers to libc.
    
    eventfd_read/write one-liners are from musl libc.
    
    Submitted by:   greg at unrelenting.technology
    Reviewed by:    markj (previous version)
    MFC after:      2 weeks
    Differential Revision:  https://reviews.freebsd.org/D26668
---
 lib/libc/gen/Makefile.inc       |  1 +
 lib/libc/gen/Symbol.map         |  3 +++
 lib/libc/gen/eventfd.c          | 54 +++++++++++++++++++++++++++++++++++++++++
 lib/libc/include/libc_private.h |  1 +
 lib/libc/sys/Makefile.inc       |  3 +++
 5 files changed, 62 insertions(+)

diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc
index c0d719371fc8..76a21975f1ac 100644
--- a/lib/libc/gen/Makefile.inc
+++ b/lib/libc/gen/Makefile.inc
@@ -47,6 +47,7 @@ SRCS+=	__getosreldate.c \
 	err.c \
 	errlst.c \
 	errno.c \
+	eventfd.c \
 	exec.c \
 	exect.c \
 	fdevname.c \
diff --git a/lib/libc/gen/Symbol.map b/lib/libc/gen/Symbol.map
index 2fb8e080de6a..c89eb63caada 100644
--- a/lib/libc/gen/Symbol.map
+++ b/lib/libc/gen/Symbol.map
@@ -422,6 +422,9 @@ FBSD_1.5 {
 };
 
 FBSD_1.6 {
+	eventfd;
+	eventfd_read;
+	eventfd_write;
 	getlogin_r;
 	memalign;
 	scandir_b;
diff --git a/lib/libc/gen/eventfd.c b/lib/libc/gen/eventfd.c
new file mode 100644
index 000000000000..b757f82029a9
--- /dev/null
+++ b/lib/libc/gen/eventfd.c
@@ -0,0 +1,54 @@
+/*-
+ * SPDX-License-Identifier: MIT
+ *
+ * Copyright (c) 2005-2020 Rich Felker, et al.
+ * Copyright (c) 2020 Greg V
+ *
+ * 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 <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "namespace.h"
+#include <sys/eventfd.h>
+#include <sys/specialfd.h>
+#include <unistd.h>
+#include "un-namespace.h"
+#include "libc_private.h"
+
+int eventfd(unsigned int initval, int flags)
+{
+	struct specialfd_eventfd args;
+
+	args.initval = initval;
+	args.flags = flags;
+	return (__sys___specialfd(SPECIALFD_EVENTFD, &args, sizeof(args)));
+}
+
+int eventfd_read(int fd, eventfd_t *value)
+{
+	return (sizeof(*value) == _read(fd, value, sizeof(*value)) ? 0 : -1);
+}
+
+int eventfd_write(int fd, eventfd_t value)
+{
+	return (sizeof(value) == _write(fd, &value, sizeof(value)) ? 0 : -1);
+}
diff --git a/lib/libc/include/libc_private.h b/lib/libc/include/libc_private.h
index 21f5b1762eb4..d26c78c21c07 100644
--- a/lib/libc/include/libc_private.h
+++ b/lib/libc/include/libc_private.h
@@ -382,6 +382,7 @@ int		__sys_sigtimedwait(const __sigset_t *, struct __siginfo *,
 		    const struct timespec *);
 int		__sys_sigwait(const __sigset_t *, int *);
 int		__sys_sigwaitinfo(const __sigset_t *, struct __siginfo *);
+int		__sys___specialfd(int, const void *, __size_t);
 int		__sys_statfs(const char *, struct statfs *);
 int		__sys_swapcontext(struct __ucontext *,
 		    const struct __ucontext *);
diff --git a/lib/libc/sys/Makefile.inc b/lib/libc/sys/Makefile.inc
index 38156ccf507d..d43a59719563 100644
--- a/lib/libc/sys/Makefile.inc
+++ b/lib/libc/sys/Makefile.inc
@@ -178,6 +178,7 @@ MAN+=	abort2.2 \
 	cpuset_getaffinity.2 \
 	cpuset_getdomain.2 \
 	dup.2 \
+	eventfd.2 \
 	execve.2 \
 	_exit.2 \
 	extattr_get_file.2 \
@@ -379,6 +380,8 @@ MLINKS+=cpuset.2 cpuset_getid.2 \
 MLINKS+=cpuset_getaffinity.2 cpuset_setaffinity.2
 MLINKS+=cpuset_getdomain.2 cpuset_setdomain.2
 MLINKS+=dup.2 dup2.2
+MLINKS+=eventfd.2 eventfd_read.3 \
+	eventfd.2 eventfd_write.3
 MLINKS+=execve.2 fexecve.2
 MLINKS+=extattr_get_file.2 extattr.2 \
 	extattr_get_file.2 extattr_delete_fd.2 \


More information about the dev-commits-src-all mailing list