diff --git a/Makefile.in b/Makefile.in index b19c14f9..c0929ce2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -127,6 +127,7 @@ C_SRCS := $(srcroot)src/jemalloc.c \ $(srcroot)src/mutex_pool.c \ $(srcroot)src/nstime.c \ $(srcroot)src/pa.c \ + $(srcroot)src/pa_extra.c \ $(srcroot)src/pages.c \ $(srcroot)src/prng.c \ $(srcroot)src/prof.c \ diff --git a/include/jemalloc/internal/pa.h b/include/jemalloc/internal/pa.h index f7abf1e9..9cf290c2 100644 --- a/include/jemalloc/internal/pa.h +++ b/include/jemalloc/internal/pa.h @@ -211,4 +211,22 @@ bool pa_maybe_decay_purge(tsdn_t *tsdn, pa_shard_t *shard, decay_t *decay, pa_shard_decay_stats_t *decay_stats, ecache_t *ecache, pa_decay_purge_setting_t decay_purge_setting); +/******************************************************************************/ +/* + * Various bits of "boring" functionality that are still part of this module, + * but that we relegate to pa_extra.c, to keep the core logic in pa.c as + * readable as possible. + */ + +/* + * These fork phases are synchronized with the arena fork phase numbering to + * make it easy to keep straight. That's why there's no prefork1. + */ +void pa_shard_prefork0(tsdn_t *tsdn, pa_shard_t *shard); +void pa_shard_prefork2(tsdn_t *tsdn, pa_shard_t *shard); +void pa_shard_prefork3(tsdn_t *tsdn, pa_shard_t *shard); +void pa_shard_prefork4(tsdn_t *tsdn, pa_shard_t *shard); +void pa_shard_postfork_parent(tsdn_t *tsdn, pa_shard_t *shard); +void pa_shard_postfork_child(tsdn_t *tsdn, pa_shard_t *shard); + #endif /* JEMALLOC_INTERNAL_PA_H */ diff --git a/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj b/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj index 156e4593..9f81e21d 100644 --- a/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj +++ b/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj @@ -68,6 +68,7 @@ + diff --git a/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj.filters b/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj.filters index 45557f65..15fe7f08 100644 --- a/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj.filters +++ b/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj.filters @@ -88,6 +88,9 @@ Source Files + + Source Files + Source Files diff --git a/msvc/projects/vc2017/jemalloc/jemalloc.vcxproj b/msvc/projects/vc2017/jemalloc/jemalloc.vcxproj index c5cfb95f..b5fccaed 100644 --- a/msvc/projects/vc2017/jemalloc/jemalloc.vcxproj +++ b/msvc/projects/vc2017/jemalloc/jemalloc.vcxproj @@ -68,6 +68,7 @@ + diff --git a/msvc/projects/vc2017/jemalloc/jemalloc.vcxproj.filters b/msvc/projects/vc2017/jemalloc/jemalloc.vcxproj.filters index 45557f65..15fe7f08 100644 --- a/msvc/projects/vc2017/jemalloc/jemalloc.vcxproj.filters +++ b/msvc/projects/vc2017/jemalloc/jemalloc.vcxproj.filters @@ -88,6 +88,9 @@ Source Files + + Source Files + Source Files diff --git a/src/arena.c b/src/arena.c index dfb4759b..dc8c26b6 100644 --- a/src/arena.c +++ b/src/arena.c @@ -1739,8 +1739,7 @@ arena_boot(sc_data_t *sc_data) { void arena_prefork0(tsdn_t *tsdn, arena_t *arena) { - malloc_mutex_prefork(tsdn, &arena->pa_shard.decay_dirty.mtx); - malloc_mutex_prefork(tsdn, &arena->pa_shard.decay_muzzy.mtx); + pa_shard_prefork0(tsdn, &arena->pa_shard); } void @@ -1752,19 +1751,17 @@ arena_prefork1(tsdn_t *tsdn, arena_t *arena) { void arena_prefork2(tsdn_t *tsdn, arena_t *arena) { - ecache_grow_prefork(tsdn, &arena->pa_shard.ecache_grow); + pa_shard_prefork2(tsdn, &arena->pa_shard); } void arena_prefork3(tsdn_t *tsdn, arena_t *arena) { - ecache_prefork(tsdn, &arena->pa_shard.ecache_dirty); - ecache_prefork(tsdn, &arena->pa_shard.ecache_muzzy); - ecache_prefork(tsdn, &arena->pa_shard.ecache_retained); + pa_shard_prefork3(tsdn, &arena->pa_shard); } void arena_prefork4(tsdn_t *tsdn, arena_t *arena) { - edata_cache_prefork(tsdn, &arena->pa_shard.edata_cache); + pa_shard_prefork4(tsdn, &arena->pa_shard); } void @@ -1798,13 +1795,7 @@ arena_postfork_parent(tsdn_t *tsdn, arena_t *arena) { } malloc_mutex_postfork_parent(tsdn, &arena->large_mtx); base_postfork_parent(tsdn, arena->base); - edata_cache_postfork_parent(tsdn, &arena->pa_shard.edata_cache); - ecache_postfork_parent(tsdn, &arena->pa_shard.ecache_dirty); - ecache_postfork_parent(tsdn, &arena->pa_shard.ecache_muzzy); - ecache_postfork_parent(tsdn, &arena->pa_shard.ecache_retained); - ecache_grow_postfork_parent(tsdn, &arena->pa_shard.ecache_grow); - malloc_mutex_postfork_parent(tsdn, &arena->pa_shard.decay_dirty.mtx); - malloc_mutex_postfork_parent(tsdn, &arena->pa_shard.decay_muzzy.mtx); + pa_shard_postfork_parent(tsdn, &arena->pa_shard); if (config_stats) { malloc_mutex_postfork_parent(tsdn, &arena->tcache_ql_mtx); } @@ -1844,13 +1835,7 @@ arena_postfork_child(tsdn_t *tsdn, arena_t *arena) { } malloc_mutex_postfork_child(tsdn, &arena->large_mtx); base_postfork_child(tsdn, arena->base); - edata_cache_postfork_child(tsdn, &arena->pa_shard.edata_cache); - ecache_postfork_child(tsdn, &arena->pa_shard.ecache_dirty); - ecache_postfork_child(tsdn, &arena->pa_shard.ecache_muzzy); - ecache_postfork_child(tsdn, &arena->pa_shard.ecache_retained); - ecache_grow_postfork_child(tsdn, &arena->pa_shard.ecache_grow); - malloc_mutex_postfork_child(tsdn, &arena->pa_shard.decay_dirty.mtx); - malloc_mutex_postfork_child(tsdn, &arena->pa_shard.decay_muzzy.mtx); + pa_shard_postfork_child(tsdn, &arena->pa_shard); if (config_stats) { malloc_mutex_postfork_child(tsdn, &arena->tcache_ql_mtx); } diff --git a/src/pa_extra.c b/src/pa_extra.c new file mode 100644 index 00000000..bfb0a004 --- /dev/null +++ b/src/pa_extra.c @@ -0,0 +1,55 @@ +#include "jemalloc/internal/jemalloc_preamble.h" +#include "jemalloc/internal/jemalloc_internal_includes.h" + +/* + * This file is logically part of the PA module. While pa.c contains the core + * allocator functionality, this file contains boring integration functionality; + * things like the pre- and post- fork handlers, and stats merging for CTL + * refreshes. + */ + +void +pa_shard_prefork0(tsdn_t *tsdn, pa_shard_t *shard) { + malloc_mutex_prefork(tsdn, &shard->decay_dirty.mtx); + malloc_mutex_prefork(tsdn, &shard->decay_muzzy.mtx); +} + +void +pa_shard_prefork2(tsdn_t *tsdn, pa_shard_t *shard) { + ecache_grow_prefork(tsdn, &shard->ecache_grow); +} + +void +pa_shard_prefork3(tsdn_t *tsdn, pa_shard_t *shard) { + ecache_prefork(tsdn, &shard->ecache_dirty); + ecache_prefork(tsdn, &shard->ecache_muzzy); + ecache_prefork(tsdn, &shard->ecache_retained); +} + + +void +pa_shard_prefork4(tsdn_t *tsdn, pa_shard_t *shard) { + edata_cache_prefork(tsdn, &shard->edata_cache); +} + +void +pa_shard_postfork_parent(tsdn_t *tsdn, pa_shard_t *shard) { + edata_cache_postfork_parent(tsdn, &shard->edata_cache); + ecache_postfork_parent(tsdn, &shard->ecache_dirty); + ecache_postfork_parent(tsdn, &shard->ecache_muzzy); + ecache_postfork_parent(tsdn, &shard->ecache_retained); + ecache_grow_postfork_parent(tsdn, &shard->ecache_grow); + malloc_mutex_postfork_parent(tsdn, &shard->decay_dirty.mtx); + malloc_mutex_postfork_parent(tsdn, &shard->decay_muzzy.mtx); +} + +void +pa_shard_postfork_child(tsdn_t *tsdn, pa_shard_t *shard) { + edata_cache_postfork_child(tsdn, &shard->edata_cache); + ecache_postfork_child(tsdn, &shard->ecache_dirty); + ecache_postfork_child(tsdn, &shard->ecache_muzzy); + ecache_postfork_child(tsdn, &shard->ecache_retained); + ecache_grow_postfork_child(tsdn, &shard->ecache_grow); + malloc_mutex_postfork_child(tsdn, &shard->decay_dirty.mtx); + malloc_mutex_postfork_child(tsdn, &shard->decay_muzzy.mtx); +}