18 |
|
#include "object.h" |
19 |
|
#include "otypes.h" |
20 |
|
|
21 |
+ |
#ifndef OBJMEMOPT |
22 |
+ |
#define OBJMEMOPT 1 /* optimize object block memory? */ |
23 |
+ |
#endif |
24 |
|
|
25 |
|
OBJREC *objblock[MAXOBJBLK]; /* our objects */ |
26 |
|
OBJECT nobjects = 0; /* # of objects */ |
175 |
|
} |
176 |
|
|
177 |
|
|
178 |
+ |
static void |
179 |
+ |
optimize_objblock(int i) /* consolidate memory in object block */ |
180 |
+ |
{ |
181 |
+ |
#if OBJMEMOPT |
182 |
+ |
OBJREC *o, *co; |
183 |
+ |
int n = 0; |
184 |
+ |
unsigned long sargcnt = 0, iargcnt = 0, fargcnt = 0, namecnt = 0; |
185 |
+ |
|
186 |
+ |
if (i < 0 || objblock[i] == NULL || objblock[i][OBJBLKSIZ].otype < 0) |
187 |
+ |
return; /* invalid or already flagged */ |
188 |
+ |
|
189 |
+ |
for (o = objblock[i]+OBJBLKSIZ; o-- > objblock[i]; ) { |
190 |
+ |
if (o->oname == NULL) /* too early to optimize? */ |
191 |
+ |
return; |
192 |
+ |
if (o->os != NULL) /* too late to optimize? */ |
193 |
+ |
return; |
194 |
+ |
n += (o->oargs.nsargs > 0) | (o->oargs.nfargs > 0); |
195 |
+ |
sargcnt += o->oargs.nsargs; |
196 |
+ |
fargcnt += o->oargs.nfargs; |
197 |
+ |
#ifdef IARGS |
198 |
+ |
iargcnt += o->oargs.niargs; |
199 |
+ |
#endif |
200 |
+ |
namecnt += strlen(o->oname)+1; |
201 |
+ |
} |
202 |
+ |
if (n < OBJBLKSIZ/10) /* never happens? */ |
203 |
+ |
return; |
204 |
+ |
/* prep consolidation object */ |
205 |
+ |
co = objblock[i]+OBJBLKSIZ; |
206 |
+ |
co->oargs.nsargs = sargcnt; |
207 |
+ |
co->oargs.nfargs = fargcnt; |
208 |
+ |
if ((co->oargs.nsargs != sargcnt) | (co->oargs.nfargs != fargcnt)) |
209 |
+ |
return; /* overrun condition */ |
210 |
+ |
|
211 |
+ |
co->oname = (char *)malloc(sizeof(char)*namecnt); |
212 |
+ |
co->oargs.sarg = (char **)malloc(sizeof(char *)*sargcnt); |
213 |
+ |
co->oargs.farg = (RREAL *)malloc(sizeof(RREAL)*fargcnt); |
214 |
+ |
if ((co->oname == NULL) | (co->oargs.sarg == NULL) | |
215 |
+ |
(co->oargs.farg == NULL)) { |
216 |
+ |
free(co->oname); |
217 |
+ |
free(co->oargs.sarg); free(co->oargs.farg); |
218 |
+ |
return; /* insufficient memory */ |
219 |
+ |
} |
220 |
+ |
#ifdef IARGS |
221 |
+ |
co->oargs.niargs = iargcnt; |
222 |
+ |
co->oargs.iarg = (long *)malloc(sizeof(long)*iargcnt); |
223 |
+ |
if (co->oargs.iarg == NULL) { |
224 |
+ |
free(co->oname); |
225 |
+ |
free(co->oargs.sarg); free(co->oargs.farg); |
226 |
+ |
return; /* insufficient memory */ |
227 |
+ |
} |
228 |
+ |
iargcnt = 0; |
229 |
+ |
#endif |
230 |
+ |
namecnt = sargcnt = fargcnt = 0; |
231 |
+ |
for (o = objblock[i]+OBJBLKSIZ; o-- > objblock[i]; ) { |
232 |
+ |
n = strlen(o->oname)+1; |
233 |
+ |
memcpy(co->oname + namecnt, o->oname, n); |
234 |
+ |
freeqstr(o->oname); |
235 |
+ |
o->oname = co->oname + namecnt; |
236 |
+ |
namecnt += n; |
237 |
+ |
if (o->oargs.nsargs) { |
238 |
+ |
memcpy(co->oargs.sarg+sargcnt, o->oargs.sarg, |
239 |
+ |
sizeof(char *)*o->oargs.nsargs); |
240 |
+ |
free(o->oargs.sarg); |
241 |
+ |
o->oargs.sarg = co->oargs.sarg + sargcnt; |
242 |
+ |
sargcnt += o->oargs.nsargs; |
243 |
+ |
} |
244 |
+ |
if (o->oargs.nfargs) { |
245 |
+ |
memcpy(co->oargs.farg+fargcnt, o->oargs.farg, |
246 |
+ |
sizeof(RREAL)*o->oargs.nfargs); |
247 |
+ |
free(o->oargs.farg); |
248 |
+ |
o->oargs.farg = co->oargs.farg + fargcnt; |
249 |
+ |
fargcnt += o->oargs.nfargs; |
250 |
+ |
} |
251 |
+ |
#ifdef IARGS |
252 |
+ |
if (o->oargs.niargs) { |
253 |
+ |
memcpy(co->oargs.iarg+iargcnt, o->oargs.iarg, |
254 |
+ |
sizeof(long)*o->oargs.niargs); |
255 |
+ |
free(o->oargs.iarg); |
256 |
+ |
o->oargs.iarg = co->oargs.iarg + iargcnt; |
257 |
+ |
iargcnt += o->oargs.niargs; |
258 |
+ |
} |
259 |
+ |
#endif |
260 |
+ |
} |
261 |
+ |
co->otype = -1; /* flag for optimized block */ |
262 |
+ |
#endif |
263 |
+ |
} |
264 |
+ |
|
265 |
+ |
|
266 |
|
OBJECT |
267 |
|
newobject(void) /* get a new object */ |
268 |
|
{ |
269 |
|
int i; |
270 |
|
|
271 |
|
if ((nobjects & (OBJBLKSIZ-1)) == 0) { /* new block */ |
181 |
– |
errno = 0; |
272 |
|
i = nobjects >> OBJBLKSHFT; |
273 |
+ |
optimize_objblock(i-1); /* optimize previous block */ |
274 |
+ |
errno = 0; |
275 |
|
if (i >= MAXOBJBLK) |
276 |
|
return(OVOID); |
277 |
< |
objblock[i] = (OBJREC *)calloc(OBJBLKSIZ, sizeof(OBJREC)); |
277 |
> |
objblock[i] = (OBJREC *)calloc(OBJBLKSIZ+OBJMEMOPT, |
278 |
> |
sizeof(OBJREC)); |
279 |
|
if (objblock[i] == NULL) |
280 |
|
return(OVOID); |
281 |
|
} |
300 |
|
for (obj = firstobj+nobjs; obj-- > firstobj; ) { |
301 |
|
OBJREC *o = objptr(obj); |
302 |
|
free_os(o); /* free client memory */ |
303 |
< |
freeqstr(o->oname); |
304 |
< |
freefargs(&o->oargs); |
305 |
< |
memset((void *)o, '\0', sizeof(OBJREC)); |
303 |
> |
if (!OBJMEMOPT || !objblock[obj>>OBJBLKSHFT][OBJBLKSIZ].otype) { |
304 |
> |
freeqstr(o->oname); |
305 |
> |
freefargs(&o->oargs); |
306 |
> |
} |
307 |
> |
memset(o, 0, sizeof(OBJREC)); |
308 |
|
} |
309 |
|
/* free objects off end */ |
310 |
|
for (obj = nobjects; obj-- > 0; ) |
315 |
|
while (nobjects > obj) /* free empty end blocks */ |
316 |
|
if ((--nobjects & (OBJBLKSIZ-1)) == 0) { |
317 |
|
int i = nobjects >> OBJBLKSHFT; |
318 |
< |
free((void *)objblock[i]); |
318 |
> |
/* consolidated block? */ |
319 |
> |
if (OBJMEMOPT && objblock[i][OBJBLKSIZ].otype < 0) { |
320 |
> |
free(objblock[i][OBJBLKSIZ].oname); |
321 |
> |
freefargs(&objblock[i][OBJBLKSIZ].oargs); |
322 |
> |
} |
323 |
> |
free(objblock[i]); |
324 |
|
objblock[i] = NULL; |
325 |
|
} |
326 |
|
truncobjndx(); /* truncate modifier look-up */ |