This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Use kinfo_getfile to implement fdwalk on FreeBSD.


kinfo_getfile() requires a couple of system calls to fetch the list of
open file descriptors.  This can be much cheaper than invoking fstat
on all of the values from 0 to the open file resource limit maximum.

gdb/ChangeLog:

	* common/filestuff.c [HAVE_KINFO_GETFILE]: Include headers.
	(fdwalk) [HAVE_KINFO_GETFILE]: Use kinfo_getfile.
---
 gdb/ChangeLog          |  5 +++++
 gdb/common/filestuff.c | 26 ++++++++++++++++++++++++++
 2 files changed, 31 insertions(+)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 348eb65ec7..f88cc16b4d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2018-11-30  John Baldwin  <jhb@FreeBSD.org>
+
+	* common/filestuff.c [HAVE_KINFO_GETFILE]: Include headers.
+	(fdwalk) [HAVE_KINFO_GETFILE]: Use kinfo_getfile.
+
 2018-11-30  John Baldwin  <jhb@FreeBSD.org>
 
 	* fbsd-nat.c [__FreeBSD_version >= 700009] (USE_SIGINFO): Macro
diff --git a/gdb/common/filestuff.c b/gdb/common/filestuff.c
index 0db5c6936b..48b0487f54 100644
--- a/gdb/common/filestuff.c
+++ b/gdb/common/filestuff.c
@@ -36,6 +36,11 @@
 #define HAVE_SOCKETS 1
 #endif
 
+#ifdef HAVE_KINFO_GETFILE
+#include <sys/user.h>
+#include <libutil.h>
+#endif
+
 #ifdef HAVE_SYS_RESOURCE_H
 #include <sys/resource.h>
 #endif /* HAVE_SYS_RESOURCE_H */
@@ -108,6 +113,27 @@ fdwalk (int (*func) (void *, int), void *arg)
     }
   /* We may fall through to the next case.  */
 #endif
+#ifdef HAVE_KINFO_GETFILE
+  gdb::unique_xmalloc_ptr<struct kinfo_file> fdtbl;
+  int nfd;
+  fdtbl.reset (kinfo_getfile (getpid (), &nfd));
+  if (fdtbl != NULL)
+    {
+      int result = 0;
+      struct kinfo_file *kf = fdtbl.get ();
+      for (int i = 0; i < nfd; i++, kf++)
+	{
+	  if (kf->kf_fd >= 0)
+	    {
+	      result = func (arg, kf->kf_fd);
+	      if (result != 0)
+		break;
+	    }
+	}
+      return result;
+    }
+  /* We may fall through to the next case.  */
+#endif
 
   {
     int max, fd;
-- 
2.19.2


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]