|
|
# GHC Commentary: Garbage Collecting CAFs
|
|
|
|
|
|
|
|
|
Files: [rts/sm/GC.c](https://gitlab.haskell.org/ghc/ghc/tree/master/ghc/rts/sm/GC.c), function `scavenge_fun_srt`/`scavenge_thunk_srt` in [rts/sm/Scav.c](/trac/ghc/browser/ghc/rts/sm/Scav.c)
|
|
|
Files: [rts/sm/GC.c](https://gitlab.haskell.org/ghc/ghc/tree/master/ghc/rts/sm/GC.c), function `scavenge_fun_srt`/`scavenge_thunk_srt` in [rts/sm/Scav.c](https://gitlab.haskell.org/ghc/ghc/blob/master/rts/sm/Scav.c)
|
|
|
|
|
|
|
|
|
A **static closure** is a heap object that is allocated statically, once and for all, at compile time. It lives at a fixed address.
|
... | ... | @@ -86,7 +86,7 @@ For all the details on how SRTs work, see `Note [SRTs]` in [compiler/cmm/CmmBuil |
|
|
## Evacuating Static Objects
|
|
|
|
|
|
|
|
|
Files: [rts/sm/GCThread.h](https://gitlab.haskell.org/ghc/ghc/tree/master/ghc/rts/sm/GCThread.h), [rts/sm/Evac.c](/trac/ghc/browser/ghc/rts/sm/Evac.c), [rts/sm/GC.c](/trac/ghc/browser/ghc/rts/sm/GC.c)
|
|
|
Files: [rts/sm/GCThread.h](https://gitlab.haskell.org/ghc/ghc/tree/master/ghc/rts/sm/GCThread.h), [rts/sm/Evac.c](https://gitlab.haskell.org/ghc/ghc/blob/master/rts/sm/Evac.c), [rts/sm/GC.c](https://gitlab.haskell.org/ghc/ghc/blob/master/rts/sm/GC.c)
|
|
|
|
|
|
|
|
|
While scavenging objects, we also process (aka "evacuate") any static objects that need to be kept alive. When a GC thread discovers a live static object, it places it on its `static_objects`
|
... | ... | |