|
|
1.1 root 1: /* -*- Mode:C++ -*- */
2: /*ident "@(#)ctrans:src/alloc.c 1.1.1.8" */
3: /*
4: $Source: /usr3/lang/benson/work/stripped_cfront/RCS/alloc.c,v $ $RCSfile: alloc.c,v $
5: $Revision: 1.1 $ $Date: 89/11/20 08:50:09 $
6: $Author: benson $ $Locker: $
7: $State: Exp $
8:
9:
10: */
11: /**************************************************************************
12:
13: C++ source for cfront, the C++ compiler front-end
14: written in the computer science research center of Bell Labs
15:
16: Copyright (c) 1984 AT&T, Inc. All Rights Reserved
17: THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T, INC.
18:
19: alloc.c:
20:
21: *****************************************************************************/
22: #include "cfront.h"
23: #include <memory.h>
24: #include "size.h"
25:
26: //int Nchunk;
27:
28: //void print_free()
29: //{
30: // fprintf(stderr,"free store: %d bytes alloc()=%d free()=%d\n",Nfree_store,Nal//loc, Nfree);
31: // fprintf(stderr,"%d chunks: %d (%d)\n",Nchunk,CHUNK,Nchunk*CHUNK);
32: //}
33:
34:
35: /*
36: #ifdef __cplusplus
37: #include <new.h>
38: #define NEW_SIZE size_t
39: #else
40: #define NEW_SIZE long
41: #endif
42: */
43:
44: // now __HAVE_SIZE_T defined in 2.0 malloc.h c++ header file
45: #ifdef __HAVE_SIZE_T
46: #include <new.h>
47: #define NEW_SIZE size_t
48: #else
49: #define NEW_SIZE long
50: #endif
51:
52: void* operator new(NEW_SIZE sz) // get memory that might be freed
53: {
54: char* p = calloc((unsigned)sz,1);
55:
56: //fprintf(stderr,"alloc(%d)->%d\n",sz,p);
57: if (p == 0) { // no space
58: free((char*)gtbl); // get space for error message
59: // if (Nspy) print_free();
60: error('i',"free store exhausted");
61: }
62: // Nalloc++;
63: // Nfree_store += sz+sizeof(int*);
64: return p;
65: }
66: //int NFn, NFtn, NFbt, NFpv, NFf, NFe, NFs, NFc;
67:
68: void operator delete (void* p)
69: {
70: if (p == 0) return;
71:
72: //fprintf(stderr,"free(%d) %d\n",p,((int*)p)[-1]-(int)p-1+sizeof(int*));
73:
74: //if (Nspy) {
75: // Pname pp = (Pname) p;
76: // TOK t = pp->base;
77: // Nfree++;
78: // Nfree_store -= ((int*)p)[-1]-(int)p-1+sizeof(int*);
79: // switch (t) { // can be fooled by character strings
80: // case INT: case CHAR: case TYPE: case VOID: case SHORT: case LONG:
81: // case FLOAT: case DOUBLE: case LDOUBLE: case COBJ: case EOBJ: case FIELD:
82: // NFbt++; break;
83: //
84: // case PTR: case VEC:
85: // NFpv++; break;
86: //
87: // case FCT: NFf++; break;
88: //
89: // case ICON: case CCON: case STRING: case FCON: case THIS:
90: // NFc++; break;
91: // }
92: //}
93: free((char*)p);
94: }
95:
96: #ifdef OPTIMIZE
97: inline void mzero (register char * p, register int l)
98: {
99: while(l>=0) { *p++ = 0; l--; }
100: }
101: #else
102: #define mzero(p,l) memset(p,0,l)
103: #endif
104:
105: /* page chunking slows things down -- disimproved locality
106: overwhelms cpu in malloc? */
107: #ifdef PageChunk
108: #define PAGESWORTH(sz) (8192/sizeof(sz))
109: #define PAGESIZE 8192
110: #endif
111:
112: void *
113: expr::operator new (size_t)
114: {
115: char * page;
116:
117: if(!free) {
118: #ifdef PageChunk
119: Pexpr x;
120: page = valloc(PAGESIZE);
121: free = Pexpr(page);
122: for(x = free; x < &free[PAGESWORTH(expr) - 1]; x++)
123: x->e1 = x+1;
124: x->e1 = 0;
125: #else
126: page = malloc(sizeof(expr));
127: free = Pexpr(page);
128: free->e1 = 0;
129: #endif
130: }
131: page = (char *)free;
132: free = free->e1;
133: mzero(page, sizeof(expr));
134: return (void *)page;
135: }
136:
137: void *
138: stmt::operator new (size_t)
139: {
140: char * page;
141:
142: if(!free) {
143: #ifdef PageChunk
144: Pstmt x;
145: page = valloc(PAGESIZE);
146: free = Pstmt(page);
147: for(x = free; x < &free[PAGESWORTH(stmt) - 1]; x++)
148: x->s_list = x+1;
149: x->s_list = 0;
150: #else
151: page = malloc(sizeof(stmt));
152: free = Pstmt(page);
153: free->s_list = 0;
154: #endif
155: }
156: page = (char *)free;
157: free = free->s_list;
158: mzero(page, sizeof(stmt));
159: return (void *) page;
160: }
161:
162: void *
163: name::operator new (size_t)
164: {
165: char * page;
166:
167: if(!free) {
168: #ifdef PageChunk
169: Pname x;
170: page = valloc(PAGESIZE);
171: free = Pname(page);
172: for(x = free; x < &free[PAGESWORTH(name) - 1]; x++)
173: x->n_tbl_list = x+1;
174: x->n_tbl_list = 0;
175: #else
176: page = malloc(sizeof(name));
177: free = Pname(page);
178: free->n_tbl_list = 0;
179: #endif
180: }
181: page = (char *)free;
182: free = free->n_tbl_list;
183: mzero(page, sizeof(name));
184: return (void *) page;
185: }
186:
187: void
188: expr::operator delete (void * ve)
189: {
190: Pexpr(ve)->permanent = 3;
191: Pexpr(ve)->e1 = new_free;
192: new_free = Pexpr(ve);
193: }
194:
195: void
196: stmt::operator delete (void * vs)
197: {
198: Pstmt(vs)->permanent = 3;
199: Pstmt(vs)->s_list = new_free;
200: new_free = Pstmt(vs);
201: }
202:
203: void
204: name::operator delete (void * vn)
205: {
206: Pname(vn)->permanent = 3;
207: Pname(vn)->n_tbl_list = new_free;
208: new_free = Pname(vn);
209: }
210:
211: void recycle_deleted_storage ()
212: {
213: Pexpr fce;
214: if(expr::free) {
215: for (fce = expr::free;fce->e1;fce = fce->e1) ; /* just chase */
216: fce->e1 = expr::new_free;
217: } else expr::free = expr::new_free;
218: expr::new_free = 0;
219:
220: Pstmt sce;
221: if(stmt::free) {
222: for (sce = stmt::free;sce->s_list;sce = sce->s_list) ; /* just chase */
223: sce->s_list = stmt::new_free;
224: } else stmt::free = stmt::new_free;
225: stmt::new_free = 0;
226:
227: Pname nce;
228: if(name::free) {
229: for (nce = name::free;nce->n_tbl_list;nce = nce->n_tbl_list) ; /* just chase */
230: nce->n_tbl_list = name::new_free;
231: } else name::free = name::new_free;
232: name::new_free = 0;
233: }
234:
235: static char rcsinfo[] = "$Header: /usr3/lang/benson/work/stripped_cfront/RCS/alloc.c,v 1.1 89/11/20 08:50:09 benson Exp $";
236:
237:
238: /* $Log: alloc.c,v $
239: * Revision 1.1 89/11/20 08:50:09 benson
240: * Initial revision
241: *
242: * Revision 1.1 89/11/20 08:49:48 benson
243: * Initial revision
244: *
245: * Revision 1.1 89/11/20 08:49:25 benson
246: * Initial revision
247: *
248: * Revision 1.1 89/11/20 08:48:50 benson
249: * Initial revision
250: *
251: * Revision 1.6 89/10/05 11:37:40 benson
252: * change free-list management. Deleted things aren't recycled ever
253: * until the start of the next top level declaration.
254: *
255: * Revision 1.5 89/09/02 22:08:56 benson
256: * mark things deleted.
257: *
258: * Revision 1.4 89/07/21 16:47:01 benson
259: * add operator new/delete to expr, stmt, name that use free lists.
260: * It speeds things up enough to be worthwhile.
261: *
262: * Revision 1.3 89/07/20 17:42:10 benson
263: * Rip out chunk allocator.
264: *
265: * Revision 1.2 89/06/28 12:56:59 benson
266: * Port of changes from 2.0beta6 odi bugfixes
267: *
268: end_log
269:
270: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.