|
|
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.