aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/beam_load.c
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2017-11-27 12:41:07 +0100
committerGitHub <[email protected]>2017-11-27 12:41:07 +0100
commit0c79be5d1e16308c50656cd7add5502833fba81d (patch)
treea10c4d468c3d6af3613b7b3d7d4ae8932976f996 /erts/emulator/beam/beam_load.c
parenteb2da85bf1f29000cd3c1b2f6dfbfcb5d6aec016 (diff)
parent3105c314beff5c9b226d8e863d32c4329706353c (diff)
downloadotp-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.c35
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);
}