Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 100 lines (86 sloc) 1.649 kb
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
#--
# mutex_m.rb -
# $Release Version: 3.0$
# $Revision$
# $Date$
# Original from mutex.rb
# by Keiju ISHITSUKA(keiju@ishitsuka.com)
# modified by matz
# patched by akira yamada
# gutted by MenTaLguY
#++
#
# == Usage
#
# Extend an object and use it like a Mutex object:
#
# require "mutex_m.rb"
# obj = Object.new
# obj.extend Mutex_m
# # ...
#
# Or, include Mutex_m in a class to have its instances behave like a Mutex
# object:
#
# class Foo
# include Mutex_m
# # ...
# end
#
# obj = Foo.new

require 'thread'

module Mutex_m
  def Mutex_m.define_aliases(cl)
    cl.module_eval %q{
alias locked? mu_locked?
alias lock mu_lock
alias unlock mu_unlock
alias try_lock mu_try_lock
alias synchronize mu_synchronize
}
  end

  def Mutex_m.append_features(cl)
    super
    define_aliases(cl) unless cl.instance_of?(Module)
  end
  
  def Mutex_m.extend_object(obj)
    super
    obj.mu_extended
  end

  def mu_extended
    unless (defined? locked? and
defined? lock and
defined? unlock and
defined? try_lock and
defined? synchronize)
      Mutex_m.define_aliases(class<<self;self;end)
    end
    mu_initialize
  end
  
  # locking
  def mu_synchronize
    @mu_mutex.synchronize { yield }
  end
  
  def mu_locked?
    @mu_mutex.locked?
  end
  
  def mu_try_lock
    @mu_mutex.try_lock
  end
  
  def mu_lock
    @mu_mutex.lock
    self
  end
  
  def mu_unlock
    @mu_mutex.unlock
    self
  end
  
  private
  
  def mu_initialize
    @mu_mutex = ::Mutex.new
  end

  def initialize(*args)
    mu_initialize
    super
  end
end
Something went wrong with that request. Please try again.