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:
parent
4717cec4fe
commit
93579f6f90
|
@ -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>
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue