aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/beam_load.c
diff options
context:
space:
mode:
authorJohn Högberg <[email protected]>2017-11-27 12:51:25 +0100
committerJohn Högberg <[email protected]>2017-11-27 12:51:25 +0100
commit4b1e7bca931198e010b33773f57e6e84b92ae007 (patch)
tree19ffdfed6fd044157e065baafe073d69c2e2a581 /erts/emulator/beam/beam_load.c
parent5b0ba5e5f09d65cb15d00f8e089f5d98c5734d1a (diff)
parent0293c3bf9276bea3fc4ab31b2e697dd1be0858ea (diff)
downloadotp-4b1e7bca931198e010b33773f57e6e84b92ae007.tar.gz
otp-4b1e7bca931198e010b33773f57e6e84b92ae007.tar.bz2
otp-4b1e7bca931198e010b33773f57e6e84b92ae007.zip
Merge branch 'maint'
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 4fcfea527c..82a8ddd78c 100644
--- a/erts/emulator/beam/beam_load.c
+++ b/erts/emulator/beam/beam_load.c
@@ -6028,13 +6028,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);
}