diff options
author | Björn Gustavsson <[email protected]> | 2011-08-23 05:41:28 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2011-11-17 10:09:51 +0100 |
commit | 379064981ecccc8c099623cdb93894d02a6bcdc1 (patch) | |
tree | 4e93169a9e15729084e71a3983acf962df7679f5 /erts/emulator/beam/global.h | |
parent | 6107d4123f23a48d77b1852df88cb0fee3a23539 (diff) | |
download | otp-379064981ecccc8c099623cdb93894d02a6bcdc1.tar.gz otp-379064981ecccc8c099623cdb93894d02a6bcdc1.tar.bz2 otp-379064981ecccc8c099623cdb93894d02a6bcdc1.zip |
Allow refc binaries in literal pools
To simplify the implementation of literal pools (constant pools)
for the R12 release, a shortcut was taken regarding binaries --
all binaries would be stored as heap binaries regardless of size.
To allow a module containing literals to be unloaded, literal
terms are copied when sent to another process. That means that
huge literal binaries will also be copied if they are sent to
another process, which could be surprising.
Another problem is that the arity field in the header for the heap
object may not be wide enough to handle big binaries.
Therefore, bite the bullet and allow refc binaries to be stored
in literal pools. In short, the following need to be changed:
* Each loaded module needs a MSO list, linking all refc binaries
in the literal pool.
* When check_process_code/2 copies literals to a process heap,
it must link each referenced binary into the MSO list for the
process and increment the reference counter for the binary.
* purge_module/1 must decrement the reference counter for each
refc binary in the literal pool.
Diffstat (limited to 'erts/emulator/beam/global.h')
-rw-r--r-- | erts/emulator/beam/global.h | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h index 9f19172e08..b247576f1c 100644 --- a/erts/emulator/beam/global.h +++ b/erts/emulator/beam/global.h @@ -1126,7 +1126,9 @@ void erts_init_gc(void); int erts_garbage_collect(Process*, int, Eterm*, int); void erts_garbage_collect_hibernate(Process* p); Eterm erts_gc_after_bif_call(Process* p, Eterm result, Eterm* regs, Uint arity); -void erts_garbage_collect_literals(Process* p, Eterm* literals, Uint lit_size); +void erts_garbage_collect_literals(Process* p, Eterm* literals, + Uint lit_size, + struct erl_off_heap_header* oh); Uint erts_next_heap_size(Uint, Uint); Eterm erts_heap_sizes(Process* p); |