diff options
Diffstat (limited to 'lib/rainbows/sync_close.rb')
-rw-r--r-- | lib/rainbows/sync_close.rb | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/lib/rainbows/sync_close.rb b/lib/rainbows/sync_close.rb new file mode 100644 index 0000000..a336262 --- /dev/null +++ b/lib/rainbows/sync_close.rb @@ -0,0 +1,37 @@ +# -*- encoding: binary -*- +# :enddoc: +require 'thread' +class Rainbows::SyncClose + def initialize(body) + @body = body + @mutex = Mutex.new + @cv = ConditionVariable.new + @mutex.synchronize do + yield self + @cv.wait(@mutex) + end + end + + def respond_to?(m) + @body.respond_to?(m) + end + + def to_path + @body.to_path + end + + def each(&block) + @body.each(&block) + end + + def to_io + @body.to_io + end + + # called by the writer thread to wake up the original thread (in #initialize) + def close + @body.close + ensure + @mutex.synchronize { @cv.signal } + end +end |