lib/core/util/disk.rb in nucleon-0.1.10 vs lib/core/util/disk.rb in nucleon-0.1.11
- old
+ new
@@ -9,10 +9,12 @@
@@files = {}
@@separator = false
@@description = ''
+ @@file_lock = Mutex.new
+
#-----------------------------------------------------------------------------
# Utilities
def self.exists?(file)
return ::File.exists?(::File.expand_path(file))
@@ -34,69 +36,82 @@
if @@files.has_key?(file_name) && ! reset
reset = true if ! mode.empty? && mode != @@files[file_name][:mode]
end
- if ! @@files.has_key?(file_name) || ! @@files[file_name][:file] || reset
- @@files[file_name][:file].close if @@files[file_name] && @@files[file_name][:file]
- unless mode.empty? || ( mode == 'r' && ! ::File.exists?(file_name) )
- @@files[file_name] = {
- :file => ::File.open(file_name, mode),
- :mode => mode,
- }
+ @@file_lock.synchronize do
+ if ! @@files.has_key?(file_name) || ! @@files[file_name][:file] || reset
+ @@files[file_name][:file].close if @@files[file_name] && @@files[file_name][:file]
+ unless mode.empty? || ( mode == 'r' && ! ::File.exists?(file_name) )
+ @@files[file_name] = {
+ :file => ::File.open(file_name, mode),
+ :mode => mode,
+ }
+ end
end
end
return nil unless @@files[file_name]
return @@files[file_name][:file]
end
#---
def self.read(file_name, options = {})
+ result = nil
options[:mode] = ( options[:mode] ? options[:mode] : 'r' )
file = open(file_name, options)
if file
- file.pos = 0 if options[:mode] == 'r'
- return file.read
+ @@file_lock.synchronize do
+ file.pos = 0 if options[:mode] == 'r'
+ result = file.read
+ end
end
- return nil
+ return result
end
#---
def self.write(file_name, data, options = {})
options[:mode] = ( options[:mode] ? options[:mode] : 'w' )
file = open(file_name, options)
+ result = nil
if file
- file.pos = 0 if options[:mode] == 'w'
- success = file.write(data)
- begin
- file.flush
- rescue # In case the file is already closed
+ @@file_lock.synchronize do
+ file.pos = 0 if options[:mode] == 'w'
+ result = file.write(data)
+ begin
+ file.flush
+ rescue # In case the file is already closed
+ end
end
- return success
end
- return nil
+ return result
end
#---
def self.delete(file_path)
- return ::File.delete(file_path)
+ result = nil
+ @@file_lock.synchronize do
+ result = ::File.delete(file_path)
+ end
+ result
end
#---
def self.log(data, options = {})
reset = ( options[:file_name] || options[:mode] )
file = open(( options[:file_name] ? options[:file_name] : 'log.txt' ), options, reset)
- if file
- file.write("--------------------------------------\n") if @@separator
- file.write("#{@@description}\n") if @@description
- file.write("#{data}\n")
+ if file
+ @@file_lock.synchronize do
+ file.write("--------------------------------------\n") if @@separator
+ file.write("#{@@description}\n") if @@description
+ file.write("#{data}\n")
+ end
end
end
#---
@@ -106,11 +121,13 @@
unless file_names.is_a?(Array)
file_names = [ file_names ]
end
file_names.each do |file_name|
- @@files[file_name][:file].close if @@files[file_name] && @@files[file_name][:file]
- @@files.delete(file_name)
+ @@file_lock.synchronize do
+ @@files[file_name][:file].close if @@files[file_name] && @@files[file_name][:file]
+ @@files.delete(file_name)
+ end
end
end
end
end
end