Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
jberryman
GHC
Commits
f7d332b4
Commit
f7d332b4
authored
Mar 19, 2010
by
Simon Marlow
Browse files
slight improvement to scavenging of update frames when a collision has occurred
parent
523ecf30
Changes
1
Hide whitespace changes
Inline
Side-by-side
rts/sm/Scav.c
View file @
f7d332b4
...
...
@@ -1575,11 +1575,13 @@ scavenge_stack(StgPtr p, StgPtr stack_end)
// threadPaused(). We could traverse the whole stack again
// before GC, but that seems like overkill.
//
// Scavenging this update frame as normal would be disastrous;
// the updatee would end up pointing to the value. So we turn
// the indirection into an IND_PERM, so that evacuate will
// copy the indirection into the old generation instead of
// discarding it.
// So, if the frame points to an indirection, it will get
// shorted out when we evacuate. If this happens, we have no
// closure to update any more. In the past we solved this by
// replacing the IND with an IND_PERM, but a better solution
// is to replace the update frame with a frame that no longer
// does the update and just uses the value already computed by
// the other thread, so that is what we now do.
//
// Note [upd-black-hole]
// One slight hiccup is that the THUNK_SELECTOR machinery can
...
...
@@ -1590,22 +1592,16 @@ scavenge_stack(StgPtr p, StgPtr stack_end)
// the updatee is never a THUNK_SELECTOR and we're ok.
// NB. this is a new invariant: blackholing is not optional.
{
nat
type
;
const
StgInfoTable
*
i
;
StgClosure
*
updatee
;
updatee
=
((
StgUpdateFrame
*
)
p
)
->
updatee
;
i
=
updatee
->
header
.
info
;
if
(
!
IS_FORWARDING_PTR
(
i
))
{
type
=
get_itbl
(
updatee
)
->
type
;
if
(
type
==
IND
)
{
updatee
->
header
.
info
=
&
stg_IND_PERM_info
;
}
else
if
(
type
==
IND_OLDGEN
)
{
updatee
->
header
.
info
=
&
stg_IND_OLDGEN_PERM_info
;
}
StgClosure
*
v
;
StgUpdateFrame
*
frame
=
(
StgUpdateFrame
*
)
p
;
evacuate
(
&
frame
->
updatee
);
v
=
frame
->
updatee
;
if
(
GET_CLOSURE_TAG
(
v
)
!=
0
||
(
get_itbl
(
v
)
->
type
!=
BLACKHOLE
&&
get_itbl
(
v
)
->
type
!=
CAF_BLACKHOLE
))
{
frame
->
header
.
info
=
(
const
StgInfoTable
*
)
&
stg_gc_unpt_r1_info
;
}
evacuate
(
&
((
StgUpdateFrame
*
)
p
)
->
updatee
);
ASSERT
(
GET_CLOSURE_TAG
(((
StgUpdateFrame
*
)
p
)
->
updatee
)
==
0
);
p
+=
sizeofW
(
StgUpdateFrame
);
continue
;
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment