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)