summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@gmail.com>2011-05-08 00:48:30 -0400
committerUlrich Drepper <drepper@gmail.com>2011-05-08 00:48:30 -0400
commit28377d1bf58625172a1734b92e835591d4d23a18 (patch)
tree4a05343e1493965e45971e6f3a7d5566da23596f
parent66bdbaa4522f561d4ea90a77af243c004ecf642c (diff)
downloadglibc-28377d1bf58625172a1734b92e835591d4d23a18.tar.gz
Optimize fdopendir a bit.
Don't call fcntl(F_SETFD) unnecessarily.
-rw-r--r--ChangeLog9
-rw-r--r--include/dirent.h3
-rw-r--r--sysdeps/unix/fdopendir.c4
-rw-r--r--sysdeps/unix/opendir.c9
4 files changed, 18 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 7d2da4e836..132f0d0649 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2011-05-08 Ulrich Drepper <drepper@gmail.com>
+
+ * include/dirent.h (__alloc_dir): Add flags parameter.
+ * sysdeps/unix/fdopendir.c (__fdopendir): Pass flags to __alloc_dir.
+ * sysdeps/unix/opendir.c (__opendir): Pass 0 in new parameter to
+ __alloc_dir.
+ (__alloc_dir): Take new parameter. Don't call fcntl for invocations
+ from fdopendir if O_CLOEXEC is already set.
+
2011-03-15 Alan Modra <amodra@gmail.com>
* elf/dl-reloc.c (_dl_try_allocate_static_tls <TLS_DTV_AT_TP>): Handle
diff --git a/include/dirent.h b/include/dirent.h
index 3f6c4b9ae5..4db63a626c 100644
--- a/include/dirent.h
+++ b/include/dirent.h
@@ -28,7 +28,8 @@ extern int __alphasort64 (const struct dirent64 **a, const struct dirent64 **b)
extern int __versionsort64 (const struct dirent64 **a,
const struct dirent64 **b)
__attribute_pure__;
-extern DIR *__alloc_dir (int fd, bool close_fd, const struct stat64 *statp)
+extern DIR *__alloc_dir (int fd, bool close_fd, int flags,
+ const struct stat64 *statp)
internal_function;
#endif
diff --git a/sysdeps/unix/fdopendir.c b/sysdeps/unix/fdopendir.c
index 565ce1ed72..9c5969d9a3 100644
--- a/sysdeps/unix/fdopendir.c
+++ b/sysdeps/unix/fdopendir.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 2005, 2006, 2011 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -47,6 +47,6 @@ __fdopendir (int fd)
return NULL;
}
- return __alloc_dir (fd, false, &statbuf);
+ return __alloc_dir (fd, false, flags, &statbuf);
}
weak_alias (__fdopendir, fdopendir)
diff --git a/sysdeps/unix/opendir.c b/sysdeps/unix/opendir.c
index fbf14f5eec..c2d1ddaf88 100644
--- a/sysdeps/unix/opendir.c
+++ b/sysdeps/unix/opendir.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991-1996,98,2000-2003,2005,2007,2009
+/* Copyright (C) 1991-1996,98,2000-2003,2005,2007,2009,2011
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -138,7 +138,7 @@ __opendir (const char *name)
statp = &statbuf;
}
- return __alloc_dir (fd, true, statp);
+ return __alloc_dir (fd, true, 0, statp);
}
weak_alias (__opendir, opendir)
@@ -158,13 +158,14 @@ check_have_o_cloexec (int fd)
DIR *
internal_function
-__alloc_dir (int fd, bool close_fd, const struct stat64 *statp)
+__alloc_dir (int fd, bool close_fd, int flags, const struct stat64 *statp)
{
/* We always have to set the close-on-exit flag if the user provided
the file descriptor. Otherwise only if we have no working
O_CLOEXEC support. */
#ifdef O_CLOEXEC
- if (! close_fd || ! check_have_o_cloexec (fd))
+ if ((! close_fd && (flags & O_CLOEXEC) == 0)
+ || ! check_have_o_cloexec (fd))
#endif
{
if (__builtin_expect (__fcntl (fd, F_SETFD, FD_CLOEXEC), 0) < 0)