diff options
author | Björn-Egil Dahlberg <[email protected]> | 2016-04-22 12:22:51 +0200 |
---|---|---|
committer | Björn-Egil Dahlberg <[email protected]> | 2016-04-22 12:22:51 +0200 |
commit | 7f5c1b2084b389cdd13dd9f98adfeaf2c7d00fdc (patch) | |
tree | 73c619b61bb1786162779008867c1809205a2561 | |
parent | 2b0ecf4f702f720ea0861f94a833bd11b22c34d5 (diff) | |
parent | ee1cd28701589cd20f240941957f9a2fb7aadd3a (diff) | |
download | otp-7f5c1b2084b389cdd13dd9f98adfeaf2c7d00fdc.tar.gz otp-7f5c1b2084b389cdd13dd9f98adfeaf2c7d00fdc.tar.bz2 otp-7f5c1b2084b389cdd13dd9f98adfeaf2c7d00fdc.zip |
Merge branch 'egil/erts/fix-copy-share-heap'
* egil/erts/fix-copy-share-heap:
erts: Fix comments
erts: Fix copy share with onheap messages
-rw-r--r-- | erts/emulator/beam/beam_bif_load.c | 8 | ||||
-rw-r--r-- | erts/emulator/beam/erl_gc.c | 20 |
2 files changed, 23 insertions, 5 deletions
diff --git a/erts/emulator/beam/beam_bif_load.c b/erts/emulator/beam/beam_bif_load.c index b10250dc49..87508dcf5f 100644 --- a/erts/emulator/beam/beam_bif_load.c +++ b/erts/emulator/beam/beam_bif_load.c @@ -832,7 +832,7 @@ check_process_code(Process* rp, Module* modp, Uint flags, int *redsp) /* * Message queue can contains funs, but (at least currently) no - * constants. If we got references to this module from the message + * literals. If we got references to this module from the message * queue, a GC cannot remove these... */ @@ -853,7 +853,7 @@ check_process_code(Process* rp, Module* modp, Uint flags, int *redsp) for (; hfrag; hfrag = hfrag->next) { if (check_mod_funs(rp, &hfrag->off_heap, mod_start, mod_size)) return am_true; - /* Should not contain any constants... */ + /* Should not contain any literals... */ ASSERT(!any_heap_refs(&hfrag->mem[0], &hfrag->mem[hfrag->used_size], literals, @@ -908,7 +908,7 @@ check_process_code(Process* rp, Module* modp, Uint flags, int *redsp) #ifdef DEBUG /* * Message buffer fragments should not have any references - * to constants, and off heap lists should already have + * to literals, and off heap lists should already have * been moved into process off heap structure. */ for (msgp = rp->msg_frag; msgp; msgp = msgp->next) { @@ -945,7 +945,7 @@ check_process_code(Process* rp, Module* modp, Uint flags, int *redsp) need_gc &= ~done_gc; /* - * Try to get rid of constants by by garbage collecting. + * Try to get rid of literals by by garbage collecting. * Clear both fvalue and ftrace. */ diff --git a/erts/emulator/beam/erl_gc.c b/erts/emulator/beam/erl_gc.c index f33ade27f3..4698458521 100644 --- a/erts/emulator/beam/erl_gc.c +++ b/erts/emulator/beam/erl_gc.c @@ -2053,8 +2053,26 @@ copy_one_frag(Eterm** hpp, ErlOffHeap* off_heap, *hp++ = val; break; case TAG_PRIMARY_LIST: +#ifdef SHCOPY_SEND + if (erts_is_literal(val,list_val(val))) { + *hp++ = val; + } else { + *hp++ = offset_ptr(val, offs); + } +#else + *hp++ = offset_ptr(val, offs); +#endif + break; case TAG_PRIMARY_BOXED: - *hp++ = offset_ptr(val, offs); +#ifdef SHCOPY_SEND + if (erts_is_literal(val,boxed_val(val))) { + *hp++ = val; + } else { + *hp++ = offset_ptr(val, offs); + } +#else + *hp++ = offset_ptr(val, offs); +#endif break; case TAG_PRIMARY_HEADER: *hp++ = val; |