diff options
author | Björn-Egil Dahlberg <[email protected]> | 2015-03-30 09:11:57 +0200 |
---|---|---|
committer | Björn-Egil Dahlberg <[email protected]> | 2015-03-30 09:11:57 +0200 |
commit | aa13ab92a4bc99bffdb1576690d1b62be8d34e4a (patch) | |
tree | a1c1ffe5d6140b51abf66b663ffb197b143ef542 | |
parent | 346fb20cc0eb84a4ed9758d39ec41bea76ed6999 (diff) | |
parent | 9a36246ad24561619e182d488d4c8a6825011d34 (diff) | |
download | otp-aa13ab92a4bc99bffdb1576690d1b62be8d34e4a.tar.gz otp-aa13ab92a4bc99bffdb1576690d1b62be8d34e4a.tar.bz2 otp-aa13ab92a4bc99bffdb1576690d1b62be8d34e4a.zip |
Merge branch 'egil/fix-maps-new_map-instruction'
* egil/fix-maps-new_map-instruction:
erts: Eliminate potential heap fragments after Map creation
-rw-r--r-- | erts/emulator/beam/beam_emu.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c index 8fcdc72895..fdb84aae42 100644 --- a/erts/emulator/beam/beam_emu.c +++ b/erts/emulator/beam/beam_emu.c @@ -6573,6 +6573,7 @@ new_map(Process* p, Eterm* reg, BeamInstr* I) ptr = &Arg(4); if (n > 2*MAP_SMALL_MAP_LIMIT) { + Eterm res; if (HeapWordsLeft(p) < n) { erts_garbage_collect(p, n, reg, Arg(2)); } @@ -6589,7 +6590,15 @@ new_map(Process* p, Eterm* reg, BeamInstr* I) p->htop = mhp; factory.p = p; - return erts_hashmap_from_array(&factory, thp, n/2, 0); + res = erts_hashmap_from_array(&factory, thp, n/2, 0); + if (p->mbuf) { + Uint live = Arg(2); + reg[live] = res; + erts_garbage_collect(p, 0, reg, live+1); + res = reg[live]; + E = p->stop; + } + return res; } if (HeapWordsLeft(p) < need) { |