diff options
Diffstat (limited to 'lib/libpthread/thread/thr_readv.c')
-rw-r--r-- | lib/libpthread/thread/thr_readv.c | 53 |
1 files changed, 1 insertions, 52 deletions
diff --git a/lib/libpthread/thread/thr_readv.c b/lib/libpthread/thread/thr_readv.c index 707c04c..c3b03eb 100644 --- a/lib/libpthread/thread/thr_readv.c +++ b/lib/libpthread/thread/thr_readv.c @@ -43,63 +43,12 @@ __weak_reference(__readv, readv); ssize_t -_readv(int fd, const struct iovec * iov, int iovcnt) -{ - struct pthread *curthread = _get_curthread(); - int ret; - int type; - - /* Lock the file descriptor for read: */ - if ((ret = _FD_LOCK(fd, FD_READ, NULL)) == 0) { - /* Get the read/write mode type: */ - type = _thread_fd_getflags(fd) & O_ACCMODE; - - /* Check if the file is not open for read: */ - if (type != O_RDONLY && type != O_RDWR) { - /* File is not open for read: */ - errno = EBADF; - _FD_UNLOCK(fd, FD_READ); - return (-1); - } - - /* Perform a non-blocking readv syscall: */ - while ((ret = __sys_readv(fd, iov, iovcnt)) < 0) { - if ((_thread_fd_getflags(fd) & O_NONBLOCK) == 0 && - (errno == EWOULDBLOCK || errno == EAGAIN)) { - curthread->data.fd.fd = fd; - _thread_kern_set_timeout(NULL); - - /* Reset the interrupted operation flag: */ - curthread->interrupted = 0; - - _thread_kern_sched_state(PS_FDR_WAIT, - __FILE__, __LINE__); - - /* - * Check if the operation was - * interrupted by a signal - */ - if (curthread->interrupted) { - errno = EINTR; - ret = -1; - break; - } - } else { - break; - } - } - _FD_UNLOCK(fd, FD_READ); - } - return (ret); -} - -ssize_t __readv(int fd, const struct iovec *iov, int iovcnt) { ssize_t ret; _thread_enter_cancellation_point(); - ret = _readv(fd, iov, iovcnt); + ret = __sys_readv(fd, iov, iovcnt); _thread_leave_cancellation_point(); return ret; |