diff options
author | Siri Hansen <[email protected]> | 2011-03-23 15:54:04 +0100 |
---|---|---|
committer | Siri Hansen <[email protected]> | 2011-03-23 16:00:08 +0100 |
commit | 07cca90aadc77bad241a378c560a3b4f22352160 (patch) | |
tree | ac6a9bf591b05fe82400bf46c473966b33b0a862 /lib/stdlib/src | |
parent | f861b4fdb3fd39e35f2951c53a73b30a98c7f973 (diff) | |
download | otp-07cca90aadc77bad241a378c560a3b4f22352160.tar.gz otp-07cca90aadc77bad241a378c560a3b4f22352160.tar.bz2 otp-07cca90aadc77bad241a378c560a3b4f22352160.zip |
Update index file atomically
Since the log_mf_h index file might be read by other processes than
the error handler (e.g. by the rb tool), this file should be updated
atomically. This will avoid hitting the time gap between opening the
file in write mode (and thus emptying the file) and the actual update
with the new contents. To do this, a temporary file is written, and
the file:rename/1 used to replace the real index file.
Diffstat (limited to 'lib/stdlib/src')
-rw-r--r-- | lib/stdlib/src/log_mf_h.erl | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/stdlib/src/log_mf_h.erl b/lib/stdlib/src/log_mf_h.erl index 2729f27e51..5fa5360fa1 100644 --- a/lib/stdlib/src/log_mf_h.erl +++ b/lib/stdlib/src/log_mf_h.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% Copyright Ericsson AB 1996-2011. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -185,13 +185,19 @@ read_index_file(Dir) -> %%----------------------------------------------------------------- %% Write the index file. This file contains one binary with %% the last used filename (an integer). +%% Write a temporary file and rename it in order to make the update +%% atomic. %%----------------------------------------------------------------- write_index_file(Dir, Index) -> - case file:open(Dir ++ "/index", [raw, write]) of + File = Dir ++ "/index", + TmpFile = File ++ ".tmp", + case file:open(TmpFile, [raw, write]) of {ok, Fd} -> - file:write(Fd, [Index]), - ok = file:close(Fd); + ok = file:write(Fd, [Index]), + ok = file:close(Fd), + ok = file:rename(TmpFile,File), + ok; _ -> exit(open_index_file) end. |