/* * ++Copyright++ 1985, 1989 * - * Copyright (c) 1985, 1989 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * Portions Copyright (c) 1993 by Digital Equipment Corporation. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies, and that * the name of Digital Equipment Corporation not be used in advertising or * publicity pertaining to distribution of the document or software without * specific, written prior permission. * * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * - * --Copyright-- */ #include #include #include "portability.h" #include "options.h" extern void panic __P((int, const char *)); #ifdef DSTORAGE /* * S T O R A G E . C * * Ray Tracing program, storage manager. * * Functions - * 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 * * Author - * Michael John Muuss * * Source - * SECAD/VLD Computing Consortium, Bldg 394 * The U. S. Army Ballistic Research Laboratory * Aberdeen Proving Ground, Maryland 21005-5066 * * Copyright Notice - * This software is Copyright (C) 1987 by the United States Army. * All rights reserved. */ #ifndef lint static char RCSid[] = "$Id: storage.c,v 1.3 1995/05/30 03:49:05 rgrimes Exp $"; #endif #undef malloc #undef free #define MDB_SIZE 20000 #define MDB_MAGIC 0x12348969 struct memdebug { char *mdb_addr; char *mdb_str; int mdb_len; } rt_mdb[MDB_SIZE]; /* * R T _ M A L L O C */ char * rt_malloc(cnt) unsigned int cnt; { register char *ptr; cnt = (cnt+2*sizeof(int)-1)&(~(sizeof(int)-1)); ptr = malloc(cnt); if( ptr==(char *)0 ) { panic(errno, "rt_malloc: malloc failure"); } else { register struct memdebug *mp = rt_mdb; for( ; mp < &rt_mdb[MDB_SIZE]; mp++ ) { if( mp->mdb_len > 0 ) continue; mp->mdb_addr = ptr; mp->mdb_len = cnt; mp->mdb_str = "???"; goto ok; } syslog(LOG_ERR, "rt_malloc: memdebug overflow\n"); } ok: ; { register int *ip = (int *)(ptr+cnt-sizeof(int)); *ip = MDB_MAGIC; } return(ptr); } /* * R T _ F R E E */ void rt_free(ptr) char *ptr; { 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)); if( *ip != MDB_MAGIC ) panic(-1, "rt_free: corrupt magic"); } mp->mdb_len = 0; /* successful free */ goto ok; } panic(-1, "rt_free: bad pointer"); ok: *((int *)ptr) = -1; /* zappo! */ free(ptr); } /* * R T _ P R M E M * * Print map of memory currently in use. */ void rt_prmem(str) char *str; { register struct memdebug *mp = rt_mdb; register int *ip; 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-" : "" ); if( *ip != MDB_MAGIC ) printf("\t%x\t%x\n", *ip, MDB_MAGIC); } } char * calloc(num, size) register unsigned num, size; { register char *p; size *= num; if (p = rt_malloc(size)) bzero(p, size); return (p); } cfree(p, num, size) char *p; unsigned num; unsigned size; { rt_free(p); } #endif /*DSTORAGE*/