Module: Sync_m

Defined in:
lib/sync.rb

Defined Under Namespace

Classes: Err

Constant Summary

RCS_ID =
'-$Id: sync.rb 25189 2009-10-02 12:04:37Z akr $-'
UN =

lock mode

:UN
SH =
:SH
EX =
:EX

Instance Attribute Summary (collapse)

Class Method Summary (collapse)

Instance Method Summary (collapse)

Instance Attribute Details

- (Object) sync_ex_count

Returns the value of attribute sync_ex_count



237
238
239
# File 'lib/sync.rb', line 237

def sync_ex_count
  @sync_ex_count
end

- (Object) sync_ex_locker

Returns the value of attribute sync_ex_locker



236
237
238
# File 'lib/sync.rb', line 236

def sync_ex_locker
  @sync_ex_locker
end

- (Object) sync_mode

Returns the value of attribute sync_mode



231
232
233
# File 'lib/sync.rb', line 231

def sync_mode
  @sync_mode
end

- (Object) sync_sh_locker

Returns the value of attribute sync_sh_locker



235
236
237
# File 'lib/sync.rb', line 235

def sync_sh_locker
  @sync_sh_locker
end

- (Object) sync_upgrade_waiting

Returns the value of attribute sync_upgrade_waiting



234
235
236
# File 'lib/sync.rb', line 234

def sync_upgrade_waiting
  @sync_upgrade_waiting
end

- (Object) sync_waiting

Returns the value of attribute sync_waiting



233
234
235
# File 'lib/sync.rb', line 233

def sync_waiting
  @sync_waiting
end

Class Method Details

+ (Object) append_features(cl)



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

def Sync_m.append_features(cl)
  super
  # do nothing for Modules
  # make aliases for Classes.
  define_aliases(cl) unless cl.instance_of?(Module)
  self
end

+ (Object) define_aliases(cl)



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

def Sync_m.define_aliases(cl)
  cl.module_eval %q{
    alias locked? sync_locked?
    alias shared? sync_shared?
    alias exclusive? sync_exclusive?
    alias lock sync_lock
    alias unlock sync_unlock
    alias try_lock sync_try_lock
    alias synchronize sync_synchronize
  }
end

+ (Object) extend_object(obj)



96
97
98
99
# File 'lib/sync.rb', line 96

def Sync_m.extend_object(obj)
  super
  obj.sync_extend
end

Instance Method Details

- (Boolean) sync_exclusive?

Returns:

  • (Boolean)


123
124
125
# File 'lib/sync.rb', line 123

def sync_exclusive?
  sync_mode == EX
end

- (Object) sync_extend



101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/sync.rb', line 101

def sync_extend
  unless (defined? locked? and
   defined? shared? and
   defined? exclusive? and
   defined? lock and
   defined? unlock and
   defined? try_lock and
   defined? synchronize)
    Sync_m.define_aliases(class<<self;self;end)
  end
  sync_initialize
end

- (Object) sync_inspect



239
240
241
242
# File 'lib/sync.rb', line 239

def sync_inspect
  sync_iv = instance_variables.select{|iv| /^@sync_/ =~ iv.id2name}.collect{|iv| iv.id2name + '=' + instance_eval(iv.id2name).inspect}.join(",")
  print "<#{self.class}.extend Sync_m: #{inspect}, <Sync_m: #{sync_iv}>"
end

- (Object) sync_lock(m = EX)



136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/sync.rb', line 136

def sync_lock(m = EX)
  return unlock if m == UN

  while true
    @sync_mutex.synchronize do
	if sync_try_lock_sub(m)
 return self
	else
 if sync_sh_locker[Thread.current]
   sync_upgrade_waiting.push [Thread.current, sync_sh_locker[Thread.current]]
   sync_sh_locker.delete(Thread.current)
 else
   sync_waiting.push Thread.current
 end
 @sync_mutex.sleep
	end
    end
  end
  self
end

- (Boolean) sync_locked?

accessing

Returns:

  • (Boolean)


115
116
117
# File 'lib/sync.rb', line 115

def sync_locked?
  sync_mode != UN
end

- (Boolean) sync_shared?

Returns:

  • (Boolean)


119
120
121
# File 'lib/sync.rb', line 119

def sync_shared?
  sync_mode == SH
end

- (Object) sync_synchronize(mode = EX)



222
223
224
225
226
227
228
229
# File 'lib/sync.rb', line 222

def sync_synchronize(mode = EX)
  sync_lock(mode)
  begin
    yield
  ensure
    sync_unlock
  end
end

- (Object) sync_try_lock(mode = EX)

locking methods.



128
129
130
131
132
133
134
# File 'lib/sync.rb', line 128

def sync_try_lock(mode = EX)
  return unlock if mode == UN
  @sync_mutex.synchronize do
    ret = sync_try_lock_sub(mode)
  end
  ret
end

- (Object) sync_unlock(m = EX)



157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
# File 'lib/sync.rb', line 157

def sync_unlock(m = EX)
  wakeup_threads = []
  @sync_mutex.synchronize do
    if sync_mode == UN
	Err::UnknownLocker.Fail(Thread.current)
    end

    m = sync_mode if m == EX and sync_mode == SH

    runnable = false
    case m
    when UN
	Err::UnknownLocker.Fail(Thread.current)

    when EX
	if sync_ex_locker == Thread.current
 if (self.sync_ex_count = sync_ex_count - 1) == 0
   self.sync_ex_locker = nil
   if sync_sh_locker.include?(Thread.current)
     self.sync_mode = SH
   else
     self.sync_mode = UN
   end
   runnable = true
 end
	else
 Err::UnknownLocker.Fail(Thread.current)
	end

    when SH
	if (count = sync_sh_locker[Thread.current]).nil?
 Err::UnknownLocker.Fail(Thread.current)
	else
 if (sync_sh_locker[Thread.current] = count - 1) == 0
   sync_sh_locker.delete(Thread.current)
   if sync_sh_locker.empty? and sync_ex_count == 0
     self.sync_mode = UN
     runnable = true
   end
 end
	end
    end

    if runnable
	if sync_upgrade_waiting.size > 0
 th, count = sync_upgrade_waiting.shift
 sync_sh_locker[th] = count
 th.wakeup
 wakeup_threads.push th
	else
 wait = sync_waiting
 self.sync_waiting = []
 for th in wait
   th.wakeup
   wakeup_threads.push th
 end
	end
    end
  end
  for th in wakeup_threads
    th.run
  end
  self
end