示例#1
0
文件: ctl.c 项目: GlassFace/sunwell
/* 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]);
	}
}
示例#2
0
文件: ctl.c 项目: AhmadTux/freebsd
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);
}