forked from enlightenment/efl
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
This commit is contained in:
parent
165589875b
commit
e9e40eb610
|
@ -691,6 +691,23 @@ eet_close(Eet_File *ef);
|
||||||
EAPI Eet_Error
|
EAPI Eet_Error
|
||||||
eet_sync(Eet_File *ef);
|
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
|
* @ingroup Eet_File_Group
|
||||||
* @brief Returns a handle to the shared string dictionary of the Eet file
|
* @brief Returns a handle to the shared string dictionary of the Eet file
|
||||||
|
|
|
@ -71,7 +71,7 @@ static Eet_Error
|
||||||
eet_flush(Eet_File *ef);
|
eet_flush(Eet_File *ef);
|
||||||
#endif /* if 0 */
|
#endif /* if 0 */
|
||||||
static Eet_Error
|
static Eet_Error
|
||||||
eet_flush2(Eet_File *ef);
|
eet_flush2(Eet_File *ef, Eina_Bool sync);
|
||||||
static Eet_File_Node *
|
static Eet_File_Node *
|
||||||
find_node_by_name(Eet_File *ef,
|
find_node_by_name(Eet_File *ef,
|
||||||
const char *name);
|
const char *name);
|
||||||
|
@ -288,7 +288,7 @@ eet_string_match(const char *s1,
|
||||||
|
|
||||||
/* flush out writes to a v2 eet file */
|
/* flush out writes to a v2 eet file */
|
||||||
static Eet_Error
|
static Eet_Error
|
||||||
eet_flush2(Eet_File *ef)
|
eet_flush2(Eet_File *ef, Eina_Bool sync)
|
||||||
{
|
{
|
||||||
Eet_File_Node *efn;
|
Eet_File_Node *efn;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
@ -509,6 +509,9 @@ eet_flush2(Eet_File *ef)
|
||||||
/* no more writes pending */
|
/* no more writes pending */
|
||||||
ef->writes_pending = 0;
|
ef->writes_pending = 0;
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
|
if (sync) fdatasync(fileno(fp));
|
||||||
|
#endif
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
||||||
return EET_ERROR_NONE;
|
return EET_ERROR_NONE;
|
||||||
|
@ -664,7 +667,30 @@ eet_sync(Eet_File *ef)
|
||||||
|
|
||||||
LOCK_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);
|
UNLOCK_FILE(ef);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1283,7 +1309,7 @@ eet_internal_close(Eet_File *ef,
|
||||||
goto on_error;
|
goto on_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = eet_flush2(ef);
|
err = eet_flush2(ef, EINA_FALSE);
|
||||||
|
|
||||||
eet_identity_unref(ef->key);
|
eet_identity_unref(ef->key);
|
||||||
ef->key = NULL;
|
ef->key = NULL;
|
||||||
|
|
Loading…
Reference in New Issue