Timeout w/o timeout.rb


(Ara.T.Howard) #1

i’m writing some unit tests which do alot of io/select/etc - bad things to mix
with a thread based ‘timeout’ method… i’ve been using this instead:

a timeout method which does not fail when io blocks

trap ‘SIGALRM’, 'IGNORE’
class TimeoutError < StandardError; end
def timeout n
begin
trap(‘SIGALRM’){throw :timeout, TimeoutError.new}
cid = nil
unless((cid = fork))
sleep n
Process.kill ‘SIGALRM’, Process.ppid
else
thrown =
catch(:timeout) do
ret = yield
Process.kill ‘SIGKILL’, cid
ret
end
raise thrown if TimeoutError === thrown
end
ensure
trap ‘SIGALRM’, 'IGNORE’
end
end

any massive problems with this (this impl is a mega hack i realize)?

does it seem like some permutation of this might be useful? something like
Process#timeout perhaps??

-a

···

ATTN: please update your address books with address below!

===============================================================================

EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
PHONE :: 303.497.6469
ADDRESS :: E/GC2 325 Broadway, Boulder, CO 80305-3328
STP :: http://www.ngdc.noaa.gov/stp/
NGDC :: http://www.ngdc.noaa.gov/
NESDIS :: http://www.nesdis.noaa.gov/
NOAA :: http://www.noaa.gov/
US DOC :: http://www.commerce.gov/

The difference between art and science is that science is what we
understand well enough to explain to a computer.
Art is everything else.
– Donald Knuth, “Discover”

/bin/sh -c ‘for l in ruby perl;do $l -e “print “\x3a\x2d\x29\x0a””;done’
===============================================================================


(Pit) #2

Ara.T.Howard wrote:

any massive problems with this (this impl is a mega hack i realize)?

Doesn’t work on windows (this is a problem with me, not with your code :slight_smile: )

Regards,
Pit


(Jamis Buck) #3

Ara.T.Howard wrote:

i’m writing some unit tests which do alot of io/select/etc - bad things to mix
with a thread based ‘timeout’ method… i’ve been using this instead:

a timeout method which does not fail when io blocks

trap ‘SIGALRM’, 'IGNORE’
class TimeoutError < StandardError; end
def timeout n
begin
trap(‘SIGALRM’){throw :timeout, TimeoutError.new}
cid = nil
unless((cid = fork))
sleep n
Process.kill ‘SIGALRM’, Process.ppid
else
thrown =
catch(:timeout) do
ret = yield
Process.kill ‘SIGKILL’, cid
ret
end
raise thrown if TimeoutError === thrown
end
ensure
trap ‘SIGALRM’, 'IGNORE’
end
end

any massive problems with this (this impl is a mega hack i realize)?

does it seem like some permutation of this might be useful? something like
Process#timeout perhaps??

-a

Doesn’t Ruby use SIGALRM internally? I could be wrong, but if it does,
you may be asking for trouble by using it in your script.

  • Jamis
···


Jamis Buck
jgb3@email.byu.edu
http://www.jamisbuck.org/blog/jamis.cgi

ruby -h | ruby -e ‘a=[];readlines.join.scan(/-(.)[e|Kk(\S*)|le.l(…)e|#!(\S*)/) {|r| a << r.compact.first };puts “\n>#{a.join(%q/ /)}<\n\n”’


(Ara.T.Howard) #4

ah - good point - and SIGUSR1 would work just as well

-a

···

On Tue, 10 Feb 2004, Jamis Buck wrote:

Date: Tue, 10 Feb 2004 09:32:11 +0900
From: Jamis Buck jgb3@email.byu.edu
Newsgroups: comp.lang.ruby
Subject: Re: timeout w/o timeout.rb

Ara.T.Howard wrote:

i’m writing some unit tests which do alot of io/select/etc - bad things to mix
with a thread based ‘timeout’ method… i’ve been using this instead:

a timeout method which does not fail when io blocks

trap ‘SIGALRM’, 'IGNORE’
class TimeoutError < StandardError; end
def timeout n
begin
trap(‘SIGALRM’){throw :timeout, TimeoutError.new}
cid = nil
unless((cid = fork))
sleep n
Process.kill ‘SIGALRM’, Process.ppid
else
thrown =
catch(:timeout) do
ret = yield
Process.kill ‘SIGKILL’, cid
ret
end
raise thrown if TimeoutError === thrown
end
ensure
trap ‘SIGALRM’, 'IGNORE’
end
end

any massive problems with this (this impl is a mega hack i realize)?

does it seem like some permutation of this might be useful? something like
Process#timeout perhaps??

-a

Doesn’t Ruby use SIGALRM internally? I could be wrong, but if it does,
you may be asking for trouble by using it in your script.

  • Jamis

ATTN: please update your address books with address below!

===============================================================================

EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
PHONE :: 303.497.6469
ADDRESS :: E/GC2 325 Broadway, Boulder, CO 80305-3328
STP :: http://www.ngdc.noaa.gov/stp/
NGDC :: http://www.ngdc.noaa.gov/
NESDIS :: http://www.nesdis.noaa.gov/
NOAA :: http://www.noaa.gov/
US DOC :: http://www.commerce.gov/

The difference between art and science is that science is what we
understand well enough to explain to a computer.
Art is everything else.
– Donald Knuth, “Discover”

/bin/sh -c ‘for l in ruby perl;do $l -e “print “\x3a\x2d\x29\x0a””;done’
===============================================================================