ruby-tdb.git  about / heads / tags
Trivial Database bindings for Ruby
blob 1bdbf3dd1b6d92e4087288e9f33e6894919d27e1 906 bytes (raw)
$ git show HEAD:lib/tdb/mt.rb	# shows this blob on the CLI

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
# -*- encoding: binary -*-

# WARNING: this is not recommended, it is still possible to break this
require 'thread'
module TDB::MT
  def initialize
    super
    @lock = Mutex.new
  end

  wrap_methods = %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
    clear each
  )
  wrap_methods << :repack if TDB.method_defined?(:repack)
  wrap_methods.each do |meth|
    eval "def #{meth}(*args); @lock.synchronize { super }; 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

git clone https://yhbt.net/ruby-tdb.git