Project

General

Profile

Actions

Feature #8961

open

Synchronizable module to easily wrap methods in a mutex

Added by tobiassvn (Tobias Svensson) over 8 years ago. Updated 5 months ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:57440]

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


Related issues 1 (0 open1 closed)

Related to Ruby master - Feature #8556: MutexedDelegator as a trivial way to make an object thread-safeRejectedko1 (Koichi Sasada)Actions
Actions

Also available in: Atom PDF