From c6c2f7782e2270ee4684d2405376a186aa806fcd Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 3 Dec 2010 17:27:53 -0800 Subject: add optional thread-safety on a per-object basis Thread-safety is useful sometimes and needless overhead otherwise. Default to whatever TDB upstream defaults to. --- lib/tdb/mt.rb | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 lib/tdb/mt.rb (limited to 'lib/tdb') 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 -- cgit v1.2.3-24-ge0c7