Project

General

Profile

Feature #8961

Updated by nobu (Nobuyoshi Nakada) over 6 years ago

=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}))'. 'def'. 

 The Mixin adds a new '(({synchronized}))' 'synchronized' class method which would alias the referenced method and redefines the original method wrapped in a '(({synchronize 'synchronize do .. end}))' 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 
   
     
   end 
 
   def monitor 
       
     @monitor ||= Monitor.new 
     
   end 
   
     
 
   def self.included(base) 
       
     base.extend(ClassMethods) 
     end 
   end 
   
   
 end 
 
 class Foo 
     
   include Synchronizable 
   
     
 
   synchronized def bar 
       
     # ... 
     end 
   end 
 =end end 

Back