diff options
author | Ulrich Drepper <drepper@redhat.com> | 2005-11-19 17:22:39 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2005-11-19 17:22:39 +0000 |
commit | eac10791463c42ff4f6da20f548c046e300b3d6d (patch) | |
tree | 8061d956005bb5cee17eabe4d6473f1a1039b6fb /nscd/connections.c | |
parent | 74ac0a89d27d1bff7238ecb14dd0a5009c2f479b (diff) | |
download | glibc-eac10791463c42ff4f6da20f548c046e300b3d6d.tar glibc-eac10791463c42ff4f6da20f548c046e300b3d6d.tar.gz glibc-eac10791463c42ff4f6da20f548c046e300b3d6d.tar.bz2 glibc-eac10791463c42ff4f6da20f548c046e300b3d6d.zip |
* sysdeps/unix/sysv/linux/ia64/bits/shm.h (shmatt_t): New type.cvs/fedora-glibc-20051119T1959
(struct shmid_ds): Use it for shm_nattch field.
2005-11-18 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/futimesat.c (futimesat): If FILE is NULL,
set access and modification times of the file referenced by FD.
* sysdeps/generic/futimesat.c (futimesat): Don't return EINVAL if
FILE is NULL. Don't check FD if FILE is absolute path.
2005-11-19 Ulrich Drepper <drepper@redhat.com>
* nscd/nscd_gethst_r.c (nscd_gethst_r): Avoid unnecesary read call
if there are no aliases.
* sysdeps/unix/sysv/linux/Makefile (CFLAGS-connections.c,
CFLAGS-pwdcache.c, CFLAGS-grpcache.c, CFLAGS-hstcache.c,
CFLAGS-aicache.c, CFLAGS-initgrcache.c): Add -DHAVE_SENDFILE.
* sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_SENDFILE):
Define.
* nscd/pwdcache.c [HAVE_SENDFILE]: Include <sys/sendfile.h> and
<kernel-features.h>.
[HAVE_SENDFILE] (cache_addpw): Use sendfile to transmit positive
result.
* nscd/grpcache.c: Likewise.
* nscd/hstcache.c: Likewise.
* nscd/aicache.c: Likewise.
* nscd/initgrcache.c: Likewise.
* nscd/connectionc.c: Likewise.
Diffstat (limited to 'nscd/connections.c')
-rw-r--r-- | nscd/connections.c | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/nscd/connections.c b/nscd/connections.c index 137cfb239a..0a1ca77836 100644 --- a/nscd/connections.c +++ b/nscd/connections.c @@ -39,6 +39,9 @@ #include <sys/mman.h> #include <sys/param.h> #include <sys/poll.h> +#ifdef HAVE_SENDFILE +# include <sys/sendfile.h> +#endif #include <sys/socket.h> #include <sys/stat.h> #include <sys/un.h> @@ -46,6 +49,9 @@ #include "nscd.h" #include "dbg_log.h" #include "selinux.h" +#ifdef HAVE_SENDFILE +# include <kernel-features.h> +#endif /* Wrapper functions with error checking for standard functions. */ @@ -939,8 +945,33 @@ cannot handle old request version %d; current version is %d"), if (cached != NULL) { /* Hurray it's in the cache. */ - if (writeall (fd, cached->data, cached->recsize) - != cached->recsize + ssize_t nwritten; + +#ifdef HAVE_SENDFILE + if (db->mmap_used || !cached->notfound) + { + assert (db->wr_fd != -1); + assert ((char *) cached->data > (char *) db->data); + assert ((char *) cached->data - (char *) db->head + + cached->recsize + <= (sizeof (struct database_pers_head) + + db->head->module * sizeof (ref_t) + + db->head->data_size)); + off_t off = (char *) cached->data - (char *) db->head; + nwritten = sendfile (fd, db->wr_fd, &off, cached->recsize); +# ifndef __ASSUME_SENDFILE + if (nwritten == -1 && errno == ENOSYS) + goto use_write; +# endif + } + else +# ifndef __ASSUME_SENDFILE + use_write: +# endif +#endif + nwritten = writeall (fd, cached->data, cached->recsize); + + if (nwritten != cached->recsize && __builtin_expect (debug_level, 0) > 0) { /* We have problems sending the result. */ |