Hi,
Based on my earlier emails and further thinking, I've implemented the
following methods which seem to work and which other people might find
useful. No guarantees that they're 100% correct, but it seems to do
what I want. Would it be possible to add something like this to the
standard Queue?
$ cat fu.rb
require 'thread'
require 'timeout'
class TimedReadQueue < Queue
# Waits for the specified timeout (seconds) and returns,
# waking up the accessing thread. This method avoids a
# problem with using Timeout and Queue together to achieve
# the same result.
def tdeq(timeout)
data = nil
if(empty?)
mt = Thread.current
# This thread will wait for the timeout. If it is still
# alive, it will remove the read thread (rt) from the
# waiting list, kill it and restart the main thread.
rt = nil
tt = Thread.new do
Thread.stop; sleep(timeout); @waiting.delete(rt); mt.wakeup
__timeout
end
# This thread will actually try and read the data. If
# it gets data, it will kill the timer and wake up the
# main thread.
rt = Thread.new do
Thread.stop; data = deq; __arnold(tt); mt.wakeup
__read
end
begin
tt.run
rt.run
Thread.stop
ensure
mt.wakeup
__arnold(tt)
__arnold(rt)
end
else
# just read the data
begin
data = deq(true)
rescue ThreadError
# don't care
data = nil
end
end
# return the data value
data
end
private
# This method takes a thread and unconditionally terminates
# it, completely and utterly
def __arnold(thread)
thread.kill if thread && thread.alive?
end
def __timeout
puts("TIMEOUT: #{length} elements; #{num_waiting} threads waiting.")
end
def __read
puts("READ: #{length} elements; #{num_waiting} threads waiting.")
end
end
The entire program (with minimal, manual tests) is also attached.
Any/all feedback more than welcome.
Cheers,
ast
fu.rb (2.47 KB)
···
***************************************************************************************************
The information in this email is confidential and may be legally privileged. Access to this email by anyone other than the intended addressee is unauthorized. If you are not the intended recipient of this message, any review, disclosure, copying, distribution, retention, or any action taken or omitted to be taken in reliance on it is prohibited and may be unlawful. If you are not the intended recipient, please reply to or forward a copy of this message to the sender and delete the message, any attachments, and any copies thereof from your system.
***************************************************************************************************