diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-rw-r--r-- | sysdeps/unix/sysv/linux/readv.c | 41 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/writev.c | 41 |
2 files changed, 32 insertions, 50 deletions
diff --git a/sysdeps/unix/sysv/linux/readv.c b/sysdeps/unix/sysv/linux/readv.c index d12fa49373..bff4a3ff74 100644 --- a/sysdeps/unix/sysv/linux/readv.c +++ b/sysdeps/unix/sysv/linux/readv.c @@ -37,42 +37,33 @@ static ssize_t __atomic_readv_replacement (int, __const struct iovec *, #endif -/* We should deal with kernel which have a smaller UIO_FASTIOV as well - as a very big count. */ -static ssize_t -do_readv (int fd, const struct iovec *vector, int count) -{ - ssize_t bytes_read; - - bytes_read = INLINE_SYSCALL (readv, 3, fd, CHECK_N (vector, count), count); - -#ifdef __ASSUME_COMPLETE_READV_WRITEV - return bytes_read; -#else - if (bytes_read >= 0 || errno != EINVAL || count <= UIO_FASTIOV) - return bytes_read; - - return __atomic_readv_replacement (fd, vector, count); -#endif -} - - ssize_t __libc_readv (fd, vector, count) int fd; const struct iovec *vector; int count; { - if (SINGLE_THREAD_P) - return do_readv (fd, vector, count); + ssize_t result; - int oldtype = LIBC_CANCEL_ASYNC (); + if (SINGLE_THREAD_P) + result = INLINE_SYSCALL (readv, 3, fd, CHECK_N (vector, count), count); + else + { + int oldtype = LIBC_CANCEL_ASYNC (); - int result = do_readv (fd, vector, count); + result = INLINE_SYSCALL (readv, 3, fd, CHECK_N (vector, count), count); - LIBC_CANCEL_RESET (oldtype); + LIBC_CANCEL_RESET (oldtype); + } +#ifdef __ASSUME_COMPLETE_READV_WRITEV return result; +#else + if (result >= 0 || errno != EINVAL || count <= UIO_FASTIOV) + return result; + + return __atomic_readv_replacement (fd, vector, count); +#endif } strong_alias (__libc_readv, __readv) weak_alias (__libc_readv, readv) diff --git a/sysdeps/unix/sysv/linux/writev.c b/sysdeps/unix/sysv/linux/writev.c index 398a841bb3..55e915d34d 100644 --- a/sysdeps/unix/sysv/linux/writev.c +++ b/sysdeps/unix/sysv/linux/writev.c @@ -37,42 +37,33 @@ static ssize_t __atomic_writev_replacement (int, const struct iovec *, #endif -/* We should deal with kernel which have a smaller UIO_FASTIOV as well - as a very big count. */ -static ssize_t -do_writev (int fd, const struct iovec *vector, int count) -{ - ssize_t bytes_written; - - bytes_written = INLINE_SYSCALL (writev, 3, fd, CHECK_N (vector, count), - count); - -#ifdef __ASSUME_COMPLETE_READV_WRITEV - return bytes_written; -#else - if (bytes_written >= 0 || errno != EINVAL || count <= UIO_FASTIOV) - return bytes_written; - - return __atomic_writev_replacement (fd, vector, count); -#endif -} - ssize_t __libc_writev (fd, vector, count) int fd; const struct iovec *vector; int count; { - if (SINGLE_THREAD_P) - return do_writev (fd, vector, count); + ssize_t result; - int oldtype = LIBC_CANCEL_ASYNC (); + if (SINGLE_THREAD_P) + result = INLINE_SYSCALL (writev, 3, fd, CHECK_N (vector, count), count); + else + { + int oldtype = LIBC_CANCEL_ASYNC (); - ssize_t result = do_writev (fd, vector, count); + result = INLINE_SYSCALL (writev, 3, fd, CHECK_N (vector, count), count); - LIBC_CANCEL_RESET (oldtype); + LIBC_CANCEL_RESET (oldtype); + } +#ifdef __ASSUME_COMPLETE_READV_WRITEV return result; +#else + if (result >= 0 || errno != EINVAL || count <= UIO_FASTIOV) + return result; + + return __atomic_writev_replacement (fd, vector, count); +#endif } strong_alias (__libc_writev, __writev) weak_alias (__libc_writev, writev) |