aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorZyX <kp-pav@yandex.ru>2017-04-02 22:11:35 +0300
committerZyX <kp-pav@yandex.ru>2017-04-02 22:11:35 +0300
commitb10880dadcbd3b3ad368621f95a0f4be7e30dc0d (patch)
treed2546048e984a65178fabd9f5d43fcafec1b9320 /src
parentddfa0359c638a4fd5eba5c339dc3e18e2b8aca35 (diff)
downloadrneovim-b10880dadcbd3b3ad368621f95a0f4be7e30dc0d.tar.gz
rneovim-b10880dadcbd3b3ad368621f95a0f4be7e30dc0d.tar.bz2
rneovim-b10880dadcbd3b3ad368621f95a0f4be7e30dc0d.zip
eval: Make writefile() able to disable fsync()
Diffstat (limited to 'src')
-rw-r--r--src/nvim/eval.c6
-rw-r--r--src/nvim/os/fileio.c20
-rw-r--r--src/nvim/shada.c2
3 files changed, 18 insertions, 10 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index f0d78a2508..8a3e3f3e22 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -17421,6 +17421,7 @@ static void f_writefile(typval_T *argvars, typval_T *rettv, FunPtr fptr)
bool binary = false;
bool append = false;
+ bool do_fsync = true;
if (argvars[2].v_type != VAR_UNKNOWN) {
const char *const flags = tv_get_string_chk(&argvars[2]);
if (flags == NULL) {
@@ -17432,6 +17433,9 @@ static void f_writefile(typval_T *argvars, typval_T *rettv, FunPtr fptr)
if (strchr(flags, 'a')) {
append = true;
}
+ if (strchr(flags, 'S')) {
+ do_fsync = false;
+ }
}
char buf[NUMBUFLEN];
@@ -17453,7 +17457,7 @@ static void f_writefile(typval_T *argvars, typval_T *rettv, FunPtr fptr)
if (write_list(&fp, argvars[0].vval.v_list, binary)) {
rettv->vval.v_number = 0;
}
- if ((error = file_close(&fp)) != 0) {
+ if ((error = file_close(&fp, do_fsync)) != 0) {
emsgf(_("E80: Error when closing file %s: %s"),
fname, os_strerror(error));
}
diff --git a/src/nvim/os/fileio.c b/src/nvim/os/fileio.c
index 3c928363cc..4b7b53fc7f 100644
--- a/src/nvim/os/fileio.c
+++ b/src/nvim/os/fileio.c
@@ -113,27 +113,31 @@ FileDescriptor *file_open_new(int *const error, const char *const fname,
/// Close file and free its buffer
///
/// @param[in,out] fp File to close.
+/// @param[in] do_fsync If true, use fsync() to write changes to disk.
///
/// @return 0 or error code.
-int file_close(FileDescriptor *const fp) FUNC_ATTR_NONNULL_ALL
+int file_close(FileDescriptor *const fp, const bool do_fsync)
+ FUNC_ATTR_NONNULL_ALL
{
- const int error = file_fsync(fp);
- const int error2 = os_close(fp->fd);
+ const int flush_error = (do_fsync ? file_fsync(fp) : file_flush(fp));
+ const int close_error = os_close(fp->fd);
rbuffer_free(fp->rv);
- if (error2 != 0) {
- return error2;
+ if (close_error != 0) {
+ return close_error;
}
- return error;
+ return flush_error;
}
/// Close and free file obtained using file_open_new()
///
/// @param[in,out] fp File to close.
+/// @param[in] do_fsync If true, use fsync() to write changes to disk.
///
/// @return 0 or error code.
-int file_free(FileDescriptor *const fp) FUNC_ATTR_NONNULL_ALL
+int file_free(FileDescriptor *const fp, const bool do_fsync)
+ FUNC_ATTR_NONNULL_ALL
{
- const int ret = file_close(fp);
+ const int ret = file_close(fp, do_fsync);
xfree(fp);
return ret;
}
diff --git a/src/nvim/shada.c b/src/nvim/shada.c
index f65fdaf1c0..c7b95958e0 100644
--- a/src/nvim/shada.c
+++ b/src/nvim/shada.c
@@ -811,7 +811,7 @@ static int open_shada_file_for_reading(const char *const fname,
/// Wrapper for closing file descriptors
static void close_file(void *cookie)
{
- const int error = file_free(cookie);
+ const int error = file_free(cookie, true);
if (error != 0) {
emsgf(_(SERR "System error while closing ShaDa file: %s"),
os_strerror(error));