aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/memline.c
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2018-04-21 00:34:13 +0200
committerJustin M. Keyes <justinkz@gmail.com>2018-04-21 12:51:27 +0200
commit498731615c2f879c0b67323aba385c17a4a39d24 (patch)
tree0f0fbfa0a794b089718dd9c783fa7ea697639037 /src/nvim/memline.c
parenta02d22cca825f2c04381b40d50abfc7a15afec20 (diff)
downloadrneovim-498731615c2f879c0b67323aba385c17a4a39d24.tar.gz
rneovim-498731615c2f879c0b67323aba385c17a4a39d24.tar.bz2
rneovim-498731615c2f879c0b67323aba385c17a4a39d24.zip
IO: let 'fsync' option control more cases
Vim has the 'swapsync' option which we removed in 62d137ce0969. Instead let 'fsync' control swapfile-fsync. These cases ALWAYS force fsync (ignoring 'fsync' option): - Idle (CursorHold). - Exit caused by deadly signal. - SIGPWR signal. - Explicit :preserve command.
Diffstat (limited to 'src/nvim/memline.c')
-rw-r--r--src/nvim/memline.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/nvim/memline.c b/src/nvim/memline.c
index c11ca74f5c..dd80ec8d6a 100644
--- a/src/nvim/memline.c
+++ b/src/nvim/memline.c
@@ -1593,7 +1593,7 @@ static int recov_file_names(char_u **names, char_u *path, int prepend_dot)
* If 'check_char' is TRUE, stop syncing when character becomes available, but
* always sync at least one block.
*/
-void ml_sync_all(int check_file, int check_char)
+void ml_sync_all(int check_file, int check_char, bool do_fsync)
{
FOR_ALL_BUFFERS(buf) {
if (buf->b_ml.ml_mfp == NULL || buf->b_ml.ml_mfp->mf_fname == NULL)
@@ -1612,14 +1612,14 @@ void ml_sync_all(int check_file, int check_char)
if (!os_fileinfo((char *)buf->b_ffname, &file_info)
|| file_info.stat.st_mtim.tv_sec != buf->b_mtime_read
|| os_fileinfo_size(&file_info) != buf->b_orig_size) {
- ml_preserve(buf, FALSE);
+ ml_preserve(buf, false, do_fsync);
did_check_timestamps = FALSE;
need_check_timestamps = TRUE; /* give message later */
}
}
if (buf->b_ml.ml_mfp->mf_dirty) {
(void)mf_sync(buf->b_ml.ml_mfp, (check_char ? MFS_STOP : 0)
- | (bufIsChanged(buf) ? MFS_FLUSH : 0));
+ | (do_fsync && bufIsChanged(buf) ? MFS_FLUSH : 0));
if (check_char && os_char_avail()) /* character available now */
break;
}
@@ -1636,7 +1636,7 @@ void ml_sync_all(int check_file, int check_char)
*
* when message is TRUE the success of preserving is reported
*/
-void ml_preserve(buf_T *buf, int message)
+void ml_preserve(buf_T *buf, int message, bool do_fsync)
{
bhdr_T *hp;
linenr_T lnum;
@@ -1656,7 +1656,7 @@ void ml_preserve(buf_T *buf, int message)
ml_flush_line(buf); /* flush buffered line */
(void)ml_find_line(buf, (linenr_T)0, ML_FLUSH); /* flush locked block */
- status = mf_sync(mfp, MFS_ALL | MFS_FLUSH);
+ status = mf_sync(mfp, MFS_ALL | (do_fsync ? MFS_FLUSH : 0));
/* stack is invalid after mf_sync(.., MFS_ALL) */
buf->b_ml.ml_stack_top = 0;
@@ -1686,7 +1686,7 @@ void ml_preserve(buf_T *buf, int message)
}
(void)ml_find_line(buf, (linenr_T)0, ML_FLUSH); /* flush locked block */
/* sync the updated pointer blocks */
- if (mf_sync(mfp, MFS_ALL | MFS_FLUSH) == FAIL)
+ if (mf_sync(mfp, MFS_ALL | (do_fsync ? MFS_FLUSH : 0)) == FAIL)
status = FAIL;
buf->b_ml.ml_stack_top = 0; /* stack is invalid now */
}