
#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): So I implemented the fix, and in doing so discovered that it broke a test (`conc031`), which is a test for the old behaviour, see #551. Let me be clear about what's going on. These two GC features: 1. A thread can be blocked on a finalizer without being considered deadlocked 2. A weak pointer will not be finalized if a deadlocked thread references it are mutually exclusive. We currently have (1) (because the lack of it was reported as a bug in #551), and this ticket complains about the lack of (2). But implementing (2) reverses (1). Here's another complaint about the lack of (2): http://www.haskell.org/pipermail/haskell-cafe/2010-August/081953.html (the whole thread is interesting) The evidence so far is that the lack of (2) is more surprising than the lack of (1), so I'm slightly tempted to go with (2). There's also a workaround: `mkStablePtr` can be used to keep anything alive (and prevents threads from getting the deadlock exception), but you have to manually `freeStablePtr` later. Finalizers are a pain :) -- Ticket URL: http://hackage.haskell.org/trac/ghc/ticket/7970#comment:4 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler