[#44036] [ruby-trunk - Feature #6242][Open] Ruby should support lists — "shugo (Shugo Maeda)" <redmine@...>

20 messages 2012/04/01

[#44084] [ruby-trunk - Bug #6246][Open] 1.9.3-p125 intermittent segfault — "jshow (Jodi Showers)" <jodi@...>

22 messages 2012/04/02

[#44156] [ruby-trunk - Feature #6265][Open] Remove 'useless' 'concatenation' syntax — "rosenfeld (Rodrigo Rosenfeld Rosas)" <rr.rosas@...>

45 messages 2012/04/06

[#44163] [ruby-trunk - Bug #6266][Open] encoding related exception with recent integrated psych — "jonforums (Jon Forums)" <redmine@...>

10 messages 2012/04/06

[#44303] [ruby-trunk - Feature #6284][Open] Add composition for procs — "pabloh (Pablo Herrero)" <pablodherrero@...>

57 messages 2012/04/12

[#44349] [ruby-trunk - Feature #6293][Open] new queue / blocking queues — "tenderlovemaking (Aaron Patterson)" <aaron@...>

10 messages 2012/04/13

[#44402] [ruby-trunk - Feature #6308][Open] Eliminate delegation from WeakRef — "headius (Charles Nutter)" <headius@...>

20 messages 2012/04/17

[#44403] [ruby-trunk - Feature #6309][Open] Add a reference queue for weak references — "headius (Charles Nutter)" <headius@...>

15 messages 2012/04/17

[#44533] [ruby-trunk - Bug #6341][Open] SIGSEGV: Thread.new { fork { GC.start } }.join — "rudolf (r stu3)" <redmine@...>

24 messages 2012/04/22

[#44630] [ruby-trunk - Feature #6361][Open] Bitwise string operations — "MartinBosslet (Martin Bosslet)" <Martin.Bosslet@...>

31 messages 2012/04/26

[#44648] [ruby-trunk - Feature #6367][Open] #same? for Enumerable — "prijutme4ty (Ilya Vorontsov)" <prijutme4ty@...>

16 messages 2012/04/26

[#44704] [ruby-trunk - Feature #6373][Open] public #self — "trans (Thomas Sawyer)" <transfire@...>

61 messages 2012/04/27

[#44748] [ruby-trunk - Feature #6376][Open] Feature lookup and checking if feature is loaded — "trans (Thomas Sawyer)" <transfire@...>

13 messages 2012/04/28

[ruby-core:44666] [ruby-trunk - Bug #6369][Open] GServer blocking after shutdown called

From: "stevegoobermanhill (stephen gooberman-hill)" <stevegoobermanhill@...>
Date: 2012-04-26 20:52:30 UTC
List: ruby-core #44666
Issue #6369 has been reported by stevegoobermanhill (stephen gooberman-hill).

----------------------------------------
Bug #6369: GServer blocking after shutdown called
https://bugs.ruby-lang.org/issues/6369

Author: stevegoobermanhill (stephen gooberman-hill)
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 
ruby -v: ruby 1.9.2p290 (2011-07-09 revision 32553) [i686-linux]


Hi,
My investigation of bug #6358 points the finger at GServer triggering bug #5343 on lower power arm-linux platforms, because of the blocking TCPServer#accept call. 

I believe there is also an underlying design flaw: the main thread (@tcpServerThread)  is blocked in the TCPServer#accept call, so if no further connections are attempted after #shutdown() is called, the main thread remains blocked and will hang until it is forced into the ensure clause by the destruction of the GServer object by GC

This proposed patch to GServer seems to tackle the first issue, and also effectively makes the TCPServer#accept nonblocking by using a Timeout block to ensure that the main thread periodically (every 0.1s) has the chance to shut down gracefully if no further connections are forthcoming. 

It also adds a GServer#shutdown! method which will block until the GServer has gracefully shut down

59,60c59,62
< #   server.shutdown
< #   
---
> #   server.shutdown   #will not wait for the server thread to quit
> #   server.shutdown!  #blocks until server thread has quit
> #
> #
122c124,131
< 
---
>   
>   def shutdown!
>     shutdown
>      while !stopped?
>       sleep 0.01
>     end
>   end
>   
189c198
<     @@servicesMutex.synchronize  {
---
>     @@servicesMutex.synchronize do
197,198c206,208
<     }
<     @tcpServerThread = Thread.new {
---
>     end
>     
>     @tcpServerThread = Thread.new do
202c212
<           @connectionsMutex.synchronize  {
---
>           @connectionsMutex.synchronize do
206,217c216,240
<           }
<           client = @tcpServer.accept
<           @connections << Thread.new(client)  { |myClient|
<             begin
<               myPort = myClient.peeraddr[1]
<               serve(myClient) if !@audit or connecting(myClient)
<             rescue => detail
<               error(detail) if @debug
<             ensure
<               begin
<                 myClient.close
<               rescue
---
>           end
>           
>           
>           begin
>             Timeout::timeout(0.1) do 
>               client = @tcpServer.accept
>          
>               @connections << Thread.new(client) do |myClient|
>                 begin
>                   myPort = myClient.peeraddr[1]
>                   serve(myClient) if !@audit or connecting(myClient)
>                 rescue => detail
>                   error(detail) if @debug
>                 ensure
>                   begin
>                     myClient.close
>                     sleep 1
>                   rescue
>                   end
>                   @connectionsMutex.synchronize do
>                     @connections.delete(Thread.current)
>                     @connectionsCV.signal
>                   end
>                   disconnecting(myPort) if @audit
>                 end
219,223d241
<               @connectionsMutex.synchronize {
<                 @connections.delete(Thread.current)
<                 @connectionsCV.signal
<               }
<               disconnecting(myPort) if @audit
225c243,245
<           }
---
>          rescue Timeout::Error
>          end
> 
226a247
>         
235c256
<           @connectionsMutex.synchronize  {
---
>           @connectionsMutex.synchronize do
239c260
<           }
---
>           end
244c265
<         @@servicesMutex.synchronize  {
---
>         @@servicesMutex.synchronize do
246c267
<         }
---
>         end
249c270
<     }
---
>     end




-- 
http://bugs.ruby-lang.org/

In This Thread

Prev Next