From e9e40eb6107315ac8df4004f72d46d8f9d554aea Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Mon, 16 May 2022 14:02:06 +0100 Subject: [PATCH] eet - add eet_sync_sync() that syncs data to disk and fdatasyncs it this ensures that if eet_sync_sync() returns that all data has been synced to disk (as best possible with fdatasync()). @feat --- src/lib/eet/Eet.h | 17 +++++++++++++++++ src/lib/eet/eet_lib.c | 34 ++++++++++++++++++++++++++++++---- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/lib/eet/Eet.h b/src/lib/eet/Eet.h index 455042fc0c..5bbaf8b9c3 100644 --- a/src/lib/eet/Eet.h +++ b/src/lib/eet/Eet.h @@ -691,6 +691,23 @@ eet_close(Eet_File *ef); EAPI Eet_Error eet_sync(Eet_File *ef); +/** + * @ingroup Eet_File_Group + * @brief does exactly what eet_xunc() does but also fsyncs file data + * @param ef A valid eet file handle. + * @return An eet error identifier. + * + * This function does everything eet_xunc() does with one addition - it + * ensures data is written to/synced to disk (as best is possible) by + * calling fdatasync() on the file before writes are all queued/done. + * + * If the eet file handle is not valid nothing will be done. + * + * @since 1.27 + */ +EAPI Eet_Error +eet_sync_sync(Eet_File *ef); + /** * @ingroup Eet_File_Group * @brief Returns a handle to the shared string dictionary of the Eet file diff --git a/src/lib/eet/eet_lib.c b/src/lib/eet/eet_lib.c index 0ed786e1d7..3a1e885443 100644 --- a/src/lib/eet/eet_lib.c +++ b/src/lib/eet/eet_lib.c @@ -71,7 +71,7 @@ static Eet_Error eet_flush(Eet_File *ef); #endif /* if 0 */ static Eet_Error - eet_flush2(Eet_File *ef); + eet_flush2(Eet_File *ef, Eina_Bool sync); static Eet_File_Node * find_node_by_name(Eet_File *ef, const char *name); @@ -288,7 +288,7 @@ eet_string_match(const char *s1, /* flush out writes to a v2 eet file */ static Eet_Error -eet_flush2(Eet_File *ef) +eet_flush2(Eet_File *ef, Eina_Bool sync) { Eet_File_Node *efn; FILE *fp; @@ -509,6 +509,9 @@ eet_flush2(Eet_File *ef) /* no more writes pending */ ef->writes_pending = 0; +#ifndef _WIN32 + if (sync) fdatasync(fileno(fp)); +#endif fclose(fp); return EET_ERROR_NONE; @@ -664,7 +667,30 @@ eet_sync(Eet_File *ef) LOCK_FILE(ef); - ret = eet_flush2(ef); + ret = eet_flush2(ef, EINA_FALSE); + + UNLOCK_FILE(ef); + return ret; +} + +EAPI Eet_Error +eet_sync_sync(Eet_File *ef) +{ + Eet_Error ret; + + if (eet_check_pointer(ef)) + return EET_ERROR_BAD_OBJECT; + + if ((ef->mode != EET_FILE_MODE_WRITE) && + (ef->mode != EET_FILE_MODE_READ_WRITE)) + return EET_ERROR_NOT_WRITABLE; + + if (!ef->writes_pending) + return EET_ERROR_NONE; + + LOCK_FILE(ef); + + ret = eet_flush2(ef, EINA_TRUE); UNLOCK_FILE(ef); return ret; @@ -1283,7 +1309,7 @@ eet_internal_close(Eet_File *ef, goto on_error; } - err = eet_flush2(ef); + err = eet_flush2(ef, EINA_FALSE); eet_identity_unref(ef->key); ef->key = NULL;