Bug #4841
closedWEBrick threading leads to infinite loop
Description
In a multi-threaded environment, the callback in WEBrick web server does not appear to work properly. If shutdown is called right after start, the server can entire an infinite loop and need to be killed using Ctrl-C.
Reproducible on 1.9.2 p180 on Windows and 1.8.7 on Cygwin.
ruby -v run_this.rb
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin]
[2011-06-06 10:12:58] INFO WEBrick 1.3.1
[2011-06-06 10:12:58] INFO ruby 1.8.7 (2008-08-11) [i386-cygwin]
[2011-06-06 10:12:58] INFO WEBrick::HTTPServer#start: pid=4860 port=19000
run_this.rb:95:in join': Interrupt from run_this.rb:95:in
stop'
from run_this.rb:102
Note: killed manually to break out of infinite loop.
Recommended fix:
In webrick/server.rb around line 85-88, there's a callback as well as initialization of status to Running. If we move the callback below the initialization, this fixes the issue on 1.8.7 Cygwin but not in 1.9.2 Windows. Code should look like below:
@logger.info
"#{self.class}#start: pid=#{$$} port=#{@config[:Port]}"
thgroup = ThreadGroup.new
@status = :Running
call_callback(:StartCallback)
while @status == :Running
<snip>
ruby -v output now looks like:
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin]
[2011-06-06 10:05:45] INFO WEBrick 1.3.1
[2011-06-06 10:05:45] INFO ruby 1.8.7 (2008-08-11) [i386-cygwin]
[2011-06-06 10:05:45] INFO WEBrick::HTTPServer#start: pid=5228 port=19000
[2011-06-06 10:05:45] INFO going to shutdown ...
[2011-06-06 10:05:45] INFO WEBrick::HTTPServer#start done.
Files