📄 storage.c
字号:
/* * ++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 <sys/param.h>#include <syslog.h>#include "../conf/portability.h"#include "../conf/options.h"#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 lintstatic char RCSid[] = "$Id: storage.c,v 4.9.1.2 1993/09/08 00:01:17 vixie Exp $";#endif#undef malloc#undef free#define MDB_SIZE 20000#define MDB_MAGIC 0x12348969struct 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 ) { syslog(LOG_ERR, "rt_malloc: malloc failure"); abort(); } 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 */voidrt_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 ) { syslog(LOG_ERR, "ERROR rt_free(x%x, %s) corrupted! x%x!=x%x\n", ptr, "???", *ip, MDB_MAGIC); abort(); } } mp->mdb_len = 0; /* successful free */ goto ok; } syslog(LOG_ERR, "ERROR rt_free(x%x, %s) bad pointer!\n", ptr, "???"); abort();ok: ; *((int *)ptr) = -1; /* zappo! */ free(ptr);}/* * R T _ P R M E M * * Print map of memory currently in use. */voidrt_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*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -