mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-25 15:00:45 -08:00
74 lines
1.4 KiB
C
74 lines
1.4 KiB
C
/*
|
|
TEST_HEADER
|
|
id = $Id$
|
|
summary = test malloc and free (for the manual)
|
|
language = c
|
|
link = testlib.o
|
|
parameters = POINTERS=1000 ITERATIONS=10000
|
|
END_HEADER
|
|
*/
|
|
|
|
#include "mpscmvff.h"
|
|
#include "testlib.h"
|
|
|
|
static mps_pool_t malloc_pool;
|
|
|
|
typedef union {
|
|
size_t size;
|
|
char alignment[MPS_PF_ALIGN];
|
|
} header_u;
|
|
|
|
static void *xmalloc(size_t size)
|
|
{
|
|
mps_res_t res;
|
|
mps_addr_t p;
|
|
header_u *header;
|
|
size += sizeof *header;
|
|
res = mps_alloc(&p, malloc_pool, size);
|
|
if (res != MPS_RES_OK)
|
|
return NULL;
|
|
header = p;
|
|
header->size = size;
|
|
return header + 1;
|
|
}
|
|
|
|
static void xfree(void *p)
|
|
{
|
|
if (p) {
|
|
header_u *header = ((header_u *)p) - 1;
|
|
mps_free(malloc_pool, header, header->size);
|
|
}
|
|
}
|
|
|
|
static void test(void)
|
|
{
|
|
mps_arena_t arena;
|
|
size_t i, j;
|
|
void *p[POINTERS] = {0};
|
|
|
|
cdie(mps_arena_create_k(&arena, mps_arena_class_vm(), mps_args_none),
|
|
"create arena");
|
|
cdie(mps_pool_create_k(&malloc_pool, arena, mps_class_mvff(), mps_args_none),
|
|
"create pool");
|
|
|
|
for (i = 0; i < ITERATIONS; ++i) {
|
|
j = ranint(POINTERS);
|
|
xfree(p[j]);
|
|
p[j] = xmalloc(ranint(POINTERS));
|
|
}
|
|
for (j = 0; j < POINTERS; ++j) {
|
|
xfree(p[j]);
|
|
}
|
|
asserts(mps_pool_free_size(malloc_pool) == mps_pool_total_size(malloc_pool),
|
|
"free size != total_size");
|
|
|
|
mps_pool_destroy(malloc_pool);
|
|
mps_arena_destroy(arena);
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
easy_tramp(test);
|
|
pass();
|
|
return 0;
|
|
}
|