Ben Gamari pushed to branch wip/T26053 at Glasgow Haskell Compiler / GHC
Commits:
-
18790528
by Ben Gamari at 2025-07-16T13:33:20-04:00
-
5cc0060c
by Ben Gamari at 2025-07-16T13:39:31-04:00
2 changed files:
Changes:
| ... | ... | @@ -619,7 +619,7 @@ inline void updateRemembSetPushThunk(Capability *cap, StgThunk *thunk) |
| 619 | 619 | {
|
| 620 | 620 | const StgInfoTable *info;
|
| 621 | 621 | do {
|
| 622 | - info = *(StgInfoTable* volatile*) &thunk->header.info;
|
|
| 622 | + info = get_itbl((StgClosure*) thunk);
|
|
| 623 | 623 | } while (info == &stg_WHITEHOLE_info);
|
| 624 | 624 | |
| 625 | 625 | const StgThunkInfoTable *thunk_info = THUNK_INFO_PTR_TO_STRUCT(info);
|
| ... | ... | @@ -1343,7 +1343,7 @@ mark_closure (MarkQueue *queue, const StgClosure *p0, StgClosure **origin) |
| 1343 | 1343 | goto done;
|
| 1344 | 1344 | |
| 1345 | 1345 | case WHITEHOLE:
|
| 1346 | - while (*(StgInfoTable* volatile*) &p->header.info == &stg_WHITEHOLE_info)
|
|
| 1346 | + while (get_itbl(p) == &stg_WHITEHOLE_info)
|
|
| 1347 | 1347 | #if defined(PARALLEL_GC)
|
| 1348 | 1348 | busy_wait_nop()
|
| 1349 | 1349 | #endif
|
| ... | ... | @@ -1714,7 +1714,7 @@ mark_closure (MarkQueue *queue, const StgClosure *p0, StgClosure **origin) |
| 1714 | 1714 | break;
|
| 1715 | 1715 | |
| 1716 | 1716 | case WHITEHOLE:
|
| 1717 | - while (*(StgInfoTable* volatile*) &p->header.info == &stg_WHITEHOLE_info);
|
|
| 1717 | + while (get_itbl(p) == &stg_WHITEHOLE_info);
|
|
| 1718 | 1718 | goto try_again;
|
| 1719 | 1719 | |
| 1720 | 1720 | case COMPACT_NFDATA:
|
| ... | ... | @@ -1276,6 +1276,7 @@ scavenge_one(StgPtr p) |
| 1276 | 1276 | bool no_luck;
|
| 1277 | 1277 | bool saved_eager_promotion;
|
| 1278 | 1278 | |
| 1279 | +try_again:
|
|
| 1279 | 1280 | saved_eager_promotion = gct->eager_promotion;
|
| 1280 | 1281 | |
| 1281 | 1282 | ASSERT(LOOKS_LIKE_CLOSURE_PTR(p));
|
| ... | ... | @@ -1617,6 +1618,13 @@ scavenge_one(StgPtr p) |
| 1617 | 1618 | scavenge_continuation((StgContinuation *)p);
|
| 1618 | 1619 | break;
|
| 1619 | 1620 | |
| 1621 | + case WHITEHOLE:
|
|
| 1622 | + // This may happen when the nonmoving GC is in use via two paths:
|
|
| 1623 | + // 1. when an MVAR is being marked concurrently
|
|
| 1624 | + // 2. when the object belongs to a chain of selectors being short-cutted.
|
|
| 1625 | + while (get_itbl((StgClosure*) p) == &stg_WHITEHOLE_info);
|
|
| 1626 | + goto try_again;
|
|
| 1627 | + |
|
| 1620 | 1628 | default:
|
| 1621 | 1629 | barf("scavenge_one: strange object %d", (int)(info->type));
|
| 1622 | 1630 | }
|