mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	Merge #6422 from ZyX-I/fix-6420
eval,fileio: Omit additional fsync() call
This commit is contained in:
		| @@ -17289,7 +17289,7 @@ static bool write_list(FileDescriptor *const fp, const list_T *const list, | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   if ((error = file_fsync(fp)) != 0) { | ||||
|   if ((error = file_flush(fp)) != 0) { | ||||
|     goto write_list_error; | ||||
|   } | ||||
|   return true; | ||||
| @@ -17439,21 +17439,21 @@ static void f_writefile(typval_T *argvars, typval_T *rettv, FunPtr fptr) | ||||
|   if (fname == NULL) { | ||||
|     return; | ||||
|   } | ||||
|   FileDescriptor *fp; | ||||
|   FileDescriptor fp; | ||||
|   int error; | ||||
|   rettv->vval.v_number = -1; | ||||
|   if (*fname == NUL) { | ||||
|     EMSG(_("E482: Can't open file with an empty name")); | ||||
|   } else if ((fp = file_open_new(&error, fname, | ||||
|   } else if ((error = file_open(&fp, fname, | ||||
|                                 ((append ? kFileAppend : kFileTruncate) | ||||
|                                   | kFileCreate), 0666)) == NULL) { | ||||
|                                  | kFileCreate), 0666)) != 0) { | ||||
|     emsgf(_("E482: Can't open file %s for writing: %s"), | ||||
|           fname, os_strerror(error)); | ||||
|   } else { | ||||
|     if (write_list(fp, argvars[0].vval.v_list, binary)) { | ||||
|     if (write_list(&fp, argvars[0].vval.v_list, binary)) { | ||||
|       rettv->vval.v_number = 0; | ||||
|     } | ||||
|     if ((error = file_free(fp)) != 0) { | ||||
|     if ((error = file_close(&fp)) != 0) { | ||||
|       emsgf(_("E80: Error when closing file %s: %s"), | ||||
|             fname, os_strerror(error)); | ||||
|     } | ||||
|   | ||||
| @@ -143,21 +143,36 @@ int file_free(FileDescriptor *const fp) FUNC_ATTR_NONNULL_ALL | ||||
| /// @param[in,out]  fp  File to work with. | ||||
| /// | ||||
| /// @return 0 or error code. | ||||
| int file_fsync(FileDescriptor *const fp) | ||||
| int file_flush(FileDescriptor *const fp) | ||||
|   FUNC_ATTR_NONNULL_ALL | ||||
| { | ||||
|   if (!fp->wr) { | ||||
|     return 0; | ||||
|   } | ||||
|   file_rb_write_full_cb(fp->rv, fp); | ||||
|   if (fp->_error != 0) { | ||||
|   const int error = fp->_error; | ||||
|   fp->_error = 0; | ||||
|   return error; | ||||
| } | ||||
|  | ||||
| /// Flush file modifications to disk and run fsync() | ||||
| /// | ||||
| /// @param[in,out]  fp  File to work with. | ||||
| /// | ||||
| /// @return 0 or error code. | ||||
| int file_fsync(FileDescriptor *const fp) | ||||
|   FUNC_ATTR_NONNULL_ALL | ||||
| { | ||||
|   if (!fp->wr) { | ||||
|     return 0; | ||||
|   } | ||||
|   const int error = os_fsync(fp->fd); | ||||
|   if (error != UV_EINVAL && error != UV_EROFS) { | ||||
|     return error; | ||||
|   const int flush_error = file_flush(fp); | ||||
|   if (flush_error != 0) { | ||||
|     return flush_error; | ||||
|   } | ||||
|   const int fsync_error = os_fsync(fp->fd); | ||||
|   if (fsync_error != UV_EINVAL && fsync_error != UV_EROFS) { | ||||
|     return fsync_error; | ||||
|   } | ||||
|   return 0; | ||||
| } | ||||
|   | ||||
| @@ -80,6 +80,10 @@ local function file_read(fp, size) | ||||
|   return ret1, ret2 | ||||
| end | ||||
|  | ||||
| local function file_flush(fp) | ||||
|   return m.file_flush(fp) | ||||
| end | ||||
|  | ||||
| local function file_fsync(fp) | ||||
|   return m.file_fsync(fp) | ||||
| end | ||||
| @@ -244,6 +248,21 @@ describe('file_fsync', function() | ||||
|   end) | ||||
| end) | ||||
|  | ||||
| describe('file_flush', function() | ||||
|   itp('can flush writes to disk', function() | ||||
|     local err, fp = file_open(filec, m.kFileCreateOnly, 384) | ||||
|     eq(0, file_flush(fp)) | ||||
|     eq(0, err) | ||||
|     eq(0, lfs.attributes(filec).size) | ||||
|     local wsize = file_write(fp, 'test') | ||||
|     eq(4, wsize) | ||||
|     eq(0, lfs.attributes(filec).size) | ||||
|     eq(0, file_flush(fp)) | ||||
|     eq(wsize, lfs.attributes(filec).size) | ||||
|     eq(0, m.file_close(fp)) | ||||
|   end) | ||||
| end) | ||||
|  | ||||
| describe('file_read', function() | ||||
|   itp('can read small chunks of input until eof', function() | ||||
|     local err, fp = file_open(file1, 0, 384) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Justin M. Keyes
					Justin M. Keyes