Hi All,
a number of people are being affected by
crashes on snapshotting the image, the worst possible
time for a crash. There is a bug in the new compactor
that unfortunately bites when saving. The compactor
is invoked as part of a full garbage collect after the
garbage collector has feed unreachable objects.
Normally the new compactor makes only a single pass
through the heap, which may not move all the objects
that are possible to move. (The amount of objects
that can be moved in a single pass is limited by
available free space.) But on snapshot the compactor
makes as may passes as are necessary to slide all
movable objects down as far as possible.
Unfortunately there is a bug in this second pass.
Fixing this bug is now my priority. I have an
example image from Esteban Lorenzano to test. I am
asking anyone else that can provide an image that
reliably crashes when trying to save it to make the
image and changes available to me for testing if
possible.
In the mean time one may be able to work around the
problem by doing a full garbage collect before
snapshot. This should do a GC with a single
compaction pass which should not fail, and then make
it much more likely that the GC during snapshot will
do a single compaction pass, since fewer objects
should be mobile after the single pass compaction in
the explicit GC.
To do this in Pharo I would put a full gc here:
SessionManager>>snapshot: save andQuit:
quit
|
isImageStarting snapshotResult |
ChangesLog
default logSnapshot: save andQuit: quit.
>> SmalltalkImage
current primitiveGarbageCollect.
self
currentSession stop: quit. "Image not usable from here until
the session is restarted!"
...
In Squeak I would put a full GC here:
snapshot: save andQuit: quit withExitCode:
exitCode embedded: embeddedFlag
"Mark the
changes file and close all files as part of
#processShutdownList.
If save is
true, save the current state of this Smalltalk in
the image file.
If quit is
true, then exit to the outer OS shell.
If exitCode is
not nil, then use it as exit code.
The latter part
of this method runs when resuming a previously saved
image. This resume logic checks for a document file
to process when starting up."
| resuming msg
|
Object
flushDependents.
Object
flushEvents.
...
Smalltalk
processShutDownList: quit.
>>
SmalltalkImage current primitiveGarbageCollect.
Cursor write
show.
save ifTrue:
[resuming := embeddedFlag
ifTrue: [self
snapshotEmbeddedPrimitive]
ifFalse: [self
snapshotPrimitive]] "<-- PC frozen here on image
file"
ifFalse:
[resuming := false].
I do apologise for the bug. I hope it will be
fixed within a few days.