summaryrefslogtreecommitdiff
path: root/compiler/codeGen
diff options
context:
space:
mode:
authorSimon Peyton Jones <simonpj@microsoft.com>2015-07-08 23:19:42 +0100
committerSimon Peyton Jones <simonpj@microsoft.com>2015-07-08 23:19:42 +0100
commit85b14a777917edd2d6b7d4b3584496cab28bada6 (patch)
tree3889ee2d8f350bf29b9e53fd0da7798deea8533b /compiler/codeGen
parentf3bfa3bf31442d57190e1961b5fe9e0b4b457a1c (diff)
downloadhaskell-85b14a777917edd2d6b7d4b3584496cab28bada6.tar.gz
Comments only
Diffstat (limited to 'compiler/codeGen')
-rw-r--r--compiler/codeGen/StgCmmClosure.hs58
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