Files
QNX/lib/malloc/dbg/analyze.c
2025-08-20 19:02:58 +08:00

294 lines
7.8 KiB
C

/*
* $QNXtpLicenseC:
* Copyright 2007, QNX Software Systems. All Rights Reserved.
*
* You must obtain a written license from and pay applicable license fees to QNX
* Software Systems before you may reproduce, modify or distribute this software,
* or any work that includes all or part of this software. Free development
* licenses are available for evaluation and non-commercial purposes. For more
* information visit http://licensing.qnx.com or email licensing@qnx.com.
*
* This file may contain contributions from others. Please review this entire
* file for other proprietary rights or license notices, as well as the QNX
* Development Suite License Guide at http://licensing.qnx.com/license-guide/
* for other information.
* $
*/
/*
* (c) Copyright 1990, 1991 Conor P. Cahill (uunet!virtech!cpcahil).
* You may copy, distribute, and use this software as long as this
* copyright statement is not removed.
*/
#include <stdio.h>
#include "malloc-lib.h"
#include "mallocint.h"
/*
* Function: malloc_size()
*
* 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
*
*/
ulong_t
malloc_size(ulong_t *histptr)
{
return( DBmalloc_size((char *)NULL,0,histptr) );
}
ulong_t
DBmalloc_size(const char *file, int line, ulong_t *histptr)
{
unsigned long size = 0;
DebugInfo_t * ptr;
Arena * ap;
Band * band;
int nb;
Flink * flink;
ENTER();
MALLOC_INIT();
/*
* make sure the chain is ok (otherwise we will have a problem
* parsing through it
*/
(void) DBFmalloc_chain_check("malloc_size",file,line,1);
/*
* Go through malloc chains for each Arena
*/
for (ap = __arenas.a_next; ap != &__arenas; ap = ap->a_next) {
if (ap->a_size < sizeof(*ap)) panic("a_size");
/*
* for each element in the malloc chain
*/
for(flink = ap->a_malloc_chain.head; flink; flink = flink->f_next)
{
ptr = &((Dhead *)flink)->d_debug;
/*
* if the element is in use
*/
if( (ptr->flag&M_INUSE) == M_INUSE)
{
/*
* add its requested size into the total size
*/
size += DH_ULEN(flink);
}
}
}
/*
* Go through malloc chains for every Block in every Band
*/
for (nb = 0; nb < *__pnband; nb++)
{
Block *bp;
band = __pBands[nb];
/*
* For each Block on the allocated list
*/
for (bp = band->alist; bp; bp = bp->next)
{
/*
* for each element in the malloc chain
*/
for(flink = bp->malloc_chain.head; flink; flink = flink->f_next)
{
ptr = &((Dhead *)flink)->d_debug;
/*
* if the element is in use
*/
if( (ptr->flag&M_INUSE) == M_INUSE)
{
/*
* add its requested size into the total size
*/
size += DH_ULEN(flink);
}
}
}
/*
* For each Block on the depleted list
*/
for (bp = band->dlist; bp; bp = bp->next)
{
for(flink = bp->malloc_chain.head; flink; flink = flink->f_next)
{
ptr = &((Dhead *)flink)->d_debug;
/*
* if the element is in use
*/
if( (ptr->flag&M_INUSE) == M_INUSE)
{
/*
* add its requested size into the total size
*/
size += DH_ULEN(flink);
}
}
}
}
/*
* if the hist id is desired, give it to em.
*/
if( histptr != NULL )
{
*histptr = malloc_hist_id;
}
/*
* return the size
*/
LEAVE();
return(size);
} /* malloc_size(... */
/*
* $Log$
* Revision 1.5 2007/04/24 15:44:27 shiv
* PR:29730
* CI:cburgess
* CI:xtang
*
* this is part of work order WO790334 for IGT. Included enhancements
* for configurability of the memory allocator. Includes matching changes for
* lib/c/alloc and lib/malloc as usual. This is to bring head in line
* with the work committed to the branch.
*
* Revision 1.4 2005/06/03 01:22:48 adanko
*
* Replace existing QNX copyright licence headers with macros as specified by
* the QNX Coding Standard. This is a change to source files in the head branch
* only.
*
* Note: only comments were changed.
*
* PR25328
*
* Revision 1.3 2005/01/16 20:38:45 shiv
* Latest DBG malloc code. Lots of cleanup/optimistions
* Modified Files:
* common.mk mallocint.h common/tostring.c dbg/analyze.c
* dbg/calloc.c dbg/dump.c dbg/free.c dbg/m_init.c
* dbg/malloc_chk.c dbg/malloc_chn.c dbg/malloc_g.c
* dbg/malloc_gc.c dbg/mallopt.c dbg/memory.c dbg/mtrace.c
* dbg/process.c dbg/realloc.c dbg/string.c
* public/malloc_g/malloc-lib.h public/malloc_g/malloc.h
* std/calloc.c std/free.c std/m_init.c std/malloc_wrapper.c
* std/mtrace.c std/realloc.c
* Added Files:
* dbg/dl_alloc.c dbg/malloc_control.c dbg/malloc_debug.c
* dbg/new.cc public/malloc_g/malloc-control.h
* public/malloc_g/malloc-debug.h
*
* Revision 1.2 2004/02/12 15:43:16 shiv
* Updated copyright/licenses
* Modified Files:
* common.mk debug.h malloc-lib.h mallocint.h tostring.h
* common/tostring.c dbg/analyze.c dbg/calloc.c dbg/context.h
* dbg/crc.c dbg/dump.c dbg/free.c dbg/m_init.c dbg/m_perror.c
* dbg/malloc_chk.c dbg/malloc_chn.c dbg/malloc_g.c
* dbg/malloc_gc.c dbg/mallopt.c dbg/memory.c dbg/mtrace.c
* dbg/process.c dbg/realloc.c dbg/string.c
* public/malloc/malloc.h public/malloc_g/malloc-lib.h
* public/malloc_g/malloc.h public/malloc_g/prototypes.h
* std/calloc.c std/context.h std/free.c std/m_init.c
* std/malloc_wrapper.c std/mtrace.c std/realloc.c test/memtest.c
* test/mtrace.c
*
* Revision 1.1 2000/01/31 19:03:30 bstecher
* Create libmalloc.so and libmalloc_g.so libraries for everything. See
* Steve Furr for details.
*
* Revision 1.1 2000/01/28 22:32:44 furr
* libmalloc_g allows consistency checks and bounds checking of heap
* blocks allocated using malloc.
* Initial revision
*
* Added Files:
* Makefile analyze.c calloc_g.c crc.c dump.c free.c m_init.c
* m_perror.c malloc-config.c malloc_chk.c malloc_chn.c
* malloc_g.c malloc_gc.c mallopt.c memory.c process.c realloc.c
* string.c tostring.c inc/debug.h inc/mallocint.h inc/tostring.h
* inc/malloc_g/malloc inc/malloc_g/malloc.h
* inc/malloc_g/prototypes.h test/memtest.C test/memtest.c
* x86/Makefile x86/so/Makefile
*
* 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
*
* Revision 1.9 91/11/20 11:54:11 cpcahil
* interim checkin
*
* Revision 1.8 90/08/29 21:22:52 cpcahil
* miscellaneous lint fixes
*
* Revision 1.7 90/05/11 00:13:10 cpcahil
* added copyright statment
*
* Revision 1.6 90/02/25 11:01:20 cpcahil
* added support for malloc chain checking.
*
* Revision 1.5 90/02/24 21:50:31 cpcahil
* lots of lint fixes
*
* Revision 1.4 90/02/24 17:29:39 cpcahil
* changed $Header to $Id so full path wouldnt be included as part of rcs
* id string
*
* Revision 1.3 90/02/24 17:20:00 cpcahil
* attempt to get rid of full path in rcs header.
*
* Revision 1.2 90/02/24 15:14:20 cpcahil
* 1. added function header
* 2. changed calls to malloc_warning to conform to new usage
* 3. added setting of malloc_errno
* 4. broke up bad pointer determination so that errno's would be more
* descriptive
*
* Revision 1.1 90/02/22 23:17:43 cpcahil
* Initial revision
*
*/