1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

* misc/Makefile (routines): Add preadv, preadv64, pwritev, pwritev64.

* misc/Versions: Export preadv, preadv64, pwritev, pwritev64 for
	GLIBC_2.10.
	* misc/sys/uio.h: Declare preadv, preadv64, pwritev, pwritev64.
	* sysdeps/unix/sysv/linux/kernel-features.h: Add entries for preadv
	and pwritev.
	* misc/preadv.c: New file.
	* misc/preadv64.c: New file.
	* misc/pwritev.c: New file.
	* misc/pwritev64.c: New file.
	* sysdeps/posx/preadv.c: New file.
	* sysdeps/posx/preadv64.c: New file.
	* sysdeps/posx/pwritev.c: New file.
	* sysdeps/posx/pwritev64.c: New file.
	* sysdeps/unix/sysv/linux/preadv.c: New file.
	* sysdeps/unix/sysv/linux/preadv64.c: New file.
	* sysdeps/unix/sysv/linux/pwritev.c: New file.
	* sysdeps/unix/sysv/linux/pwritev64.c: New file.
	* sysdeps/unix/sysv/linux/wordsize-64/preadv64.c: New file.
	* sysdeps/unix/sysv/linux/wordsize-64/pwritev64.c: New file.
This commit is contained in:
Ulrich Drepper
2009-04-03 19:57:16 +00:00
parent 7166c77ad0
commit e109c6124f
20 changed files with 708 additions and 9 deletions

View File

@ -529,3 +529,10 @@
#if __LINUX_KERNEL_VERSION >= 0x02061d
# define __ASSUME_FUTEX_CLOCK_REALTIME 1
#endif
/* Support for preadv and pwritev was added in 2.6.30. */
#if __LINUX_KERNEL_VERSION >= 0x02061e \
&& (defined __i386__ || defined __x86_64__)
# define __ASSUME_PREADV 1
# define __ASSUME_PWRITEV 1
#endif

View File

@ -0,0 +1,88 @@
/* Copyright (C) 2009 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
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <stddef.h>
#include <sys/param.h>
#if __WORDSIZE == 64
/* Hide the preadv64 declaration. */
# define preadv64 __redirect_preadv64
#endif
#include <sys/uio.h>
#include <sysdep-cancel.h>
#include <sys/syscall.h>
#include <kernel-features.h>
#ifndef PREADV
# define PREADV preadv
# define PREADV_REPLACEMENT __atomic_preadv_replacement
# define PREAD __pread
# define OFF_T off_t
#endif
static ssize_t PREADV_REPLACEMENT (int, __const struct iovec *,
int, OFF_T) internal_function;
ssize_t
PREADV (fd, vector, count, offset)
int fd;
const struct iovec *vector;
int count;
OFF_T offset;
{
#ifdef __NR_preadv
ssize_t result;
if (SINGLE_THREAD_P)
result = INLINE_SYSCALL (preadv, 5, fd, vector, count, offset >> 32,
offset & 0xffffffff);
else
{
int oldtype = LIBC_CANCEL_ASYNC ();
result = INLINE_SYSCALL (preadv, 5, fd, vector, count, offset >> 32,
offset & 0xffffffff);
LIBC_CANCEL_RESET (oldtype);
}
# ifdef __ASSUME_PREADV
return result;
# endif
#endif
#ifndef __ASSUME_PREADV
# ifdef __NR_preadv
if (result >= 0 || errno != ENOSYS)
return result;
# endif
return PREADV_REPLACEMENT (fd, vector, count, offset);
#endif
}
#if __WORDSIZE == 64
# undef preadv64
strong_alias (preadv, preadv64)
#endif
#ifndef __ASSUME_PREADV
# undef PREADV
# define PREADV static internal_function PREADV_REPLACEMENT
# include <sysdeps/posix/preadv.c>
#endif

View File

@ -0,0 +1,6 @@
#define PREADV preadv64
#define PREADV_REPLACEMENT __atomic_preadv64_replacement
#define PREAD __pread64
#define OFF_T off64_t
#include "preadv.c"

View File

@ -0,0 +1,88 @@
/* Copyright (C) 2009 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
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <stddef.h>
#include <sys/param.h>
#if __WORDSIZE == 64 && !defined PWRITEV
/* Hide the pwritev64 declaration. */
# define pwritev64 __redirect_pwritev64
#endif
#include <sys/uio.h>
#include <sysdep-cancel.h>
#include <sys/syscall.h>
#include <kernel-features.h>
#ifndef PWRITEV
# define PWRITEV pwritev
# define PWRITEV_REPLACEMENT __atomic_pwritev_replacement
# define PWRITE __pwrite
# define OFF_T off_t
#endif
static ssize_t PWRITEV_REPLACEMENT (int, __const struct iovec *,
int, OFF_T) internal_function;
ssize_t
PWRITEV (fd, vector, count, offset)
int fd;
const struct iovec *vector;
int count;
OFF_T offset;
{
#ifdef __NR_pwritev
ssize_t result;
if (SINGLE_THREAD_P)
result = INLINE_SYSCALL (pwritev, 5, fd, vector, count, offset >> 32,
offset & 0xffffffff);
else
{
int oldtype = LIBC_CANCEL_ASYNC ();
result = INLINE_SYSCALL (pwritev, 5, fd, vector, count, offset >> 32,
offset & 0xffffffff);
LIBC_CANCEL_RESET (oldtype);
}
# ifdef __ASSUME_PWRITEV
return result;
# endif
#endif
#ifndef __ASSUME_PWRITEV
# ifdef __NR_pwritev
if (result >= 0 || errno != ENOSYS)
return result;
# endif
return PWRITEV_REPLACEMENT (fd, vector, count, offset);
#endif
}
#if __WORDSIZE == 64 && defined pwritev64
# undef pwritev64
strong_alias (pwritev, pwritev64)
#endif
#ifndef __ASSUME_PWRITEV
# undef PWRITEV
# define PWRITEV static internal_function PWRITEV_REPLACEMENT
# include <sysdeps/posix/pwritev.c>
#endif

View File

@ -0,0 +1,6 @@
#define PWRITEV pwritev64
#define PWRITEV_REPLACEMENT __atomic_pwritev64_replacement
#define PWRITE __pwrite64
#define OFF_T off64_t
#include "pwritev.c"

View File

@ -0,0 +1 @@
/* Empty since the preadv syscall is equivalent. */

View File

@ -0,0 +1 @@
/* Empty since the pwritev syscall is equivalent. */