diff options
| author | Simon Peyton Jones <simonpj@microsoft.com> | 2015-07-08 23:19:42 +0100 |
|---|---|---|
| committer | Simon Peyton Jones <simonpj@microsoft.com> | 2015-07-08 23:19:42 +0100 |
| commit | 85b14a777917edd2d6b7d4b3584496cab28bada6 (patch) | |
| tree | 3889ee2d8f350bf29b9e53fd0da7798deea8533b /compiler/codeGen | |
| parent | f3bfa3bf31442d57190e1961b5fe9e0b4b457a1c (diff) | |
| download | haskell-85b14a777917edd2d6b7d4b3584496cab28bada6.tar.gz | |
Comments only
Diffstat (limited to 'compiler/codeGen')
| -rw-r--r-- | compiler/codeGen/StgCmmClosure.hs | 58 |
1 files changed, 32 insertions, 26 deletions
diff --git a/compiler/codeGen/StgCmmClosure.hs b/compiler/codeGen/StgCmmClosure.hs index f8741b7fb6..30671cab44 100644 --- a/compiler/codeGen/StgCmmClosure.hs +++ b/compiler/codeGen/StgCmmClosure.hs @@ -749,17 +749,12 @@ mkClosureInfo dflags is_static id lf_info tot_wds ptr_wds val_descr -- need. We have a patch for this from Andy Cheadle, but not -- incorporated yet. --SDM [6/2004] -- --- -- Previously, eager blackholing was enabled when ticky-ticky -- was on. But it didn't work, and it wasn't strictly necessary -- to bring back minimal ticky-ticky, so now EAGER_BLACKHOLING -- is unconditionally disabled. -- krc 1/2007 -- --- -- Static closures are never themselves black-holed. --- --- We also never black-hole non-updatable thunks. --- See Note [Black-holing non-updatable thunks] blackHoleOnEntry :: ClosureInfo -> Bool blackHoleOnEntry cl_info @@ -768,28 +763,39 @@ blackHoleOnEntry cl_info | otherwise = case closureLFInfo cl_info of - LFReEntrant _ _ _ _ -> False - LFLetNoEscape -> False - LFThunk _ _no_fvs updatable _ _ -> updatable - _other -> panic "blackHoleOnEntry" -- Should never happen - -{- -Note [Black-holing non-updatable thunks] -========================================= - -We cannot black-hole non-updatable thunks otherwise we run into issues like -Trac #10414. A single-entry (non-updatable) thunk can actually be entered more -than once in a parallel program, if work is duplicated by two threads both -entering the same updatable thunk before the other has blackholed it. So, we -must not eagerly blackhole non-updatable thunks, or the second thread to enter -one will become blocked indefinitely. (They are not blackholed by lazy -blackholing either, since they have no associated update frame.) - -For instance, let's consider the following value (in pseudo-Core, example due to -Reid Barton), - + LFReEntrant _ _ _ _ -> False + LFLetNoEscape -> False + LFThunk _ _no_fvs upd _ _ -> upd -- See Note [Black-holing non-updatable thunks] + _other -> panic "blackHoleOnEntry" + +{- Note [Black-holing non-updatable thunks] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +We must not black-hole non-updatable (single-entry) thunks otherwise +we run into issues like Trac #10414. Specifically: + + * There is no reason to black-hole a non-updatable thunk: it should + not be competed for by multiple threads + + * It could, conceivably, cause a space leak if we don't black-hole + it, if there was a live but never-followed pointer pointing to it. + Let's hope that doesn't happen. + + * It is dangerous to black-hole a non-updatable thunk because + - is not updated (of course) + - hence, if it is black-holed and another thread tries to evalute + it, that thread will block forever + This actually happened in Trac #10414. So we do not black-hole + non-updatable thunks. + + * How could two threads evaluate the same non-updatable (single-entry) + thunk? See Reid Barton's example below. + + * Only eager blackholing could possibly black-hole a non-updatable + thunk, because lazy black-holing only affects thunks with an + update frame on the stack. + +Here is and example due to Reid Barton (Trac #10414): x = \u [] concat [[1], []] - with the following definitions, concat x = case x of |
