diff options
author | ZyX <kp-pav@yandex.ru> | 2016-06-24 01:07:09 +0300 |
---|---|---|
committer | ZyX <kp-pav@yandex.ru> | 2016-06-24 01:07:09 +0300 |
commit | 96a57e1bc66f294684e9ac2ee8f2b74243982123 (patch) | |
tree | 839a16a3d3a22c76f5a4bfc9f34b3c3757f91692 /src | |
parent | 6580dfeddd9693b778f59ca5c333d05200d67687 (diff) | |
download | rneovim-96a57e1bc66f294684e9ac2ee8f2b74243982123.tar.gz rneovim-96a57e1bc66f294684e9ac2ee8f2b74243982123.tar.bz2 rneovim-96a57e1bc66f294684e9ac2ee8f2b74243982123.zip |
os/fileio: Use readv often
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/os/fileio.c | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/src/nvim/os/fileio.c b/src/nvim/os/fileio.c index 6abcceb485..6cee102305 100644 --- a/src/nvim/os/fileio.c +++ b/src/nvim/os/fileio.c @@ -216,30 +216,31 @@ ptrdiff_t file_read(FileDescriptor *const fp, char *const ret_buf, if (read_remaining) { assert(rbuffer_size(rv) == 0); rbuffer_reset(rv); - if (read_remaining >= kRWBufferSize) { #ifdef HAVE_READV - // If there is readv() syscall, then take an opportunity to populate - // both target buffer and RBuffer at once, … - size_t write_count; - struct iovec iov[] = { - { .iov_base = buf, .iov_len = read_remaining }, - { .iov_base = rbuffer_write_ptr(rv, &write_count), - .iov_len = kRWBufferSize }, - }; - assert(write_count == kRWBufferSize); - const ptrdiff_t r_ret = os_readv(fp->fd, &fp->eof, iov, - ARRAY_SIZE(iov)); - if (r_ret > 0) { - if (r_ret > (ptrdiff_t)read_remaining) { - read_remaining = 0; - rbuffer_produced(rv, (size_t)(r_ret - (ptrdiff_t)read_remaining)); - } else { - read_remaining -= (size_t)r_ret; - } - } else if (r_ret < 0) { - return r_ret; + // If there is readv() syscall, then take an opportunity to populate + // both target buffer and RBuffer at once, … + size_t write_count; + struct iovec iov[] = { + { .iov_base = buf, .iov_len = read_remaining }, + { .iov_base = rbuffer_write_ptr(rv, &write_count), + .iov_len = kRWBufferSize }, + }; + assert(write_count == kRWBufferSize); + const ptrdiff_t r_ret = os_readv(fp->fd, &fp->eof, iov, + ARRAY_SIZE(iov)); + if (r_ret > 0) { + if (r_ret > (ptrdiff_t)read_remaining) { + rbuffer_produced(rv, (size_t)(r_ret - (ptrdiff_t)read_remaining)); + read_remaining = 0; + } else { + buf += (size_t)r_ret; + read_remaining -= (size_t)r_ret; } + } else if (r_ret < 0) { + return r_ret; + } #else + if (read_remaining >= kRWBufferSize) { // …otherwise leave RBuffer empty and populate only target buffer, // because filtering information through rbuffer will be more syscalls. const ptrdiff_t r_ret = os_read(fp->fd, &fp->eof, buf, read_remaining); @@ -249,7 +250,6 @@ ptrdiff_t file_read(FileDescriptor *const fp, char *const ret_buf, } else if (r_ret < 0) { return r_ret; } -#endif } else { size_t write_count; const ptrdiff_t r_ret = os_read(fp->fd, &fp->eof, @@ -262,6 +262,7 @@ ptrdiff_t file_read(FileDescriptor *const fp, char *const ret_buf, return r_ret; } } +#endif } } return (ptrdiff_t)(size - read_remaining); |