From 3e09ac0c10c95bb24a08af62393b4f761e2743d0 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 24 Aug 2013 09:54:45 +0000 Subject: initial commit --- lib/dtas/state_file.rb | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 lib/dtas/state_file.rb (limited to 'lib/dtas/state_file.rb') diff --git a/lib/dtas/state_file.rb b/lib/dtas/state_file.rb new file mode 100644 index 0000000..cfd83d5 --- /dev/null +++ b/lib/dtas/state_file.rb @@ -0,0 +1,34 @@ +# -*- encoding: binary -*- +# :stopdoc: +# Copyright (C) 2013, Eric Wong +# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt) +require 'yaml' +require 'tempfile' +class DTAS::StateFile + def initialize(path, do_fsync = false) + @path = path + @do_fsync = do_fsync + end + + def tryload + YAML.load(IO.binread(@path)) if File.readable?(@path) + end + + def dump(obj, force_fsync = false) + yaml = obj.to_hsh.to_yaml.b + + # do not replace existing state file if there are no changes + # this will be racy if we ever do async dumps or shared state + # files, but we don't do that... + return if File.readable?(@path) && IO.binread(@path) == yaml + + dir = File.dirname(@path) + Tempfile.open(%w(player.state .tmp), dir) do |tmp| + tmp.binmode + tmp.write(yaml) + tmp.flush + tmp.fsync if @do_fsync || force_fsync + File.rename(tmp.path, @path) + end + end +end -- cgit v1.2.3-24-ge0c7