From 28377d1bf58625172a1734b92e835591d4d23a18 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sun, 8 May 2011 00:48:30 -0400 Subject: Optimize fdopendir a bit. Don't call fcntl(F_SETFD) unnecessarily. --- ChangeLog | 9 +++++++++ include/dirent.h | 3 ++- sysdeps/unix/fdopendir.c | 4 ++-- sysdeps/unix/opendir.c | 9 +++++---- 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 + + * 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 * elf/dl-reloc.c (_dl_try_allocate_static_tls ): 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) -- cgit 1.4.1