svn commit: r559006 - in head/devel/glib20: . files
Tobias C. Berner
tcberner at FreeBSD.org
Wed Dec 23 17:30:19 UTC 2020
Author: tcberner
Date: Wed Dec 23 17:30:18 2020
New Revision: 559006
URL: https://svnweb.freebsd.org/changeset/ports/559006
Log:
devel/glib20: loops over all possible file descriptors
- Stop glib from looping over all possible file descriptors.
- This should greatly increase performance
PR: 236815
Submitted by: rozhuk.im at gmail.com (committed version)
Reported by: Eugene Grosbein <eugen at freebsd.org>
MFH: 2020Q4
Added:
head/devel/glib20/files/patch-glib_gspawn.c (contents, props changed)
Modified:
head/devel/glib20/Makefile
Modified: head/devel/glib20/Makefile
==============================================================================
--- head/devel/glib20/Makefile Wed Dec 23 17:24:48 2020 (r559005)
+++ head/devel/glib20/Makefile Wed Dec 23 17:30:18 2020 (r559006)
@@ -3,6 +3,7 @@
PORTNAME= glib
PORTVERSION= 2.66.4
+PORTREVISION= 1
PORTEPOCH= 1
CATEGORIES= devel
MASTER_SITES= GNOME
Added: head/devel/glib20/files/patch-glib_gspawn.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/devel/glib20/files/patch-glib_gspawn.c Wed Dec 23 17:30:18 2020 (r559006)
@@ -0,0 +1,81 @@
+--- glib/gspawn.c 2018-09-21 12:29:23.000000000 +0300
++++ glib/gspawn.c 2019-07-20 18:05:15.486558000 +0300
+@@ -51,6 +51,13 @@
+ #include <sys/syscall.h> /* for syscall and SYS_getdents64 */
+ #endif
+
++#ifdef __FreeBSD__
++#include <sys/param.h>
++#include <sys/sysctl.h>
++#include <sys/user.h>
++#include <sys/file.h>
++#endif
++
+ #include "gspawn.h"
+ #include "gspawn-private.h"
+ #include "gthread.h"
+@@ -1204,6 +1211,51 @@
+ }
+ #endif
+
++#ifdef __FreeBSD__
++static int
++fdwalk2(int (*func)(void *, int), void *udata, int *ret) {
++ size_t i, bufsz = 0;
++ struct xfile *xfbuf, *xf;
++ int uret = 0, pid_found = 0;
++ int mib[2] = { CTL_KERN, KERN_FILE };
++ pid_t pid;
++
++ if (NULL == func)
++ return EINVAL;
++
++ if (sysctl (mib, nitems(mib), NULL, &bufsz, NULL, 0) == -1)
++ return (errno);
++ bufsz += 65536;
++ xfbuf = alloca (bufsz);
++ if (xfbuf == NULL)
++ return errno;
++ if (sysctl (mib, 2, xfbuf, &bufsz, NULL, 0) == -1)
++ return errno;
++ bufsz /= sizeof(struct xfile);
++
++ pid = getpid();
++ for (i = 0; i < bufsz; i++) {
++ xf = &xfbuf[i];
++ if (pid != xf->xf_pid) {
++ if (pid_found) {
++ return 0;
++ } else {
++ continue;
++ }
++ }
++ pid_found = 1;
++ if (0 > xf->xf_fd)
++ continue;
++ uret = func (udata, xf->xf_fd);
++ if (uret != 0)
++ break;
++
++ }
++
++ return 0;
++}
++#endif
++
+ /* This function is called between fork() and exec() and hence must be
+ * async-signal-safe (see signal-safety(7)). */
+ static int
+@@ -1228,6 +1280,12 @@
+
+ #if 0 && defined(HAVE_SYS_RESOURCE_H)
+ struct rlimit rl;
++#endif
++
++#ifdef __FreeBSD__
++ if (fdwalk2(cb, data, &res) == 0)
++ return res;
++ /* If any sysctl/malloc call fails continue with the fall back method */
+ #endif
+
+ #ifdef __linux__
More information about the svn-ports-all
mailing list