* Ray Tracing program, storage manager.
* rt_malloc Allocate storage, with visibility & checking
* rt_free Similarly, free storage
* rt_prmem When debugging, print memory map
* calloc, cfree Which call rt_malloc, rt_free
* SECAD/VLD Computing Consortium, Bldg 394
* The U. S. Army Ballistic Research Laboratory
* Aberdeen Proving Ground, Maryland 21005-5066
* This software is Copyright (C) 1987 by the United States Army.
static char RCSstorage
[] = "@(#)$Header: storage.c,v 1.1 87/06/06 07:58:06 dpk BRL $";
#define MDB_MAGIC 0x12348969
cnt
= (cnt
+2*sizeof(int)-1)&(~(sizeof(int)-1));
syslog(LOG_ERR
, "rt_malloc: malloc failure");
register struct memdebug
*mp
= rt_mdb
;
for( ; mp
< &rt_mdb
[MDB_SIZE
]; mp
++ ) {
if( mp
->mdb_len
> 0 ) continue;
syslog(LOG_ERR
, "rt_malloc: memdebug overflow\n");
register int *ip
= (int *)(ptr
+cnt
-sizeof(int));
register struct memdebug
*mp
= rt_mdb
;
for( ; mp
< &rt_mdb
[MDB_SIZE
]; mp
++ ) {
if( mp
->mdb_len
<= 0 ) continue;
if( mp
->mdb_addr
!= ptr
) continue;
register int *ip
= (int *)(ptr
+mp
->mdb_len
-sizeof(int));
syslog(LOG_ERR
, "ERROR rt_free(x%x, %s) corrupted! x%x!=x%x\n", ptr
, "???", *ip
, MDB_MAGIC
);
mp
->mdb_len
= 0; /* successful free */
syslog(LOG_ERR
, "ERROR rt_free(x%x, %s) bad pointer!\n", ptr
, "???");
*((int *)ptr
) = -1; /* zappo! */
* Print map of memory currently in use.
register struct memdebug
*mp
= rt_mdb
;
printf("\nRT memory use\t\t%s\n", str
);
for( ; mp
< &rt_mdb
[MDB_SIZE
]; mp
++ ) {
if( mp
->mdb_len
<= 0 ) continue;
ip
= (int *)(mp
->mdb_addr
+mp
->mdb_len
-sizeof(int));
printf("%7x %5x %s %s\n",
mp
->mdb_addr
, mp
->mdb_len
, mp
->mdb_str
,
*ip
!=MDB_MAGIC
? "-BAD-" : "" );
printf("\t%x\t%x\n", *ip
, MDB_MAGIC
);
register unsigned num
, size
;
syslog(x
, str
, a
, b
, c
, d
, e
, f
)
fprintf(stderr
, str
, a
, b
, c
, d
, e
, f
);