diff options
author | Sverker Eriksson <[email protected]> | 2013-04-05 18:52:20 +0200 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2013-04-11 12:22:35 +0200 |
commit | 4ac91e4fc710a2fb5a3e30ac7025e52f466344cb (patch) | |
tree | b678a8daf22b7d0650eb3cf56cc72e92c492dbec /erts | |
parent | 31bc414dc9639ccf94f9011ed3240c05c6a7f0cb (diff) | |
download | otp-4ac91e4fc710a2fb5a3e30ac7025e52f466344cb.tar.gz otp-4ac91e4fc710a2fb5a3e30ac7025e52f466344cb.tar.bz2 otp-4ac91e4fc710a2fb5a3e30ac7025e52f466344cb.zip |
erts: Adjust sizes for fix allocator
Diffstat (limited to 'erts')
-rw-r--r-- | erts/emulator/beam/erl_alloc.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/erts/emulator/beam/erl_alloc.c b/erts/emulator/beam/erl_alloc.c index d53f23b0e3..f0cc52e30f 100644 --- a/erts/emulator/beam/erl_alloc.c +++ b/erts/emulator/beam/erl_alloc.c @@ -495,6 +495,38 @@ refuse_af_strategy(struct au_init *init) static void hdbg_init(void); #endif +static void adjust_fix_alloc_sizes(UWord extra_block_size) +{ + + if (extra_block_size && erts_allctrs_info[ERTS_ALC_A_FIXED_SIZE].enabled) { + int j; + +#ifdef ERTS_SMP + if (erts_allctrs_info[ERTS_ALC_A_FIXED_SIZE].thr_spec) { + int i; + ErtsAllocatorThrSpec_t* tspec; + + tspec = &erts_allctr_thr_spec[ERTS_ALC_A_FIXED_SIZE]; + ASSERT(tspec->enabled); + + for (i=0; i < tspec->size; i++) { + Allctr_t* allctr = tspec->allctr[i]; + for (j=0; j < ERTS_ALC_NO_FIXED_SIZES; ++j) { + allctr->fix[j].type_size += extra_block_size; + } + } + } + else +#endif + { + Allctr_t* allctr = erts_allctrs_info[ERTS_ALC_A_FIXED_SIZE].extra; + for (j=0; j < ERTS_ALC_NO_FIXED_SIZES; ++j) { + allctr->fix[j].type_size += extra_block_size; + } + } + } +} + void erts_alloc_init(int *argc, char **argv, ErtsAllocInitOpts *eaiop) { @@ -768,7 +800,7 @@ erts_alloc_init(int *argc, char **argv, ErtsAllocInitOpts *eaiop) #ifdef DEBUG extra_block_size += install_debug_functions(); #endif - + adjust_fix_alloc_sizes(extra_block_size); } void |