raible@orville.nas.nasa.gov (Eric Raible) (02/15/90)
I've been running with the following fix to xscheme for SAVE/RESTORE
for several days now. It works on my large workspace.
This result is really due to others: someone (I forgot) who posted a
fix to findvmemory to not garbage collect, and to my office mate
Jeffery Hultquist, who fixed a subtle bug involving vscurrent (which
tripped him up for other reasons).
My only contribution was to recognize that his fix allowed successful
SAVE/RESTORE.
- Eric Raible (raible@nas.nasa.gov)
The Original:
findvmemory(size)
int size;
{
VSEGMENT *vseg;
/* first try garbage collecting */
gc();
/* look for a vector segment with enough space */
for (vseg = vsegments; vseg != NULL; vseg = vseg->vs_next)
if (vseg->vs_free + size < vseg->vs_top) {
if (vscurrent != NULL)
vscurrent->vs_free = vfree;
vfree = vseg->vs_free;
vtop = vseg->vs_top;
vscurrent = vseg;
return;
}
/* allocate a new vector segment and make it current */
vexpand(1);
}
============================================================================
THE FIX:
1) change getvspace (xsimage.c) to call makevmemory instead of findvmemory.
2) replace findvmemory (xsdmem.c) with the following code:
findvmemory(size)
int size;
{
gc();
makevmemory(size);
}
/* makevmemory - make vector memory (used by 'xsimage.c') */
makevmemory(size)
int size;
{
VSEGMENT *vseg;
if (vscurrent != NULL)
vscurrent->vs_free = vfree;
/* look for a vector segment with enough space */
for (vseg = vsegments; vseg != NULL; vseg = vseg->vs_next)
if (vseg->vs_free + size < vseg->vs_top) {
vfree = vseg->vs_free;
vtop = vseg->vs_top;
vscurrent = vseg;
return;
}
/* allocate a new vector segment and make it current */
vexpand(1);
}