diff options
author | Jason Evans <jasone@canonware.com> | 2016-04-22 21:37:17 (GMT) |
---|---|---|
committer | Jason Evans <jasone@canonware.com> | 2016-04-22 22:20:06 (GMT) |
commit | 19ff2cefba48d1ddab8fb52e3d78f309ca2553cf (patch) | |
tree | 25c4cba5d31e58642058e15bbfd8cc834594d150 /src/ctl.c | |
parent | 66cd953514a18477eb49732e40d5c2ab5f1b12c5 (diff) | |
download | jemalloc-19ff2cefba48d1ddab8fb52e3d78f309ca2553cf.zip jemalloc-19ff2cefba48d1ddab8fb52e3d78f309ca2553cf.tar.gz jemalloc-19ff2cefba48d1ddab8fb52e3d78f309ca2553cf.tar.bz2 |
Implement the arena.<i>.reset mallctl.
This makes it possible to discard all of an arena's allocations in a
single operation.
This resolves #146.
Diffstat (limited to 'src/ctl.c')
-rw-r--r-- | src/ctl.c | 36 |
1 files changed, 36 insertions, 0 deletions
@@ -120,6 +120,7 @@ CTL_PROTO(tcache_destroy) static void arena_i_purge(tsd_t *tsd, unsigned arena_ind, bool all); CTL_PROTO(arena_i_purge) CTL_PROTO(arena_i_decay) +CTL_PROTO(arena_i_reset) CTL_PROTO(arena_i_dss) CTL_PROTO(arena_i_lg_dirty_mult) CTL_PROTO(arena_i_decay_time) @@ -299,6 +300,7 @@ static const ctl_named_node_t tcache_node[] = { static const ctl_named_node_t arena_i_node[] = { {NAME("purge"), CTL(arena_i_purge)}, {NAME("decay"), CTL(arena_i_decay)}, + {NAME("reset"), CTL(arena_i_reset)}, {NAME("dss"), CTL(arena_i_dss)}, {NAME("lg_dirty_mult"), CTL(arena_i_lg_dirty_mult)}, {NAME("decay_time"), CTL(arena_i_decay_time)}, @@ -1603,6 +1605,40 @@ label_return: } static int +arena_i_reset_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, void *oldp, + size_t *oldlenp, void *newp, size_t newlen) +{ + int ret; + unsigned arena_ind; + arena_t *arena; + + READONLY(); + WRITEONLY(); + + if ((config_valgrind && unlikely(in_valgrind)) || (config_fill && + unlikely(opt_quarantine))) { + ret = EFAULT; + goto label_return; + } + + arena_ind = (unsigned)mib[1]; + if (config_debug) { + malloc_mutex_lock(tsd, &ctl_mtx); + assert(arena_ind < ctl_stats.narenas); + malloc_mutex_unlock(tsd, &ctl_mtx); + } + assert(arena_ind >= opt_narenas); + + arena = arena_get(tsd, arena_ind, false); + + arena_reset(tsd, arena); + + ret = 0; +label_return: + return (ret); +} + +static int arena_i_dss_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, void *newp, size_t newlen) { |