From b48ca33019356282f64c4fdf86902be8129877ea Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Fri, 28 Mar 2014 17:29:04 +0400 Subject: [PATCH] fs: avoid using readv/writev where possible The VirtualBox shared file system doesn't seem to be capable of `readv()` syscall. Since we don't need them in the most of the cases anyway, it won't hurt to just use `read()` and `write()` when we are reading just one buffer. see https://github.com/joyent/node/issues/7343 for details. --- src/unix/fs.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/unix/fs.c b/src/unix/fs.c index cf45669c..8a4edcbc 100644 --- a/src/unix/fs.c +++ b/src/unix/fs.c @@ -217,9 +217,17 @@ skip: 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 @@ -265,6 +273,8 @@ static ssize_t uv__fs_read(uv_fs_t* req) { # endif #endif } + +done: if (req->bufs != req->bufsml) free(req->bufs); return result; @@ -583,9 +593,16 @@ static ssize_t uv__fs_write(uv_fs_t* req) { 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 @@ -632,6 +649,7 @@ static ssize_t uv__fs_write(uv_fs_t* req) { #endif } +done: #if defined(__APPLE__) pthread_mutex_unlock(&lock); #endif