mirror of
https://github.com/neovim/neovim.git
synced 2025-09-30 15:08:35 +00:00
eval: Make writefile() able to disable fsync()
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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));
|
||||
|
Reference in New Issue
Block a user