[GHC] #7970: Thread GC frees roots before thread actually finishes

GHC ghc-devs at haskell.org
Fri Jun 28 10:28:27 CEST 2013


#7970: Thread GC frees roots before thread actually finishes
---------------------------------+------------------------------------------
    Reporter:  joeyadams         |       Owner:  simonmar        
        Type:  bug               |      Status:  new             
    Priority:  high              |   Milestone:  7.8.1           
   Component:  Runtime System    |     Version:  7.6.3           
    Keywords:                    |          Os:  Unknown/Multiple
Architecture:  Unknown/Multiple  |     Failure:  Runtime crash   
  Difficulty:  Unknown           |    Testcase:                  
   Blockedby:                    |    Blocking:                  
     Related:  7170              |  
---------------------------------+------------------------------------------

Comment(by simonmar):

 > It only makes sense to call a thread "unreachable" if it will never run
 again.

 Which is the case now - at the point where the thread is unreachable, it
 will never run again.  So we send it an exception to tell it (at which
 point it runs again of course, but if it were not for the exception it
 would not run).

 The specific problem in this ticket is the interaction between threads and
 weak pointers.  Right now, it is the case that

  * a reference from the finalizer of a weak pointer to a thread makes the
 thread reachable, even if the key of the weak pointer is not reachable.

 This means that you can have a thread blocked waiting for a finalizer to
 run.  There's an alternative design, which would make the program in this
 ticket work:

  * a reference from a thread to a weak pointer makes the weak pointer
 reachable, even if the thread itself is not reachable.

 You can choose one of these, or neither, but not both.  The reason is that
 the GC must do these steps in some order:

  * decide which weak pointers are unreachable, and make their finalizers
 alive
  * decide which threads are unreachable, and then make them alive

 if we did both at the same time, you would get *neither* of the behaviours
 above.

 So I think what the example in this ticket argues for is switching the
 order.  I'm fine with that (I buy the argument) but it does potentially
 break the use case of having a thread blocked on a finalizer. I'm not sure
 whether anyone actually does that or not.

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/7970#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler



More information about the ghc-tickets mailing list