[GHC] #10296: Segfaults when using dynamic wrappers and concurrency
GHC
ghc-devs at haskell.org
Tue Mar 22 02:20:29 UTC 2016
#10296: Segfaults when using dynamic wrappers and concurrency
-------------------------------------+-------------------------------------
Reporter: bitonic | Owner: jme
Type: bug | Status: patch
Priority: high | Milestone: 8.2.1
Component: Runtime System | Version: 7.11
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: Runtime crash | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s): Phab:D2031
Wiki Page: |
-------------------------------------+-------------------------------------
Changes (by jme):
* status: new => patch
* differential: => Phab:D2031
Comment:
In the example above, each call to `wrap` allocates a new stable
pointer, which is then dereferenced when `call_fun` calls back into
Haskell. Since the stable pointers are not freed, the table holding
them is periodically enlarged (using `realloc()`). When one of these
reallocations moves the table just as it is being read by another thread
(to dereference a stable pointer), a segfault can occur.
The fix provided by Phab:D2031 is rather simplistic: it eliminates the
freeing of the old table during reallocation, thus ensuring the table
can continue to be safely read. While this approach allows dereferences
to remain lock-free, it clearly wastes space (roughly twice the memory
is now required to hold the stable pointer table). If this is an issue,
it should be relatively straightforward to eliminate the extra memory
consumption without adversely affecting performance (albeit with some
added complexity). Let me know if such an implementation would be
preferable.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10296#comment:7>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list