diff options
author | Björn Gustavsson <[email protected]> | 2017-11-27 12:41:07 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2017-11-27 12:41:07 +0100 |
commit | 0c79be5d1e16308c50656cd7add5502833fba81d (patch) | |
tree | a10c4d468c3d6af3613b7b3d7d4ae8932976f996 /erts/emulator/beam/beam_load.c | |
parent | eb2da85bf1f29000cd3c1b2f6dfbfcb5d6aec016 (diff) | |
parent | 3105c314beff5c9b226d8e863d32c4329706353c (diff) | |
download | otp-0c79be5d1e16308c50656cd7add5502833fba81d.tar.gz otp-0c79be5d1e16308c50656cd7add5502833fba81d.tar.bz2 otp-0c79be5d1e16308c50656cd7add5502833fba81d.zip |
Merge pull request #1644 from bjorng/bjorn/erts/fix-literal-gc/ERL-508
Fix purging of modules with "fake literals"
OTP-14791
Diffstat (limited to 'erts/emulator/beam/beam_load.c')
-rw-r--r-- | erts/emulator/beam/beam_load.c | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/erts/emulator/beam/beam_load.c b/erts/emulator/beam/beam_load.c index 23258dbe9c..adf8779f11 100644 --- a/erts/emulator/beam/beam_load.c +++ b/erts/emulator/beam/beam_load.c @@ -5665,13 +5665,36 @@ erts_release_literal_area(ErtsLiteralArea* literal_area) return; oh = literal_area->off_heap; - + while (oh) { - Binary* bptr; - ASSERT(thing_subtag(oh->thing_word) == REFC_BINARY_SUBTAG); - bptr = ((ProcBin*)oh)->val; - erts_bin_release(bptr); - oh = oh->next; + switch (thing_subtag(oh->thing_word)) { + case REFC_BINARY_SUBTAG: + { + Binary* bptr = ((ProcBin*)oh)->val; + erts_bin_release(bptr); + break; + } + case FUN_SUBTAG: + { + ErlFunEntry* fe = ((ErlFunThing*)oh)->fe; + if (erts_smp_refc_dectest(&fe->refc, 0) == 0) { + erts_erase_fun_entry(fe); + } + break; + } + case REF_SUBTAG: + { + ErtsMagicBinary *bptr; + ASSERT(is_magic_ref_thing(oh)); + bptr = ((ErtsMRefThing *) oh)->mb; + erts_bin_release((Binary *) bptr); + break; + } + default: + ASSERT(is_external_header(oh->thing_word)); + erts_deref_node_entry(((ExternalThing*)oh)->node); + } + oh = oh->next; } erts_free(ERTS_ALC_T_LITERAL, literal_area); } |