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: #if defined(DOSCCS) && !defined(lint) 25: static char RCSstorage[] = "@(#)$Header: /us1/cr/work/named/named/RCS/storage.c,v 1.1 94/01/01 03:13:33 cr Exp Locker: cr $"; 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