Issue #4841 has been updated by Hiroshi NAKAMURA.
I guess that WEBrick::Server#{start,stop,shutdown} is not designed to be thread-safe and there's no simple fix for your usage. When I used WEBrick::Server for such purpose, I created my own lock outside of WEBrick::Server instances.
I'm going to ask gotoyuzo (the author) but please don't expect a response soon.
Do you think I understand the issue correctly?
----------------------------------------
Bug #4841: WEBrick threading leads to infinite loop
http://redmine.ruby-lang.org/issues/4841
Author: Peak Xu
Status: Assigned
Priority: Normal
Assignee: GOTOU Yuuzou
Category:
Target version:
ruby -v: run_this.rb
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:
<snip>
@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.
--
http://redmine.ruby-lang.org