diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-11-25 09:03:08 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-11-25 09:03:08 +0000 |
commit | ebab487fcd7633038b9272ddbe31c268cda15723 (patch) | |
tree | e7880ae217a2a58dbe35bcf0f94744bc03805e08 /lib/pstore.rb | |
parent | 8e48dc16e97a783a69f0972b4882ad2faae561ea (diff) |
19991125
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@570 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/pstore.rb')
-rw-r--r-- | lib/pstore.rb | 42 |
1 files changed, 17 insertions, 25 deletions
diff --git a/lib/pstore.rb b/lib/pstore.rb index cc90207aa3..566de8d8f9 100644 --- a/lib/pstore.rb +++ b/lib/pstore.rb @@ -13,6 +13,7 @@ # end require "marshal" +require "ftools" class PStore class Error < StandardError @@ -77,22 +78,19 @@ class PStore raise PStore::Error, "nested transaction" if @transaction begin @transaction = true - value = file = nil - lock = @filename + ".lock" - loop do - begin - File::symlink("pstore::#$$", lock) - break - rescue Errno::EEXIST - rescue - sleep 1 - end + value = nil + backup = @filename+"~" + if File::exist?(@filename) + file = File::open(@filename, "r+") + orig = true + else + file = File::open(@filename, "w+") end - begin - File::open(@filename, "r") do |file| - @table = Marshal.load(file) - end - rescue Errno::ENOENT + file.flock(File::LOCK_EX) + if orig + File::copy @filename, backup + @table = Marshal::load(file) + else @table = {} end begin @@ -105,16 +103,10 @@ class PStore ensure unless @abort begin - File::rename @filename, @filename+"~" - rescue Errno::ENOENT - no_orig = true - end - begin - File::open(@filename, "w") do |file| - Marshal::dump(@table, file) - end + file.rewind + Marshal::dump(@table, file) rescue - File::rename @filename+"~", @filename unless no_orig + File::rename backup, @filename if File::exist?(backup) end end @abort = false @@ -122,7 +114,7 @@ class PStore ensure @table = nil @transaction = false - File::unlink(lock) + file.close end value end |