This is the mail archive of the gdb-cvs@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]

[binutils-gdb] Use kinfo_getfile to implement fdwalk on FreeBSD.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=93579f6f908fa6010b141fd5da2974d878869c80

commit 93579f6f908fa6010b141fd5da2974d878869c80
Author: John Baldwin <jhb@FreeBSD.org>
Date:   Fri Nov 30 15:14:18 2018 -0800

    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.

Diff:
---
 gdb/ChangeLog          |  5 +++++
 gdb/common/filestuff.c | 24 ++++++++++++++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 778eebc..83eabc4 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  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
             Simon Marchi  <simon.marchi@ericsson.com>
 
diff --git a/gdb/common/filestuff.c b/gdb/common/filestuff.c
index 0db5c69..f4d5e38 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,25 @@ fdwalk (int (*func) (void *, int), void *arg)
     }
   /* We may fall through to the next case.  */
 #endif
+#ifdef HAVE_KINFO_GETFILE
+  int nfd;
+  gdb::unique_xmalloc_ptr<struct kinfo_file[]> fdtbl
+    (kinfo_getfile (getpid (), &nfd));
+  if (fdtbl != NULL)
+    {
+      for (int i = 0; i < nfd; i++)
+	{
+	  if (fdtbl[i].kf_fd >= 0)
+	    {
+	      int result = func (arg, fdtbl[i].kf_fd);
+	      if (result != 0)
+		return result;
+	    }
+	}
+      return 0;
+    }
+  /* We may fall through to the next case.  */
+#endif
 
   {
     int max, fd;


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