ext/libuv/src/unix/fs.c in libuv-0.12.2 vs ext/libuv/src/unix/fs.c in libuv-0.12.3
- old
+ new
@@ -215,13 +215,21 @@
static ssize_t uv__fs_read(uv_fs_t* req) {
ssize_t result;
- if (req->off < 0)
- result = readv(req->file, (struct iovec*) req->bufs, req->nbufs);
- else {
+ if (req->off < 0) {
+ if (req->nbufs == 1)
+ result = read(req->file, req->bufs[0].base, req->bufs[0].len);
+ else
+ result = readv(req->file, (struct iovec*) req->bufs, req->nbufs);
+ } else {
+ if (req->nbufs == 1) {
+ result = pread(req->file, req->bufs[0].base, req->bufs[0].len, req->off);
+ goto done;
+ }
+
#if HAVE_PREADV
result = preadv(req->file, (struct iovec*) req->bufs, req->nbufs, req->off);
#else
# if defined(__linux__)
static int no_preadv;
@@ -263,10 +271,12 @@
}
}
# endif
#endif
}
+
+done:
if (req->bufs != req->bufsml)
free(req->bufs);
return result;
}
@@ -581,13 +591,20 @@
#if defined(__APPLE__)
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&lock);
#endif
- if (req->off < 0)
- r = writev(req->file, (struct iovec*) req->bufs, req->nbufs);
- else {
+ if (req->off < 0) {
+ if (req->nbufs == 1)
+ r = write(req->file, req->bufs[0].base, req->bufs[0].len);
+ else
+ r = writev(req->file, (struct iovec*) req->bufs, req->nbufs);
+ } else {
+ if (req->nbufs == 1) {
+ r = pwrite(req->file, req->bufs[0].base, req->bufs[0].len, req->off);
+ goto done;
+ }
#if HAVE_PREADV
r = pwritev(req->file, (struct iovec*) req->bufs, req->nbufs, req->off);
#else
# if defined(__linux__)
static int no_pwritev;
@@ -630,9 +647,10 @@
}
# endif
#endif
}
+done:
#if defined(__APPLE__)
pthread_mutex_unlock(&lock);
#endif
if (req->bufs != req->bufsml)