diff options
Diffstat (limited to 'lib/tdb/mt.rb')
-rw-r--r-- | lib/tdb/mt.rb | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/tdb/mt.rb b/lib/tdb/mt.rb new file mode 100644 index 0000000..6742cc4 --- /dev/null +++ b/lib/tdb/mt.rb @@ -0,0 +1,38 @@ +# -*- encoding: binary -*- +module TDB::MT + def initialize + super + @lock = Mutex.new + end + + %w( + close closed? fetch [] store []= insert! modify! insert modify + key? has_key? include? member? + nuke! delete + lockall trylockall unlockall + lockall_read trylockall_read unlockall_read + lockall_mark lockall_unmark + ).each do |meth| + eval "def #{meth}(*args); @lock.synchronize { super }; end" + end + + def each(&block) + @lock.synchronize do + super { |k,v| @lock.exclusive_unlock { yield(k,v) } } + end + end + + def threadsafe? + true + end + + def self.extended(obj) + obj.instance_eval { @lock = Mutex.new unless defined?(@lock) } + end + + def self.included(klass) + ObjectSpace.each_object(klass) { |obj| + obj.instance_eval { @lock = Mutex.new unless defined?(@lock) } + } + end +end |