Module: Mutex_m

Defined in:
lib/mutex_m.rb

Overview

--

mutex_m.rb - 
	$Release Version: 3.0$
	$Revision: 1.7 $
	$Date: 1998/02/27 04:28:57 $
    Original from mutex.rb
	by Keiju ISHITSUKA([email protected])
    modified by matz
    patched by akira yamada

++

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

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.append_features(cl) ⇒ Object



42
43
44
45
# File 'lib/mutex_m.rb', line 42

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

.define_aliases(cl) ⇒ Object



32
33
34
35
36
37
38
39
40
# File 'lib/mutex_m.rb', line 32

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

.extend_object(obj) ⇒ Object



47
48
49
50
# File 'lib/mutex_m.rb', line 47

def Mutex_m.extend_object(obj)
  super
  obj.mu_extended
end

Instance Method Details

#mu_extendedObject



52
53
54
55
56
57
58
59
60
61
# File 'lib/mutex_m.rb', line 52

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

#mu_lockObject



88
89
90
91
92
93
94
95
96
# File 'lib/mutex_m.rb', line 88

def mu_lock
  while (Thread.critical = true; @mu_locked)
    @mu_waiting.push Thread.current
    Thread.stop
  end
  @mu_locked = true
  Thread.critical = false
  self
end

#mu_locked?Boolean

Returns:

  • (Boolean)


73
74
75
# File 'lib/mutex_m.rb', line 73

def mu_locked?
  @mu_locked
end

#mu_synchronizeObject

locking



64
65
66
67
68
69
70
71
# File 'lib/mutex_m.rb', line 64

def mu_synchronize
  begin
    mu_lock
    yield
  ensure
    mu_unlock
  end
end

#mu_try_lockObject



77
78
79
80
81
82
83
84
85
86
# File 'lib/mutex_m.rb', line 77

def mu_try_lock
  result = false
  Thread.critical = true
  unless @mu_locked
    @mu_locked = true
    result = true
  end
  Thread.critical = false
  result
end

#mu_unlockObject



98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/mutex_m.rb', line 98

def mu_unlock
  return unless @mu_locked
  Thread.critical = true
  wait = @mu_waiting
  @mu_waiting = []
  @mu_locked = false
  Thread.critical = false
  for w in wait
    w.run
  end
  self
end