diff options
author | Joseph Blomstedt <[email protected]> | 2012-11-29 14:50:42 -0800 |
---|---|---|
committer | Steve Vinoski <[email protected]> | 2013-11-15 10:19:19 -0500 |
commit | f47c818746c1df4055b1de8aabf47364f502274c (patch) | |
tree | a85d3ba3585a4bf29d01c3d6a7d43f0b75bab9f4 /erts/emulator/drivers/unix/unix_efile.c | |
parent | c01df2215ac3ddef82116abac5eaf236d3788f21 (diff) | |
download | otp-f47c818746c1df4055b1de8aabf47364f502274c.tar.gz otp-f47c818746c1df4055b1de8aabf47364f502274c.tar.bz2 otp-f47c818746c1df4055b1de8aabf47364f502274c.zip |
Add sync option to file:open/2
The sync option adds the POSIX O_SYNC flag to the open system call on
platforms that support the flag or its equivalent, e.g.,
FILE_FLAG_WRITE_THROUGH on Windows. For platforms that don't support it,
file:open/2 returns {error, enotsup} if the sync option is passed in.
The semantics of O_SYNC are platform-specific. For example, not all
platforms guarantee that all file metadata are written to the disk along
with the file data when the flag is in effect. This issue is noted in the
documentation this commit adds for the sync option.
Add a test for the sync option. Note however that the underlying OS
semantics for O_SYNC can't be tested automatically in any practical way, so
the test assumes the OS does the right thing with the flag when
present. For manual verification, dtruss on OS X and strace on Linux were
both run against beam processes to watch calls to open(), and file:open/2
was called in Erlang shells to open files for writing, both with and
without the sync option. Both the dtruss output and the strace output
showed that the O_SYNC flag was present in the open() calls when sync was
specified and was clear when sync was not specified.
Diffstat (limited to 'erts/emulator/drivers/unix/unix_efile.c')
-rw-r--r-- | erts/emulator/drivers/unix/unix_efile.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/erts/emulator/drivers/unix/unix_efile.c b/erts/emulator/drivers/unix/unix_efile.c index 55539b44dd..8ffc05da99 100644 --- a/erts/emulator/drivers/unix/unix_efile.c +++ b/erts/emulator/drivers/unix/unix_efile.c @@ -405,6 +405,15 @@ efile_openfile(Efile_error* errInfo, /* Where to return error codes. */ mode |= O_EXCL; } + if (flags & EFILE_MODE_SYNC) { +#ifdef O_SYNC + mode |= O_SYNC; +#else + errno = ENOTSUP; + return check_error(-1, errInfo); +#endif + } + fd = open(name, mode, FILE_MODE); if (!check_error(fd, errInfo)) |