copyPart() was still using the old WHITEHOLE mechanism for locking the
closure. I don't think this fixes any actual bugs, but it removes a
gratuitous difference between two functions that should look similar.
#if defined(PARALLEL_GC)
{
const StgInfoTable *new_info;
#if defined(PARALLEL_GC)
{
const StgInfoTable *new_info;
- new_info = (const StgInfoTable *)cas((StgPtr)&src->header.info, (W_)info, MK_FORWARDING_PTR(to));
+ new_info = (const StgInfoTable *)cas((StgPtr)&src->header.info,
+ (W_)info, MK_FORWARDING_PTR(to));
if (new_info != info) {
return evacuate(p); // does the failed_to_evac stuff
} else {
if (new_info != info) {
return evacuate(p); // does the failed_to_evac stuff
} else {
* used to optimise evacuation of BLACKHOLEs.
*/
static rtsBool
* used to optimise evacuation of BLACKHOLEs.
*/
static rtsBool
-copyPart(StgClosure **p, StgClosure *src, nat size_to_reserve, nat size_to_copy, step *stp)
+copyPart(StgClosure **p, const StgInfoTable *info, StgClosure *src,
+ nat size_to_reserve, nat size_to_copy, step *stp)
{
StgPtr to, from;
nat i;
{
StgPtr to, from;
nat i;
-#if defined(PARALLEL_GC)
-spin:
- info = xchg((StgPtr)&src->header.info, (W_)&stg_WHITEHOLE_info);
- if (info == (W_)&stg_WHITEHOLE_info) {
-#ifdef PROF_SPIN
- whitehole_spin++;
-#endif
- goto spin;
- }
- if (IS_FORWARDING_PTR(info)) {
- src->header.info = (const StgInfoTable *)info;
- evacuate(p); // does the failed_to_evac stuff
- return rtsFalse;
- }
-#else
- info = (W_)src->header.info;
-#endif
-
to = alloc_for_copy(size_to_reserve, stp);
to = alloc_for_copy(size_to_reserve, stp);
TICK_GC_WORDS_COPIED(size_to_copy);
from = (StgPtr)src;
TICK_GC_WORDS_COPIED(size_to_copy);
from = (StgPtr)src;
for (i = 1; i < size_to_copy; i++) { // unroll for small i
to[i] = from[i];
}
#if defined(PARALLEL_GC)
for (i = 1; i < size_to_copy; i++) { // unroll for small i
to[i] = from[i];
}
#if defined(PARALLEL_GC)
+ {
+ const StgInfoTable *new_info;
+ new_info = (const StgInfoTable *)cas((StgPtr)&src->header.info,
+ (W_)info, MK_FORWARDING_PTR(to));
+ if (new_info != info) {
+ evacuate(p); // does the failed_to_evac stuff
+ return rtsFalse;
+ } else {
+ *p = (StgClosure*)to;
+ }
+ }
+#else
+ src->header.info = (const StgInfoTable *)MK_FORWARDING_PTR(to);
+ *p = (StgClosure*)to;
- src->header.info = (const StgInfoTable*)MK_FORWARDING_PTR(to);
-
#ifdef PROFILING
// We store the size of the just evacuated object in the LDV word so that
// the profiler can guess the position of the next object later.
#ifdef PROFILING
// We store the size of the just evacuated object in the LDV word so that
// the profiler can guess the position of the next object later.
case CAF_BLACKHOLE:
case BLACKHOLE:
case CAF_BLACKHOLE:
case BLACKHOLE:
- copyPart(p,q,BLACKHOLE_sizeW(),sizeofW(StgHeader),stp);
+ copyPart(p,info,q,BLACKHOLE_sizeW(),sizeofW(StgHeader),stp);
return;
case THUNK_SELECTOR:
return;
case THUNK_SELECTOR:
StgPtr r, s;
rtsBool mine;
StgPtr r, s;
rtsBool mine;
- mine = copyPart(p,(StgClosure *)tso, tso_sizeW(tso),
+ mine = copyPart(p,info,(StgClosure *)tso, tso_sizeW(tso),
sizeofW(StgTSO), stp);
if (mine) {
new_tso = (StgTSO *)*p;
sizeofW(StgTSO), stp);
if (mine) {
new_tso = (StgTSO *)*p;