/* ctl_mutex must be held during execution of this function. */ static void arena_purge(unsigned arena_ind) { VARIABLE_ARRAY(arena_t *, tarenas, ctl_stats.narenas); malloc_mutex_lock(&arenas_lock); memcpy(tarenas, arenas, sizeof(arena_t *) * ctl_stats.narenas); malloc_mutex_unlock(&arenas_lock); if (arena_ind == ctl_stats.narenas) { unsigned i; for (i = 0; i < ctl_stats.narenas; i++) { if (tarenas[i] != NULL) arena_purge_all(tarenas[i]); } } else { assert(arena_ind < ctl_stats.narenas); if (tarenas[arena_ind] != NULL) arena_purge_all(tarenas[arena_ind]); } }
static int arenas_purge_ctl(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, void *newp, size_t newlen) { int ret; unsigned arena; WRITEONLY(); arena = UINT_MAX; WRITE(arena, unsigned); if (newp != NULL && arena >= narenas) { ret = EFAULT; goto label_return; } else { VARIABLE_ARRAY(arena_t *, tarenas, narenas); malloc_mutex_lock(&arenas_lock); memcpy(tarenas, arenas, sizeof(arena_t *) * narenas); malloc_mutex_unlock(&arenas_lock); if (arena == UINT_MAX) { unsigned i; for (i = 0; i < narenas; i++) { if (tarenas[i] != NULL) arena_purge_all(tarenas[i]); } } else { assert(arena < narenas); if (tarenas[arena] != NULL) arena_purge_all(tarenas[arena]); } } ret = 0; label_return: return (ret); }