Skip to content

Commit 95a283c

Browse files
committed
Add better Rbx support
1 parent 06fc777 commit 95a283c

File tree

1 file changed

+58
-14
lines changed

1 file changed

+58
-14
lines changed

lib/concurrent/synchronized_object.rb

Lines changed: 58 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -179,21 +179,65 @@ def synchronize
179179

180180
def ns_wait(timeout)
181181
@__condition__do_not_use_directly.wait timeout
182+
self
183+
end
184+
end
185+
186+
if Concurrent.on_rbx?
187+
class RbxSynchronizedObject < AbstractSynchronizedObject
188+
def initialize
189+
@waiters = []
190+
end
191+
192+
def synchronize(&block)
193+
Rubinius.synchronize(self, &block)
194+
end
195+
196+
private
197+
198+
def ns_wait(timeout = nil)
199+
wchan = Rubinius::Channel.new
200+
201+
begin
202+
@waiters.push wchan
203+
Rubinius.unlock(self)
204+
signaled = wchan.receive_timeout timeout
205+
ensure
206+
Rubinius.lock(self)
207+
208+
if !signaled && !@waiters.delete(wchan)
209+
# we timed out, but got signaled afterwards,
210+
# so pass that signal on to the next waiter
211+
@waiters.shift << true unless @waiters.empty?
212+
end
213+
end
214+
215+
self
216+
end
217+
218+
def ns_signal
219+
@waiters.shift << true unless @waiters.empty?
220+
self
221+
end
222+
223+
def ns_broadcast
224+
@waiters.shift << true until @waiters.empty?
225+
self
226+
end
182227
end
183228
end
184229

185-
# TODO add rbx implementation
186-
SynchronizedObject = Class.new case
187-
when Concurrent.on_jruby?
188-
JavaSynchronizedObject
189-
when Concurrent.on_cruby? && (RUBY_VERSION.split('.').map(&:to_i) <=> [1, 9, 3]) >= 0
190-
MonitorSynchronizedObject
191-
when Concurrent.on_cruby?
192-
MutexSynchronizedObject
193-
when Concurrent.on_rbx?
194-
# TODO better implementation
195-
MonitorSynchronizedObject
196-
else
197-
MutexSynchronizedObject
198-
end
230+
g class SynchronizedObject < case
231+
when Concurrent.on_jruby?
232+
JavaSynchronizedObject
233+
when Concurrent.on_cruby? && (RUBY_VERSION.split('.').map(&:to_i) <=> [1, 9, 3]) >= 0
234+
MonitorSynchronizedObject
235+
when Concurrent.on_cruby?
236+
MutexSynchronizedObject
237+
when Concurrent.on_rbx?
238+
RbxSynchronizedObject
239+
else
240+
MutexSynchronizedObject
241+
end
242+
end
199243
end

0 commit comments

Comments
 (0)