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.rb | 14 ++++++++++++++ lib/tdb/mt.rb | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 lib/tdb/mt.rb (limited to 'lib') diff --git a/lib/tdb.rb b/lib/tdb.rb index 2a75193..67114c9 100644 --- a/lib/tdb.rb +++ b/lib/tdb.rb @@ -1,2 +1,16 @@ # -*- encoding: binary -*- require 'tdb_ext' +class TDB + autoload :MT, 'tdb/mt' + + # makes the current TDB object thread-safe + def threadsafe! + extend MT + end + + # will return true when TDB::MT is included in TDB or the TDB + # object is extended by TDB + def threadsafe? + false + end +end 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