From: eden li Date: 2006-09-28T17:15:13+09:00 Subject: Timeout and Exponetial Regexes Side-stepping the debate about running exponential regular expressions first place, I'd like to catch a long running regex using Timeout.timeout(): $ ruby -v && irb -r timeout ruby 1.8.4 (2005-12-24) [i486-linux] irb(main):001:0> Timeout.timeout 5 do ("a"*300)+"b" =~ /^(a*)*$/ end Except that it appears the mechanism the Timeout module uses can't seem to do this. After looking at the source of Timeout.timeout(), it seems that the regex is blocking all threads and disallowing the Timeout mechanism from detecting the runaway block. Indeed, the following never returns: irb(main):002:0> t = Thread.new do ("a"*300)+"b" =~ /^(a*)*$/ end A few questions: - Why do regexes seem to stop up all threads? Is this fixed in ruby 1.9? - Is there a way to offload this processing into another thread without resorting to DRb? - Is there a better way to detect this sort of thing?