Project

General

Profile

Actions

Bug #4841

closed

WEBrick threading leads to infinite loop

Added by peakxu (Peak Xu) almost 13 years ago. Updated over 6 years ago.

Status:
Closed
Target version:
-
ruby -v:
run_this.rb
[ruby-core:36787]

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

run_this.rb (2.53 KB) run_this.rb peakxu (Peak Xu), 06/06/2011 11:24 PM
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0