diff options
Diffstat (limited to 'rts/sm/GC.c')
-rw-r--r-- | rts/sm/GC.c | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/rts/sm/GC.c b/rts/sm/GC.c index a5aa7e1f4e..0dc92a29a0 100644 --- a/rts/sm/GC.c +++ b/rts/sm/GC.c @@ -97,6 +97,13 @@ * See also: Note [STATIC_LINK fields] in Storage.h. */ +/* Hot GC globals + * ~~~~~~~~~~~~~~ + * The globals below are quite hot during GC but read-only, initialized during + * the beginning of collection. It is important that they reside in the same + * cache-line to minimize unnecessary cache misses. + */ + /* N is the oldest generation being collected, where the generations * are numbered starting at 0. A major GC (indicated by the major_gc * flag) is when we're collecting all generations. We only attempt to @@ -105,6 +112,7 @@ uint32_t N; bool major_gc; bool deadlock_detect_gc; +bool unload_mark_needed; /* Data used for allocation area sizing. */ @@ -314,6 +322,12 @@ GarbageCollect (uint32_t collect_gen, static_flag == STATIC_FLAG_A ? STATIC_FLAG_B : STATIC_FLAG_A; } + if (major_gc) { + unload_mark_needed = prepareUnloadCheck(); + } else { + unload_mark_needed = false; + } + #if defined(THREADED_RTS) work_stealing = RtsFlags.ParFlags.parGcLoadBalancingEnabled && N >= RtsFlags.ParFlags.parGcLoadBalancingGen; @@ -831,9 +845,12 @@ GarbageCollect (uint32_t collect_gen, resetNurseries(); - // mark the garbage collected CAFs as dead #if defined(DEBUG) - if (major_gc && !RtsFlags.GcFlags.useNonmoving) { gcCAFs(); } + // Mark the garbage collected CAFs as dead. Done in `nonmovingGcCafs()` when + // non-moving GC is enabled. + if (major_gc && !RtsFlags.GcFlags.useNonmoving) { + gcCAFs(); + } #endif // Update the stable name hash table @@ -844,9 +861,14 @@ GarbageCollect (uint32_t collect_gen, // hs_free_stable_ptr(), both of which access the StablePtr table. stablePtrUnlock(); - // Must be after stablePtrUnlock(), because it might free stable ptrs. - if (major_gc) { - checkUnload (gct->scavenged_static_objects); + // Unload dynamically-loaded object code after a major GC. + // See Note [Object unloading] in CheckUnload.c for details. + // + // TODO: Similar to `nonmovingGcCafs` non-moving GC should have its own + // collector for these objects, but that's currently not implemented, so we + // simply don't unload object code when non-moving GC is enabled. + if (major_gc && !RtsFlags.GcFlags.useNonmoving) { + checkUnload(); } #if defined(PROFILING) |