Module: Synchronizable

Defined in:
lib/synchronizable.rb,
lib/synchronizable/version.rb

Overview

Synchronizable is intended to be injected into objects via Object#extend. After Object#extend(Synchronizable) is performed, the object’s original methods will become synchronized via a per-instance lock.

Constant Summary collapse

IGNORABLE_METHOD_OWNERS =
[Object, Kernel, BasicObject]
VERSION =
"0.0.4"

Class Method Summary collapse

Class Method Details

.extended(obj) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/synchronizable.rb', line 10

def self.extended(obj)
  # immediately create object-level lock
  obj.send(:__lock)

  # redefine all user-defined methods to utilize lock
  obj.methods.each do |m|
    original_method = obj.method(m)
    next if IGNORABLE_METHOD_OWNERS.include?(original_method.owner)

    obj.define_singleton_method(m) do |*args, &block|
      __lock.synchronize do
        original_method.call(*args, &block)
      end
    end
  end

  # define synchronize method that executes a block
  # protected with the internal instance lock
  obj.define_singleton_method(:synchronize) do |&block|
    __lock.synchronize(&block)
  end
end