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.
This commit is contained in:
John Baldwin 2018-11-30 15:14:18 -08:00
parent 4717cec4fe
commit 93579f6f90
2 changed files with 29 additions and 0 deletions

View File

@ -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>

View File

@ -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;