Issue #4841 has been updated by Hiroshi NAKAMURA.

Assignee changed from GOTOU Yuuzou to Hiroshi NAKAMURA


----------------------------------------
Bug #4841: WEBrick threading leads to infinite loop
http://redmine.ruby-lang.org/issues/4841

Author: Peak Xu
Status: Assigned
Priority: Normal
Assignee: Hiroshi NAKAMURA
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