From ba960afb5f3464df2a6e8588e8b59739fbc08535 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Tue, 1 Mar 2016 07:38:14 +1100 Subject: [PATCH] Add function for flushing file buffers --- src/emu/fileio.cpp | 20 ++++++++++++++++---- src/emu/fileio.h | 5 +++++ src/lib/util/corefile.cpp | 10 ++++++++++ src/lib/util/corefile.h | 3 +++ src/osd/osdcore.h | 15 +++++++++++++++ src/osd/osdmini/minifile.cpp | 16 ++++++++++++++++ src/osd/sdl/sdlfile.cpp | 24 ++++++++++++++++++++++++ src/osd/windows/winfile.cpp | 25 +++++++++++++++++++++++++ 8 files changed, 114 insertions(+), 4 deletions(-) diff --git a/src/emu/fileio.cpp b/src/emu/fileio.cpp index 0de5e021800..d13e162f990 100644 --- a/src/emu/fileio.cpp +++ b/src/emu/fileio.cpp @@ -625,6 +625,17 @@ int emu_file::puts(const char *s) } +//------------------------------------------------- +// vfprintf - vfprintf to a text file +//------------------------------------------------- + +int emu_file::vprintf(const char *fmt, va_list va) +{ + // write the data if we can + return (m_file != nullptr) ? core_vfprintf(m_file, fmt, va) : 0; +} + + //------------------------------------------------- // printf - vfprintf to a text file //------------------------------------------------- @@ -641,13 +652,14 @@ int CLIB_DECL emu_file::printf(const char *fmt, ...) //------------------------------------------------- -// mame_vfprintf - vfprintf to a text file +// flush - flush file buffers //------------------------------------------------- -int emu_file::vprintf(const char *fmt, va_list va) +void emu_file::flush() { - // write the data if we can - return (m_file != nullptr) ? core_vfprintf(m_file, fmt, va) : 0; + // flush the buffers if we can + if (m_file != nullptr) + core_fflush(m_file); } diff --git a/src/emu/fileio.h b/src/emu/fileio.h index 39f3b0b8dc5..60111304abc 100644 --- a/src/emu/fileio.h +++ b/src/emu/fileio.h @@ -120,6 +120,8 @@ public: // control file_error compress(int compress); + + // position int seek(INT64 offset, int whence); UINT64 tell(); bool eof(); @@ -137,6 +139,9 @@ public: int vprintf(const char *fmt, va_list va); int printf(const char *fmt, ...) ATTR_PRINTF(2,3); + // buffers + void flush(); + private: bool compressed_file_ready(void); diff --git a/src/lib/util/corefile.cpp b/src/lib/util/corefile.cpp index 344a2922bfe..25978afdb2c 100644 --- a/src/lib/util/corefile.cpp +++ b/src/lib/util/corefile.cpp @@ -898,6 +898,16 @@ file_error core_truncate(core_file *f, UINT64 offset) } +/*------------------------------------------------- + core_truncate - flush write buffer +-------------------------------------------------*/ + +file_error core_fflush(core_file *f) +{ + return osd_fflush(f->file); +} + + /*************************************************************************** FILENAME UTILITIES diff --git a/src/lib/util/corefile.h b/src/lib/util/corefile.h index 5266832c374..36060631f35 100644 --- a/src/lib/util/corefile.h +++ b/src/lib/util/corefile.h @@ -120,6 +120,9 @@ int CLIB_DECL core_fprintf(core_file *f, const char *fmt, ...) ATTR_PRINTF(2,3); /* file truncation */ file_error core_truncate(core_file *f, UINT64 offset); +/* flush file buffers */ +file_error core_fflush(core_file *f); + /* ----- filename utilities ----- */ diff --git a/src/osd/osdcore.h b/src/osd/osdcore.h index 30d07eac770..dec4a5c030b 100644 --- a/src/osd/osdcore.h +++ b/src/osd/osdcore.h @@ -202,6 +202,21 @@ file_error osd_openpty(osd_file **file, char *name, size_t name_len); file_error osd_truncate(osd_file *file, UINT64 offset); +/*----------------------------------------------------------------------------- + osd_fflus: flush file buffers + + Parameters: + + file - handle to a file previously opened via osd_open + + Return value: + + a file_error describing any error that occurred while writing to + the file, or FILERR_NONE if no error occurred +-----------------------------------------------------------------------------*/ +file_error osd_fflush(osd_file *file); + + /*----------------------------------------------------------------------------- osd_rmfile: deletes a file diff --git a/src/osd/osdmini/minifile.cpp b/src/osd/osdmini/minifile.cpp index b30b566585c..b963634da51 100644 --- a/src/osd/osdmini/minifile.cpp +++ b/src/osd/osdmini/minifile.cpp @@ -128,6 +128,22 @@ file_error osd_truncate(osd_file *file, UINT64 offset) return FILERR_NONE; } +//============================================================ +// osd_fflush +//============================================================ + +file_error osd_fflush(osd_file *file) +{ + if (!file) + return FILERR_FAILURE; + + int result = fflush((FILE *)file); + if (result == EOF) + return FILERR_FAILURE; + + return FILERR_NONE; +} + //============================================================ // osd_rmfile diff --git a/src/osd/sdl/sdlfile.cpp b/src/osd/sdl/sdlfile.cpp index 917bce15fea..9b7e9b72657 100644 --- a/src/osd/sdl/sdlfile.cpp +++ b/src/osd/sdl/sdlfile.cpp @@ -369,6 +369,30 @@ file_error osd_truncate(osd_file *file, UINT64 offset) } } +//============================================================ +// osd_truncate +//============================================================ + +file_error osd_fflush(osd_file *file) +{ + UINT32 result; + + if (!file || !file->handle) + return FILERR_FAILURE; + + switch (file->type) + { + case SDLFILE_FILE: + result = fflush(file->handle, offset); + if (result == EOF) + return error_to_file_error(errno); + return FILERR_NONE; + + default: + return FILERR_FAILURE; + } +} + //============================================================ // osd_close diff --git a/src/osd/windows/winfile.cpp b/src/osd/windows/winfile.cpp index b83f0e041d9..e8fcc30ab2c 100644 --- a/src/osd/windows/winfile.cpp +++ b/src/osd/windows/winfile.cpp @@ -281,6 +281,31 @@ file_error osd_truncate(osd_file *file, UINT64 offset) return FILERR_NONE; } +//============================================================ +// osd_fflush +//============================================================ + +file_error osd_fflush(osd_file *file) +{ + if (!file || !file->handle) + return FILERR_FAILURE; + + switch (file->type) + { + case WINFILE_FILE: + // attempt to flush file buffers + if (!FlushFileBuffers(file->handle)) + return win_error_to_mame_file_error(GetLastError()); + break; + case WINFILE_SOCKET: + return FILERR_FAILURE; + case WINFILE_PTTY: + return FILERR_FAILURE; + + } + return FILERR_NONE; +} + //============================================================ // osd_close