A
Andrew S. Townley
--=-6YcQHYoBJJLKKdsYFNhU
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
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
***************************************************************************************************
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.
***************************************************************************************************
--=-6YcQHYoBJJLKKdsYFNhU
Content-Disposition: attachment; filename=fu.rb
Content-Type: text/plain; name=fu.rb; charset=ANSI_X3.4-1968
Content-Transfer-Encoding: base64
cmVxdWlyZSAndGhyZWFkJw0KcmVxdWlyZSAndGltZW91dCcNCg0KY2xhc3MgVGltZWRSZWFkUXVl
dWUgPCBRdWV1ZQ0KICANCiAgIyBXYWl0cyBmb3IgdGhlIHNwZWNpZmllZCB0aW1lb3V0IChzZWNv
bmRzKSBhbmQgcmV0dXJucywNCiAgIyB3YWtpbmcgdXAgdGhlIGFjY2Vzc2luZyB0aHJlYWQuICBU
aGlzIG1ldGhvZCBhdm9pZHMgYQ0KICAjIHByb2JsZW0gd2l0aCB1c2luZyBUaW1lb3V0IGFuZCBR
dWV1ZSB0b2dldGhlciB0byBhY2hpZXZlDQogICMgdGhlIHNhbWUgcmVzdWx0Lg0KDQogIGRlZiB0
ZGVxKHRpbWVvdXQpDQogICAgZGF0YSA9IG5pbA0KICAgIA0KICAgIGlmKGVtcHR5PykNCiAgICAg
IG10ID0gVGhyZWFkLmN1cnJlbnQNCg0KICAgICAgIyBUaGlzIHRocmVhZCB3aWxsIHdhaXQgZm9y
IHRoZSB0aW1lb3V0LiAgSWYgaXQgaXMgc3RpbGwNCiAgICAgICMgYWxpdmUsIGl0IHdpbGwgcmVt
b3ZlIHRoZSByZWFkIHRocmVhZCAocnQpIGZyb20gdGhlDQogICAgICAjIHdhaXRpbmcgbGlzdCwg
a2lsbCBpdCBhbmQgcmVzdGFydCB0aGUgbWFpbiB0aHJlYWQuDQoNCiAgICAgIHJ0ID0gbmlsDQog
ICAgICB0dCA9IFRocmVhZC5uZXcgZG8NCiAgICAgICAgVGhyZWFkLnN0b3A7IHNsZWVwKHRpbWVv
dXQpOyBAd2FpdGluZy5kZWxldGUocnQpOyBtdC53YWtldXANCiAgICAgICAgX190aW1lb3V0DQog
ICAgICBlbmQNCiAgICAgIA0KICAgICAgIyBUaGlzIHRocmVhZCB3aWxsIGFjdHVhbGx5IHRyeSBh
bmQgcmVhZCB0aGUgZGF0YS4gIElmDQogICAgICAjIGl0IGdldHMgZGF0YSwgaXQgd2lsbCBraWxs
IHRoZSB0aW1lciBhbmQgd2FrZSB1cCB0aGUNCiAgICAgICMgbWFpbiB0aHJlYWQuDQoNCiAgICAg
IHJ0ID0gVGhyZWFkLm5ldyBkbw0KICAgICAgICBUaHJlYWQuc3RvcDsgZGF0YSA9IGRlcTsgX19h
cm5vbGQodHQpOyBtdC53YWtldXANCiAgICAgICAgX19yZWFkDQogICAgICBlbmQNCg0KICAgICAg
YmVnaW4NCiAgICAgICAgdHQucnVuDQogICAgICAgIHJ0LnJ1bg0KICAgICAgICBUaHJlYWQuc3Rv
cA0KICAgICAgZW5zdXJlDQogICAgICAgIG10Lndha2V1cA0KICAgICAgICBfX2Fybm9sZCh0dCkN
CiAgICAgICAgX19hcm5vbGQocnQpDQogICAgICBlbmQNCiAgICBlbHNlDQogICAgICAjIGp1c3Qg
cmVhZCB0aGUgZGF0YQ0KICAgICAgYmVnaW4NCiAgICAgICAgZGF0YSA9IGRlcSh0cnVlKQ0KICAg
ICAgcmVzY3VlIFRocmVhZEVycm9yDQogICAgICAgICMgZG9uJ3QgY2FyZQ0KICAgICAgICBkYXRh
ID0gbmlsDQogICAgICBlbmQNCiAgICBlbmQNCg0KICAgICMgcmV0dXJuIHRoZSBkYXRhIHZhbHVl
DQogICAgZGF0YQ0KICBlbmQNCg0KcHJpdmF0ZQ0KDQogICMgVGhpcyBtZXRob2QgdGFrZXMgYSB0
aHJlYWQgYW5kIHVuY29uZGl0aW9uYWxseSB0ZXJtaW5hdGVzDQogICMgaXQsIGNvbXBsZXRlbHkg
YW5kIHV0dGVybHkNCg0KICBkZWYgX19hcm5vbGQodGhyZWFkKQ0KICAgIHRocmVhZC5raWxsIGlm
IHRocmVhZCAmJiB0aHJlYWQuYWxpdmU/DQogIGVuZA0KDQogIGRlZiBfX3RpbWVvdXQNCiAgICBw
dXRzKCJUSU1FT1VUOiAgI3tsZW5ndGh9IGVsZW1lbnRzOyAje251bV93YWl0aW5nfSB0aHJlYWRz
IHdhaXRpbmcuIikNCiAgZW5kDQoNCiAgZGVmIF9fcmVhZA0KICAgIHB1dHMoIlJFQUQ6ICAgICAj
e2xlbmd0aH0gZWxlbWVudHM7ICN7bnVtX3dhaXRpbmd9IHRocmVhZHMgd2FpdGluZy4iKQ0KICBl
bmQNCmVuZA0KDQoNCkBxdWV1ZSA9IFF1ZXVlLm5ldw0KDQpkZWYgcmVhZCh0aW1lb3V0KQ0KICBi
ZWdpbg0KICAgIFRpbWVvdXQ6OnRpbWVvdXQodGltZW91dCkgZG8NCiAgICAgIHB1dHMoIlJFQUQ6
ICAgI3tAcXVldWUubGVuZ3RofSBlbGVtZW50czsgI3tAcXVldWUubnVtX3dhaXRpbmd9IHRocmVh
ZHMgd2FpdGluZy4iKQ0KICAgICAgcmV0dXJuIEBxdWV1ZS5kZXENCiAgICBlbmQNCiAgcmVzY3Vl
IFRpbWVvdXQ6OkVycm9yDQogICAgcHV0cygiVElNRU9VVDogICN7QHF1ZXVlLmxlbmd0aH0gZWxl
bWVudHM7ICN7QHF1ZXVlLm51bV93YWl0aW5nfSB0aHJlYWRzIHdhaXRpbmcuIikNCiAgZW5kDQpl
bmQNCg0KcHV0cyAiTm9ybWFsIHF1ZXVlIGFuZCB0aW1lci4uLiINCnJlYWQoMSk7IHJlYWQoMSk7
IHJlYWQoMSk7IHJlYWQoMSk7IHJlYWQoMSk7IHJlYWQoMSkNCkBxdWV1ZSA8PCAib25lIg0KcmVh
ZCgxKTsgcmVhZCgxKTsgcmVhZCgxKTsgcmVhZCgxKTsgcmVhZCgxKTsgcmVhZCgxKQ0KDQpwdXRz
ICJUaW1lZCByZWFkIHF1ZXVlLi4uIg0KcTIgPSBUaW1lZFJlYWRRdWV1ZS5uZXcNCnEyLnRkZXEo
MSk7IHEyLnRkZXEoMSk7IHEyLnRkZXEoMSk7IHEyLnRkZXEoMSk7IHEyLnRkZXEoMSk7IHEyLnRk
ZXEoMSkNCnEyIDw8ICJvbmUiDQpxMi50ZGVxKDEpOyBxMi50ZGVxKDEpOyBxMi50ZGVxKDEpOyBx
Mi50ZGVxKDEpOyBxMi50ZGVxKDEpOyBxMi50ZGVxKDEpDQpwdXRzKCJRMjogI3txMi5sZW5ndGh9
IGVsZW1lbnRzOyAje3EyLm51bV93YWl0aW5nfSB0aHJlYWRzIHdhaXRpbmcuIikNCg0KcHV0cyBU
aHJlYWQubGlzdC5qb2luKCIsICIpDQo=
--=-6YcQHYoBJJLKKdsYFNhU--
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
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
***************************************************************************************************
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.
***************************************************************************************************
--=-6YcQHYoBJJLKKdsYFNhU
Content-Disposition: attachment; filename=fu.rb
Content-Type: text/plain; name=fu.rb; charset=ANSI_X3.4-1968
Content-Transfer-Encoding: base64
cmVxdWlyZSAndGhyZWFkJw0KcmVxdWlyZSAndGltZW91dCcNCg0KY2xhc3MgVGltZWRSZWFkUXVl
dWUgPCBRdWV1ZQ0KICANCiAgIyBXYWl0cyBmb3IgdGhlIHNwZWNpZmllZCB0aW1lb3V0IChzZWNv
bmRzKSBhbmQgcmV0dXJucywNCiAgIyB3YWtpbmcgdXAgdGhlIGFjY2Vzc2luZyB0aHJlYWQuICBU
aGlzIG1ldGhvZCBhdm9pZHMgYQ0KICAjIHByb2JsZW0gd2l0aCB1c2luZyBUaW1lb3V0IGFuZCBR
dWV1ZSB0b2dldGhlciB0byBhY2hpZXZlDQogICMgdGhlIHNhbWUgcmVzdWx0Lg0KDQogIGRlZiB0
ZGVxKHRpbWVvdXQpDQogICAgZGF0YSA9IG5pbA0KICAgIA0KICAgIGlmKGVtcHR5PykNCiAgICAg
IG10ID0gVGhyZWFkLmN1cnJlbnQNCg0KICAgICAgIyBUaGlzIHRocmVhZCB3aWxsIHdhaXQgZm9y
IHRoZSB0aW1lb3V0LiAgSWYgaXQgaXMgc3RpbGwNCiAgICAgICMgYWxpdmUsIGl0IHdpbGwgcmVt
b3ZlIHRoZSByZWFkIHRocmVhZCAocnQpIGZyb20gdGhlDQogICAgICAjIHdhaXRpbmcgbGlzdCwg
a2lsbCBpdCBhbmQgcmVzdGFydCB0aGUgbWFpbiB0aHJlYWQuDQoNCiAgICAgIHJ0ID0gbmlsDQog
ICAgICB0dCA9IFRocmVhZC5uZXcgZG8NCiAgICAgICAgVGhyZWFkLnN0b3A7IHNsZWVwKHRpbWVv
dXQpOyBAd2FpdGluZy5kZWxldGUocnQpOyBtdC53YWtldXANCiAgICAgICAgX190aW1lb3V0DQog
ICAgICBlbmQNCiAgICAgIA0KICAgICAgIyBUaGlzIHRocmVhZCB3aWxsIGFjdHVhbGx5IHRyeSBh
bmQgcmVhZCB0aGUgZGF0YS4gIElmDQogICAgICAjIGl0IGdldHMgZGF0YSwgaXQgd2lsbCBraWxs
IHRoZSB0aW1lciBhbmQgd2FrZSB1cCB0aGUNCiAgICAgICMgbWFpbiB0aHJlYWQuDQoNCiAgICAg
IHJ0ID0gVGhyZWFkLm5ldyBkbw0KICAgICAgICBUaHJlYWQuc3RvcDsgZGF0YSA9IGRlcTsgX19h
cm5vbGQodHQpOyBtdC53YWtldXANCiAgICAgICAgX19yZWFkDQogICAgICBlbmQNCg0KICAgICAg
YmVnaW4NCiAgICAgICAgdHQucnVuDQogICAgICAgIHJ0LnJ1bg0KICAgICAgICBUaHJlYWQuc3Rv
cA0KICAgICAgZW5zdXJlDQogICAgICAgIG10Lndha2V1cA0KICAgICAgICBfX2Fybm9sZCh0dCkN
CiAgICAgICAgX19hcm5vbGQocnQpDQogICAgICBlbmQNCiAgICBlbHNlDQogICAgICAjIGp1c3Qg
cmVhZCB0aGUgZGF0YQ0KICAgICAgYmVnaW4NCiAgICAgICAgZGF0YSA9IGRlcSh0cnVlKQ0KICAg
ICAgcmVzY3VlIFRocmVhZEVycm9yDQogICAgICAgICMgZG9uJ3QgY2FyZQ0KICAgICAgICBkYXRh
ID0gbmlsDQogICAgICBlbmQNCiAgICBlbmQNCg0KICAgICMgcmV0dXJuIHRoZSBkYXRhIHZhbHVl
DQogICAgZGF0YQ0KICBlbmQNCg0KcHJpdmF0ZQ0KDQogICMgVGhpcyBtZXRob2QgdGFrZXMgYSB0
aHJlYWQgYW5kIHVuY29uZGl0aW9uYWxseSB0ZXJtaW5hdGVzDQogICMgaXQsIGNvbXBsZXRlbHkg
YW5kIHV0dGVybHkNCg0KICBkZWYgX19hcm5vbGQodGhyZWFkKQ0KICAgIHRocmVhZC5raWxsIGlm
IHRocmVhZCAmJiB0aHJlYWQuYWxpdmU/DQogIGVuZA0KDQogIGRlZiBfX3RpbWVvdXQNCiAgICBw
dXRzKCJUSU1FT1VUOiAgI3tsZW5ndGh9IGVsZW1lbnRzOyAje251bV93YWl0aW5nfSB0aHJlYWRz
IHdhaXRpbmcuIikNCiAgZW5kDQoNCiAgZGVmIF9fcmVhZA0KICAgIHB1dHMoIlJFQUQ6ICAgICAj
e2xlbmd0aH0gZWxlbWVudHM7ICN7bnVtX3dhaXRpbmd9IHRocmVhZHMgd2FpdGluZy4iKQ0KICBl
bmQNCmVuZA0KDQoNCkBxdWV1ZSA9IFF1ZXVlLm5ldw0KDQpkZWYgcmVhZCh0aW1lb3V0KQ0KICBi
ZWdpbg0KICAgIFRpbWVvdXQ6OnRpbWVvdXQodGltZW91dCkgZG8NCiAgICAgIHB1dHMoIlJFQUQ6
ICAgI3tAcXVldWUubGVuZ3RofSBlbGVtZW50czsgI3tAcXVldWUubnVtX3dhaXRpbmd9IHRocmVh
ZHMgd2FpdGluZy4iKQ0KICAgICAgcmV0dXJuIEBxdWV1ZS5kZXENCiAgICBlbmQNCiAgcmVzY3Vl
IFRpbWVvdXQ6OkVycm9yDQogICAgcHV0cygiVElNRU9VVDogICN7QHF1ZXVlLmxlbmd0aH0gZWxl
bWVudHM7ICN7QHF1ZXVlLm51bV93YWl0aW5nfSB0aHJlYWRzIHdhaXRpbmcuIikNCiAgZW5kDQpl
bmQNCg0KcHV0cyAiTm9ybWFsIHF1ZXVlIGFuZCB0aW1lci4uLiINCnJlYWQoMSk7IHJlYWQoMSk7
IHJlYWQoMSk7IHJlYWQoMSk7IHJlYWQoMSk7IHJlYWQoMSkNCkBxdWV1ZSA8PCAib25lIg0KcmVh
ZCgxKTsgcmVhZCgxKTsgcmVhZCgxKTsgcmVhZCgxKTsgcmVhZCgxKTsgcmVhZCgxKQ0KDQpwdXRz
ICJUaW1lZCByZWFkIHF1ZXVlLi4uIg0KcTIgPSBUaW1lZFJlYWRRdWV1ZS5uZXcNCnEyLnRkZXEo
MSk7IHEyLnRkZXEoMSk7IHEyLnRkZXEoMSk7IHEyLnRkZXEoMSk7IHEyLnRkZXEoMSk7IHEyLnRk
ZXEoMSkNCnEyIDw8ICJvbmUiDQpxMi50ZGVxKDEpOyBxMi50ZGVxKDEpOyBxMi50ZGVxKDEpOyBx
Mi50ZGVxKDEpOyBxMi50ZGVxKDEpOyBxMi50ZGVxKDEpDQpwdXRzKCJRMjogI3txMi5sZW5ndGh9
IGVsZW1lbnRzOyAje3EyLm51bV93YWl0aW5nfSB0aHJlYWRzIHdhaXRpbmcuIikNCg0KcHV0cyBU
aHJlYWQubGlzdC5qb2luKCIsICIpDQo=
--=-6YcQHYoBJJLKKdsYFNhU--