190792Sgshapiro/*
2261194Sgshapiro * Copyright (c) 2000-2001 Proofpoint, Inc. and its suppliers.
390792Sgshapiro *	All rights reserved.
490792Sgshapiro *
590792Sgshapiro * By using this file, you agree to the terms and conditions set
690792Sgshapiro * forth in the LICENSE file which can be found at the top level of
790792Sgshapiro * the sendmail distribution.
890792Sgshapiro */
990792Sgshapiro
1090792Sgshapiro#include <sm/gen.h>
11266527SgshapiroSM_IDSTR(id, "@(#)$Id: t-heap.c,v 1.11 2013-11-22 20:51:43 ca Exp $")
1290792Sgshapiro
1390792Sgshapiro#include <sm/debug.h>
1490792Sgshapiro#include <sm/heap.h>
1590792Sgshapiro#include <sm/io.h>
1690792Sgshapiro#include <sm/test.h>
1790792Sgshapiro#include <sm/xtrap.h>
1890792Sgshapiro
1990792Sgshapiro#if SM_HEAP_CHECK
2090792Sgshapiroextern SM_DEBUG_T SmHeapCheck;
2190792Sgshapiro# define HEAP_CHECK sm_debug_active(&SmHeapCheck, 1)
22363466Sgshapiro#else
2390792Sgshapiro# define HEAP_CHECK 0
2490792Sgshapiro#endif /* SM_HEAP_CHECK */
2590792Sgshapiro
2690792Sgshapiroint
2790792Sgshapiromain(argc, argv)
2890792Sgshapiro	int argc;
2990792Sgshapiro	char **argv;
3090792Sgshapiro{
3190792Sgshapiro	void *p;
3290792Sgshapiro
3390792Sgshapiro	sm_test_begin(argc, argv, "test heap handling");
3490792Sgshapiro	if (argc > 1)
3590792Sgshapiro		sm_debug_addsettings_x(argv[1]);
3690792Sgshapiro
3790792Sgshapiro	p = sm_malloc(10);
3890792Sgshapiro	SM_TEST(p != NULL);
3990792Sgshapiro	p = sm_realloc_x(p, 20);
4090792Sgshapiro	SM_TEST(p != NULL);
4190792Sgshapiro	p = sm_realloc(p, 30);
4290792Sgshapiro	SM_TEST(p != NULL);
4390792Sgshapiro	if (HEAP_CHECK)
4490792Sgshapiro	{
4590792Sgshapiro		sm_dprintf("heap with 1 30-byte block allocated:\n");
4690792Sgshapiro		sm_heap_report(smioout, 3);
4790792Sgshapiro	}
4890792Sgshapiro
4990792Sgshapiro	if (HEAP_CHECK)
5090792Sgshapiro	{
5190792Sgshapiro		sm_free(p);
5290792Sgshapiro		sm_dprintf("heap with 0 blocks allocated:\n");
5390792Sgshapiro		sm_heap_report(smioout, 3);
5490792Sgshapiro		sm_dprintf("xtrap count = %d\n", SmXtrapCount);
5590792Sgshapiro	}
5690792Sgshapiro
5790792Sgshapiro#if DEBUG
5890792Sgshapiro	/* this will cause a core dump */
5990792Sgshapiro	sm_dprintf("about to free %p for the second time\n", p);
6090792Sgshapiro	sm_free(p);
61363466Sgshapiro#endif
6290792Sgshapiro
6390792Sgshapiro	return sm_test_end();
6490792Sgshapiro}
65