home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 January
/
usenetsourcesnewsgroupsinfomagicjanuary1994.iso
/
sources
/
misc
/
volume32
/
dbmalloc
/
part04
/
leak.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-04
|
6KB
|
251 lines
/*
* (c) Copyright 1990, 1991, 1992 Conor P. Cahill (cpcahil@virtech.vti.com)
*
* This software may be distributed freely as long as the following conditions
* are met:
* * the distribution, or any derivative thereof, may not be
* included as part of a commercial product
* * full source code is provided including this copyright
* * there is no charge for the software itself (there may be
* a minimal charge for the copying or distribution effort)
* * this copyright notice is not modified or removed from any
* source file
*/
#ifndef lint
static
char rcs_hdr[] = "$Id: leak.c,v 1.12 1992/08/22 16:27:13 cpcahil Exp $";
#endif
#include <stdio.h>
#include "mallocin.h"
/*
* Function: malloc_inuse()
*
* Purpose: to determine the amount of memory in use
*
* Arguments: histidptr - pointer to hist id area
*
* Returns: Number of bytes currently in use
*
* Narrative: make sure the malloc chain is ok
* for each element in the malloc chain
* if it is in use
* add size to total size
* if hist id is wanted
* set it
* return total in-use size
*
*/
unsigned long
malloc_inuse(histptr)
unsigned long * histptr;
{
return( DBmalloc_inuse((char *)NULL,0,histptr) );
}
unsigned long
DBmalloc_inuse(file,line,histptr)
CONST char * file;
int line;
unsigned long * histptr;
{
unsigned long size = 0;
struct mlist * ptr;
MALLOC_INIT();
/*
* make sure the chain is ok (otherwise we will have a problem
* parsing through it
*/
VOIDCAST DBFmalloc_chain_check("malloc_inuse",file,line,1);
/*
* for each element in the malloc chain
*/
for(ptr = &malloc_start; ptr; ptr = ptr->next)
{
/*
* if the element is in use and it is not marked and it is
* not a stack segment (an internal allocation used by the
* malloc subsystem when tracking program stack)
*/
if( ((ptr->flag & M_INUSE) == M_INUSE)
&& ((ptr->flag & M_MARKED) != M_MARKED)
&& ( GETTYPE(ptr) != M_T_STACK) )
{
/*
* add its requested size into the total size
*/
size += ptr->r_size;
}
}
/*
* if the hist id is desired, give it to em.
*/
if( histptr != NULL )
{
*histptr = malloc_hist_id;
}
/*
* return the size
*/
return(size);
} /* DBmalloc_inuse(... */
/*
* Function: malloc_mark()
*
* Purpose: to mark memory as validly in-use. This is used in order to
* exempt verified segments from the leak list/counters so that
* once you verify that it is valid to leave the segment around
* forever, you can mark the segment and it won't be counted in
* the leak memory counts, no the leak segment list
*
* Arguments: ptr - pointer to data area to mark
*
* Returns: true - segment has been marked
* false - segment not marked because it is invalid
*
* Narrative:
* make sure malloc subsystem is initialized
* if necessary, check malloc chain
* verify pointer is within malloc region
* get mlist pointer from passed address
* verify magic number
* verify inuse flag
* verify valid linkage
* mark segment
*/
VOIDTYPE
malloc_mark(cptr)
DATATYPE * cptr;
{
DBmalloc_mark((char *)NULL, 0, cptr);
}
VOIDTYPE
DBmalloc_mark(file,line,cptr)
CONST char * file;
int line;
DATATYPE * cptr;
{
CONST char * func = "malloc_mark";
register struct mlist * ptr;
/*
* initialize the malloc sub-system.
*/
MALLOC_INIT();
/*
* If malloc chain checking is on, go do it.
*/
if( malloc_opts & MOPT_CKCHAIN )
{
VOIDCAST DBFmalloc_chain_check(func,file,line,1);
}
/*
* verify that cptr is within the malloc region and that it is on
* the correct alignment
*/
if( (cptr < malloc_data_start)
|| (cptr > malloc_data_end)
|| ((((long)cptr) & malloc_round) != 0) )
{
malloc_errno = M_CODE_BAD_PTR;
malloc_warning(func,file,line,(struct mlist *)NULL);
return;
}
/*
* convert pointer to mlist struct pointer. To do this we must
* move the pointer backwards the correct number of bytes...
*/
ptr = (struct mlist *) (((char *)cptr) - M_SIZE);
/*
* check the magic number
*/
if( (ptr->flag&M_MAGIC_BITS) != M_MAGIC )
{
malloc_errno = M_CODE_BAD_MAGIC;
malloc_warning(func,file,line,(struct mlist *)NULL);
return;
}
/*
* if this segment is not flagged as being in use
*/
if( ! (ptr->flag & M_INUSE) )
{
malloc_errno = M_CODE_NOT_INUSE;
malloc_warning(func,file,line,ptr);
return;
}
/*
* check to see that the pointers are still connected
*/
if( (ptr->prev && (ptr->prev->next != ptr) ) ||
(ptr->next && (ptr->next->prev != ptr) ) ||
((ptr->next == NULL) && (ptr->prev == NULL)) )
{
malloc_errno = M_CODE_BAD_CONNECT;
malloc_warning(func,file,line,ptr);
return;
}
ptr->flag |= M_MARKED;
} /* DBmalloc_mark(... */
/*
* $Log: leak.c,v $
* Revision 1.12 1992/08/22 16:27:13 cpcahil
* final changes for pl14
*
* Revision 1.11 1992/07/02 13:49:54 cpcahil
* added support for new malloc_size function and additional tests to testerr
*
* Revision 1.10 1992/06/30 13:06:39 cpcahil
* added support for aligned allocations
*
* Revision 1.9 1992/06/27 22:48:48 cpcahil
* misc fixes per bug reports from first week of reviews
*
* Revision 1.8 1992/06/22 23:40:10 cpcahil
* many fixes for working on small int systems
*
* Revision 1.7 1992/04/13 19:57:15 cpcahil
* more patch 8 fixes
*
* Revision 1.6 1992/04/13 03:06:33 cpcahil
* Added Stack support, marking of non-leaks, auto-config, auto-testing
*
* Revision 1.5 1992/01/30 12:23:06 cpcahil
* renamed mallocint.h -> mallocin.h
*
* Revision 1.4 1992/01/10 17:28:03 cpcahil
* Added support for overriding void datatype
*
* Revision 1.3 1991/12/02 19:10:09 cpcahil
* changes for patch release 5
*
* Revision 1.2 91/11/25 14:41:54 cpcahil
* Final changes in preparation for patch 4 release
*
* Revision 1.1 91/11/24 00:49:26 cpcahil
* first cut at patch 4
*/