File:  [ELWIX - Embedded LightWeight unIX -] / libelwix / example / test_mem.c
Revision 1.7: download - view: text, annotated - select for diffs - revision graph
Wed Aug 14 16:05:42 2024 UTC (3 months, 1 week ago) by misho
Branches: MAIN
CVS tags: elwix6_6, elwix6_5, elwix6_4, elwix6_3, elwix6_2, elwix6_1, HEAD, ELWIX6_5, ELWIX6_4, ELWIX6_2, ELWIX6_1, ELWIX6_0
Version 6.0

Changelog:
 - New calloc() wrapper
 - New option --enable-mpool-mem-zero

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <elwix.h>


int show(unsigned int size, unsigned int act, unsigned int inact, void *data, unsigned int dlen)
{
	if (!act && !inact)
		return -1;

	if (size < 1024)
		printf("Statistics:: BUCKET %uB size, %u active, %u inactive\n", size, act, inact);
	else if (size < 1024 * 1024)
		printf("Statistics:: BUCKET %uKB size, %u active, %u inactive\n", size / 1024, act, inact);
	else
		printf("Statistics:: BUCKET %uMB size, %u active, %u inactive\n", size / (1024 * 1024), act, inact);

	return 0;
}

int
main(int argc, char **argv)
{
	mpool_t *mp;
	void *addr;
	int i;
	u_long curr, real;

	printf("whether default memory mapper is elwix? %d\n", elwix_mm_inuse());

	for (i = 0; i < 3; i++) {
		addr = malloc(4000);
		printf("addr=%p\n", addr);
		free(addr);
	}

	mp = mpool_init(0);
	if (!mp) {
		printf("Error:: #%d - %s\n", elwix_GetErrno(), elwix_GetError());
		return 1;
	}
	/*
	mpool_getquota(mp, &curr, NULL, NULL);
	printf("___current=%lu\n", curr);
	*/

	printf(">>> get 3 allocs\n");
	for (i = 0; i < 3; i++) {
		addr = mpool_malloc(mp, 4000, "mdaaa 4000");
		if (!addr) {
			printf("Error:: #%d - %s\n", elwix_GetErrno(), elwix_GetError());
			mpool_destroy(&mp);
			return 2;
		}
		printf("addr=%p chkaddr=%d addr_size=%d\n", addr, mpool_chkaddr(addr), mpool_getsizebyaddr(addr));

		strlcpy(addr, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\ndddddd\n", 
				mpool_getsizebyaddr(addr));
		mpool_free(mp, addr, 0);
	}

	mpool_getquota(mp, &curr, &real, NULL);
	printf("___current=%lu ___real=%lu\n", curr, real);

	printf("0) calls.act=%lu calls.inact=%lu calls.free=%lu; bytes.act=%lu bytes.inact=%lu bytes.free=%lu;\n", 
			mp->pool_calls.alloc, mp->pool_calls.cache, mp->pool_calls.free, 
			mp->pool_bytes.alloc, mp->pool_bytes.cache, mp->pool_bytes.free);
	mpool_statistics(mp, show, NULL, 0);

	printf(">>> realloc 4000 to 5010 addr=%p\n", addr);
	addr = mpool_realloc(mp, addr, 5010, "|||||||||||||");
	if (!addr)
		printf("Error:: #%d - %s\n", elwix_GetErrno(), elwix_GetError());
	mpool_getquota(mp, &curr, &real, NULL);
	printf("addr=%p_current=%lu_real=%lu\n", addr, curr, real);

	printf("1) calls.act=%lu calls.inact=%lu calls.free=%lu; bytes.act=%lu bytes.inact=%lu bytes.free=%lu;\n", 
			mp->pool_calls.alloc, mp->pool_calls.cache, mp->pool_calls.free, 
			mp->pool_bytes.alloc, mp->pool_bytes.cache, mp->pool_bytes.free);
	mpool_statistics(mp, show, NULL, 0);


	printf(">>> free addr=%p\n", addr);
	if (addr)
		mpool_free(mp, addr, 0);

	printf("2) calls.act=%lu calls.inact=%lu calls.free=%lu; bytes.act=%lu bytes.inact=%lu bytes.free=%lu;\n", 
			mp->pool_calls.alloc, mp->pool_calls.cache, mp->pool_calls.free, 
			mp->pool_bytes.alloc, mp->pool_bytes.cache, mp->pool_bytes.free);
	mpool_statistics(mp, show, NULL, 0);

	printf(">>> purge inactive memory\n");
	mpool_purge(mp, 0);

	mpool_getquota(mp, &curr, &real, NULL);
	printf("___current=%lu ___real=%lu\n", curr, real);

	printf("3) calls.act=%lu calls.inact=%lu calls.free=%lu; bytes.act=%lu bytes.inact=%lu bytes.free=%lu;\n", 
			mp->pool_calls.alloc, mp->pool_calls.cache, mp->pool_calls.free, 
			mp->pool_bytes.alloc, mp->pool_bytes.cache, mp->pool_bytes.free);
	mpool_statistics(mp, show, NULL, 0);

	printf(">>> alloc new 4000\n");
	addr = mpool_malloc(mp, 4000, "mdaaa 4000");
	if (!addr) {
		printf("Error:: #%d - %s\n", elwix_GetErrno(), elwix_GetError());
		mpool_destroy(&mp);
		return 2;
	}
	printf("addr=%p chkaddr=%d addr_size=%d\n", addr, mpool_chkaddr(addr), mpool_getsizebyaddr(addr));
	printf(">>> and free new 4000 addr=%p\n", addr);
	mpool_free(mp, addr, 0);

	printf("4) calls.act=%lu calls.inact=%lu calls.free=%lu; bytes.act=%lu bytes.inact=%lu bytes.free=%lu;\n", 
			mp->pool_calls.alloc, mp->pool_calls.cache, mp->pool_calls.free, 
			mp->pool_bytes.alloc, mp->pool_bytes.cache, mp->pool_bytes.free);
	mpool_statistics(mp, show, NULL, 0);


	printf("realloc 4000 to 100000 and to 2000000\n");
	addr = mpool_malloc(mp, 4000, "mdaaa 4000");
	printf("malloc addr=%p chkaddr=%d addr_size=%d\n", addr, mpool_chkaddr(addr), mpool_getsizebyaddr(addr));
	addr = mpool_realloc(mp, addr, 100000, "ohche");
	printf("realloc addr=%p chkaddr=%d addr_size=%d\n", addr, mpool_chkaddr(addr), mpool_getsizebyaddr(addr));
	addr = mpool_realloc(mp, addr, 2000000, NULL);
	printf("realloc addr=%p chkaddr=%d addr_size=%d\n", addr, mpool_chkaddr(addr), mpool_getsizebyaddr(addr));
	mpool_free(mp, addr, 0);
	printf("5) calls.act=%lu calls.inact=%lu calls.free=%lu; bytes.act=%lu bytes.inact=%lu bytes.free=%lu;\n", 
			mp->pool_calls.alloc, mp->pool_calls.cache, mp->pool_calls.free, 
			mp->pool_bytes.alloc, mp->pool_bytes.cache, mp->pool_bytes.free);
	mpool_statistics(mp, show, NULL, 0);

	addr = mpool_calloc(mp, 56, 1, NULL);
	printf("calloc addr=%p chkaddr=%d addr_size=%d\n", addr, mpool_chkaddr(addr), mpool_getsizebyaddr(addr));
	mpool_free(mp, addr, 0);
	addr = mpool_calloc(mp, 60, 1, "alabala");
	printf("calloc addr=%p chkaddr=%d addr_size=%d\n", addr, mpool_chkaddr(addr), mpool_getsizebyaddr(addr));
	mpool_free(mp, addr, 0);

	mpool_dump(mp, NULL);
	mpool_destroy(&mp);
	return 0;
}

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>