Module: Sync_m

Included in:
Sync
Defined in:
lib/sync.rb

Defined Under Namespace

Classes: Err

Constant Summary collapse

RCS_ID =
'-$Header$-'
UN =

lock mode

:UN
SH =
:SH
EX =
:EX

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#sync_ex_countObject

Returns the value of attribute sync_ex_count



242
243
244
# File 'lib/sync.rb', line 242

def sync_ex_count
  @sync_ex_count
end

#sync_ex_lockerObject

Returns the value of attribute sync_ex_locker



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

def sync_ex_locker
  @sync_ex_locker
end

#sync_modeObject

Returns the value of attribute sync_mode



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

def sync_mode
  @sync_mode
end

#sync_sh_lockerObject

Returns the value of attribute sync_sh_locker



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

def sync_sh_locker
  @sync_sh_locker
end

#sync_upgrade_waitingObject

Returns the value of attribute sync_upgrade_waiting



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

def sync_upgrade_waiting
  @sync_upgrade_waiting
end

#sync_waitingObject

Returns the value of attribute sync_waiting



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

def sync_waiting
  @sync_waiting
end

Class Method Details

.append_features(cl) ⇒ Object



91
92
93
94
95
96
97
98
# File 'lib/sync.rb', line 91

def Sync_m.append_features(cl)
  super
  unless cl.instance_of?(Module)
    # do nothing for Modules
    # make aliases and include the proper module.
    define_aliases(cl)
  end
end

.define_aliases(cl) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
# File 'lib/sync.rb', line 79

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

.extend_object(obj) ⇒ Object



100
101
102
103
# File 'lib/sync.rb', line 100

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

Instance Method Details

#sync_exclusive?Boolean

Returns:

  • (Boolean)


127
128
129
# File 'lib/sync.rb', line 127

def sync_exclusive?
  sync_mode == EX
end

#sync_extendedObject



105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/sync.rb', line 105

def sync_extended
  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

#sync_lock(m = EX) ⇒ Object



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

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

  until (Thread.critical = true; sync_try_lock_sub(m))
    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
    Thread.stop
  end
  Thread.critical = false
  self
end

#sync_locked?Boolean

accessing

Returns:

  • (Boolean)


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

def sync_locked?
  sync_mode != UN
end

#sync_shared?Boolean

Returns:

  • (Boolean)


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

def sync_shared?
  sync_mode == SH
end

#sync_synchronize(mode = EX) ⇒ Object



227
228
229
230
231
232
233
234
# File 'lib/sync.rb', line 227

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

#sync_try_lock(mode = EX) ⇒ Object

locking methods.



132
133
134
135
136
137
138
139
# File 'lib/sync.rb', line 132

def sync_try_lock(mode = EX)
  return unlock if mode == UN
  
  Thread.critical = true
  ret = sync_try_lock_sub(mode)
  Thread.critical = false
  ret
end

#sync_unlock(m = EX) ⇒ Object



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
221
222
223
224
225
# File 'lib/sync.rb', line 157

def sync_unlock(m = EX)
  Thread.critical = true
  if sync_mode == UN
    Thread.critical = false
    Err::UnknownLocker.Fail(Thread.current)
  end
  
  m = sync_mode if m == EX and sync_mode == SH
  
  runnable = false
  case m
  when UN
    Thread.critical = false
    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
	for k, v in sync_upgrade_waiting
 sync_sh_locker[k] = v
	end
	wait = sync_upgrade_waiting
	self.sync_upgrade_waiting = []
	Thread.critical = false
	
	for w, v in wait
 w.run
	end
    else
	wait = sync_waiting
	self.sync_waiting = []
	Thread.critical = false
	for w in wait
 w.run
	end
    end
  end
  
  Thread.critical = false
  self
end