mirror of
https://github.com/neovim/neovim.git
synced 2025-10-01 15:38:33 +00:00
os/fileio: Use readv often
This commit is contained in:
@@ -216,7 +216,6 @@ ptrdiff_t file_read(FileDescriptor *const fp, char *const ret_buf,
|
|||||||
if (read_remaining) {
|
if (read_remaining) {
|
||||||
assert(rbuffer_size(rv) == 0);
|
assert(rbuffer_size(rv) == 0);
|
||||||
rbuffer_reset(rv);
|
rbuffer_reset(rv);
|
||||||
if (read_remaining >= kRWBufferSize) {
|
|
||||||
#ifdef HAVE_READV
|
#ifdef HAVE_READV
|
||||||
// If there is readv() syscall, then take an opportunity to populate
|
// If there is readv() syscall, then take an opportunity to populate
|
||||||
// both target buffer and RBuffer at once, …
|
// both target buffer and RBuffer at once, …
|
||||||
@@ -231,15 +230,17 @@ ptrdiff_t file_read(FileDescriptor *const fp, char *const ret_buf,
|
|||||||
ARRAY_SIZE(iov));
|
ARRAY_SIZE(iov));
|
||||||
if (r_ret > 0) {
|
if (r_ret > 0) {
|
||||||
if (r_ret > (ptrdiff_t)read_remaining) {
|
if (r_ret > (ptrdiff_t)read_remaining) {
|
||||||
read_remaining = 0;
|
|
||||||
rbuffer_produced(rv, (size_t)(r_ret - (ptrdiff_t)read_remaining));
|
rbuffer_produced(rv, (size_t)(r_ret - (ptrdiff_t)read_remaining));
|
||||||
|
read_remaining = 0;
|
||||||
} else {
|
} else {
|
||||||
|
buf += (size_t)r_ret;
|
||||||
read_remaining -= (size_t)r_ret;
|
read_remaining -= (size_t)r_ret;
|
||||||
}
|
}
|
||||||
} else if (r_ret < 0) {
|
} else if (r_ret < 0) {
|
||||||
return r_ret;
|
return r_ret;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
if (read_remaining >= kRWBufferSize) {
|
||||||
// …otherwise leave RBuffer empty and populate only target buffer,
|
// …otherwise leave RBuffer empty and populate only target buffer,
|
||||||
// because filtering information through rbuffer will be more syscalls.
|
// because filtering information through rbuffer will be more syscalls.
|
||||||
const ptrdiff_t r_ret = os_read(fp->fd, &fp->eof, buf, read_remaining);
|
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) {
|
} else if (r_ret < 0) {
|
||||||
return r_ret;
|
return r_ret;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
size_t write_count;
|
size_t write_count;
|
||||||
const ptrdiff_t r_ret = os_read(fp->fd, &fp->eof,
|
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;
|
return r_ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (ptrdiff_t)(size - read_remaining);
|
return (ptrdiff_t)(size - read_remaining);
|
||||||
|
Reference in New Issue
Block a user