Actions
Feature #8961
openSynchronizable module to easily wrap methods in a mutex
Status:
Open
Assignee:
-
Target version:
-
Description
=begin
I propose a Synchronizable mixin to easily wrap methods in a mutex which works together with Ruby 2.1's method name symbols returned from '(({def}))'.
The Mixin adds a new '(({synchronized}))' class method which would alias the referenced method and redefines the original method wrapped in a '(({synchronize do .. end}))' block.
This is probably somewhat related and an alternative to #8556.
Proof of concept (I've used Monitor here so potential users won't have to worry about reentrancy):
require 'monitor'
module Synchronizable
module ClassMethods
def synchronized(method)
aliased = :"#{method}_without_synchronization"
alias_method aliased, method
define_method method do |*args, &block|
monitor.synchronize do
__send__(aliased, *args, &block)
end
end
end
end
def monitor
@monitor ||= Monitor.new
end
def self.included(base)
base.extend(ClassMethods)
end
end
class Foo
include Synchronizable
synchronized def bar
# ...
end
end
=end
Actions
Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0