|
|
1.1 ! root 1: /* ! 2: * S T O R A G E . C ! 3: * ! 4: * Ray Tracing program, storage manager. ! 5: * ! 6: * Functions - ! 7: * rt_malloc Allocate storage, with visibility & checking ! 8: * rt_free Similarly, free storage ! 9: * rt_prmem When debugging, print memory map ! 10: * calloc, cfree Which call rt_malloc, rt_free ! 11: * ! 12: * Author - ! 13: * Michael John Muuss ! 14: * ! 15: * Source - ! 16: * SECAD/VLD Computing Consortium, Bldg 394 ! 17: * The U. S. Army Ballistic Research Laboratory ! 18: * Aberdeen Proving Ground, Maryland 21005-5066 ! 19: * ! 20: * Copyright Notice - ! 21: * This software is Copyright (C) 1987 by the United States Army. ! 22: * All rights reserved. ! 23: */ ! 24: #ifndef lint ! 25: static char RCSstorage[] = "@(#)$Header: storage.c,v 1.1 87/06/06 07:58:06 dpk BRL $"; ! 26: #endif ! 27: ! 28: #include <sys/param.h> ! 29: #if BSD >= 43 ! 30: #include <sys/syslog.h> ! 31: #else ! 32: #include <stdio.h> ! 33: #define LOG_ERR 0 ! 34: #endif BSD ! 35: ! 36: #undef malloc ! 37: #undef free ! 38: ! 39: #define MDB_SIZE 20000 ! 40: #define MDB_MAGIC 0x12348969 ! 41: struct memdebug { ! 42: char *mdb_addr; ! 43: char *mdb_str; ! 44: int mdb_len; ! 45: } rt_mdb[MDB_SIZE]; ! 46: ! 47: /* ! 48: * R T _ M A L L O C ! 49: */ ! 50: char * ! 51: rt_malloc(cnt) ! 52: unsigned int cnt; ! 53: { ! 54: register char *ptr; ! 55: extern char *malloc(); ! 56: ! 57: cnt = (cnt+2*sizeof(int)-1)&(~(sizeof(int)-1)); ! 58: ptr = malloc(cnt); ! 59: ! 60: if( ptr==(char *)0 ) { ! 61: syslog(LOG_ERR, "rt_malloc: malloc failure"); ! 62: abort(); ! 63: } else { ! 64: register struct memdebug *mp = rt_mdb; ! 65: for( ; mp < &rt_mdb[MDB_SIZE]; mp++ ) { ! 66: if( mp->mdb_len > 0 ) continue; ! 67: mp->mdb_addr = ptr; ! 68: mp->mdb_len = cnt; ! 69: mp->mdb_str = "???"; ! 70: goto ok; ! 71: } ! 72: syslog(LOG_ERR, "rt_malloc: memdebug overflow\n"); ! 73: } ! 74: ok: ; ! 75: { ! 76: register int *ip = (int *)(ptr+cnt-sizeof(int)); ! 77: *ip = MDB_MAGIC; ! 78: } ! 79: return(ptr); ! 80: } ! 81: ! 82: /* ! 83: * R T _ F R E E ! 84: */ ! 85: void ! 86: rt_free(ptr) ! 87: char *ptr; ! 88: { ! 89: register struct memdebug *mp = rt_mdb; ! 90: for( ; mp < &rt_mdb[MDB_SIZE]; mp++ ) { ! 91: if( mp->mdb_len <= 0 ) continue; ! 92: if( mp->mdb_addr != ptr ) continue; ! 93: { ! 94: register int *ip = (int *)(ptr+mp->mdb_len-sizeof(int)); ! 95: if( *ip != MDB_MAGIC ) { ! 96: syslog(LOG_ERR, "ERROR rt_free(x%x, %s) corrupted! x%x!=x%x\n", ptr, "???", *ip, MDB_MAGIC); ! 97: abort(); ! 98: } ! 99: } ! 100: mp->mdb_len = 0; /* successful free */ ! 101: goto ok; ! 102: } ! 103: syslog(LOG_ERR, "ERROR rt_free(x%x, %s) bad pointer!\n", ptr, "???"); ! 104: abort(); ! 105: ok: ; ! 106: ! 107: *((int *)ptr) = -1; /* zappo! */ ! 108: free(ptr); ! 109: } ! 110: ! 111: /* ! 112: * R T _ P R M E M ! 113: * ! 114: * Print map of memory currently in use. ! 115: */ ! 116: void ! 117: rt_prmem(str) ! 118: char *str; ! 119: { ! 120: register struct memdebug *mp = rt_mdb; ! 121: register int *ip; ! 122: ! 123: printf("\nRT memory use\t\t%s\n", str); ! 124: for( ; mp < &rt_mdb[MDB_SIZE]; mp++ ) { ! 125: if( mp->mdb_len <= 0 ) continue; ! 126: ip = (int *)(mp->mdb_addr+mp->mdb_len-sizeof(int)); ! 127: printf("%7x %5x %s %s\n", ! 128: mp->mdb_addr, mp->mdb_len, mp->mdb_str, ! 129: *ip!=MDB_MAGIC ? "-BAD-" : "" ); ! 130: if( *ip != MDB_MAGIC ) ! 131: printf("\t%x\t%x\n", *ip, MDB_MAGIC); ! 132: } ! 133: } ! 134: ! 135: char * ! 136: calloc(num, size) ! 137: register unsigned num, size; ! 138: { ! 139: extern char *malloc(); ! 140: register char *p; ! 141: ! 142: size *= num; ! 143: if (p = rt_malloc(size)) ! 144: bzero(p, size); ! 145: return (p); ! 146: } ! 147: ! 148: cfree(p, num, size) ! 149: char *p; ! 150: unsigned num; ! 151: unsigned size; ! 152: { ! 153: rt_free(p); ! 154: } ! 155: ! 156: #if BSD < 43 ! 157: openlog() {} ! 158: ! 159: syslog(x, str, a, b, c, d, e, f) ! 160: int x; ! 161: char *str; ! 162: int a, b, c, d, e, f; ! 163: { ! 164: fprintf(stderr, str, a, b, c, d, e, f); ! 165: } ! 166: #endif BSD
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.