diff options
author | Ben Gamari <ben@smart-cactus.org> | 2022-01-13 13:46:36 -0500 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2022-01-18 16:14:01 -0500 |
commit | 5a6efd218734dbb5c1350531680cd3f4177690f1 (patch) | |
tree | 6a989bc08406afba34acb3657edb49981420012c /libraries/ghc-heap | |
parent | 2d205154d3fd565c7f88e07c4c307f48c5ade902 (diff) | |
download | haskell-5a6efd218734dbb5c1350531680cd3f4177690f1.tar.gz |
rts/winio: Fix #18382
Here we refactor WinIO's IO completion scheme, squashing a memory leak
and fixing #18382.
To fix #18382 we drop the special thread status introduced for IoPort
blocking, BlockedOnIoCompletion, as well as drop the non-threaded RTS's
special dead-lock detection logic (which is redundant to the GC's
deadlock detection logic), as proposed in #20947.
Previously WinIO relied on foreign import ccall "wrapper" to create an
adjustor thunk which can be attached to the OVERLAPPED structure passed
to the operating system. It would then use foreign import ccall
"dynamic" to back out the original continuation from the adjustor. This
roundtrip is significantly more expensive than the alternative, using a
StablePtr. Furthermore, the implementation let the adjustor leak,
meaning that every IO request would leak a page of memory.
Fixes T18382.
Diffstat (limited to 'libraries/ghc-heap')
3 files changed, 2 insertions, 3 deletions
diff --git a/libraries/ghc-heap/GHC/Exts/Heap/Closures.hs b/libraries/ghc-heap/GHC/Exts/Heap/Closures.hs index e15ae7008b..075e2a5b17 100644 --- a/libraries/ghc-heap/GHC/Exts/Heap/Closures.hs +++ b/libraries/ghc-heap/GHC/Exts/Heap/Closures.hs @@ -387,7 +387,6 @@ data WhyBlocked | BlockedOnCCall_Interruptible | BlockedOnMsgThrowTo | ThreadMigrating - | BlockedOnIOCompletion | WhyBlockedUnknownValue Word16 -- ^ Please report this as a bug deriving (Eq, Show, Generic, Ord) diff --git a/libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingDisabled.hsc b/libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingDisabled.hsc index 69c88db57d..48f99d2fcb 100644 --- a/libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingDisabled.hsc +++ b/libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingDisabled.hsc @@ -77,7 +77,7 @@ parseWhyBlocked w = case w of (#const BlockedOnCCall_Interruptible) -> BlockedOnCCall_Interruptible (#const BlockedOnMsgThrowTo) -> BlockedOnMsgThrowTo (#const ThreadMigrating) -> ThreadMigrating -#if __GLASGOW_HASKELL__ >= 811 +#if __GLASGOW_HASKELL__ >= 811 && __GLASGOW_HASKELL__ < 903 (#const BlockedOnIOCompletion) -> BlockedOnIOCompletion #endif _ -> WhyBlockedUnknownValue w diff --git a/libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc b/libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc index 17bf3c8334..e9d106d46a 100644 --- a/libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc +++ b/libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc @@ -77,7 +77,7 @@ parseWhyBlocked w = case w of (#const BlockedOnCCall_Interruptible) -> BlockedOnCCall_Interruptible (#const BlockedOnMsgThrowTo) -> BlockedOnMsgThrowTo (#const ThreadMigrating) -> ThreadMigrating -#if __GLASGOW_HASKELL__ >= 811 +#if __GLASGOW_HASKELL__ >= 811 && __GLASGOW_HASKELL__ < 903 (#const BlockedOnIOCompletion) -> BlockedOnIOCompletion #endif _ -> WhyBlockedUnknownValue w |