[Cuis] image segments
H. Hirzel
hannes.hirzel at gmail.com
Thu Nov 26 09:16:29 CST 2015
That's interesting,
see also http://wiki.squeak.org/squeak/2316 with a reference to an
article evaluation ImageSegments at the end.
On 11/26/15, Luciano Notarfrancesco <luchiano at gmail.com> wrote:
> Cool, maybe it's possible to make it into a package, I'll take a look.
>
> I've never used it to store Projects, tho.. I used before to store things
> that must be loaded very fast on demand and can be forgotten once there are
> no more references to them.. like image fragments that compose a map of the
> world, and small sound fragments that are used to synthesize speech
> (diphones). Yesterday I just wanted to know how big are my objects, and I
> wanted to make some experiments to see how the bit-size of my objects grow
> as the problems I'm modeling grow by some other measure (degree of
> polynomials, size of matrices are the most basic) and to know how much
> memory are my algorithms actually using at every step... image segments are
> ideal for this, you can use them to know exactly how much memory would be
> freed if a reference to a given object were forgotten.
>
>
> On Thu, Nov 26, 2015 at 7:36 AM, H. Hirzel <hannes.hirzel at gmail.com> wrote:
>
>> Squeak 5.0 still has ImageSegments (class comment below). Saving and
>> loading of projects currently is blocked in Squeak because of an
>> unfinished name space (environments implementation).
>>
>> http://wiki.squeak.org/squeak/6218
>>
>> And there is Fuel
>> http://rmod.inria.fr/web/software/Fuel
>>
>> ----------
>>
>> ImageSegment
>>
>> I represent a segment of Squeak address space. I am created from an
>> array of root objects. After storing, my segment contains a binary
>> encoding of every object accessible from my roots but not otherwise
>> accessible from anywhere else in the system. My segment contains
>> outward pointers that are indices into my table of outPointers.
>> On load my segment is converted back into objects and becommed
>> into an Array of the loaded objects, so they can be enumerated.
>>
>> The main use of ImageSegments is to store Projects. A dummy
>> version of SmartRefStream traverses the Project. Everything it finds
>> is classified as either an object that is owned by the project (only
>> pointed to inside the project), or an object outside the project that
>> is pointed to from inside the project. The objects that are
>> completely owned by the project are compressed into pure binary form
>> in an ImageSegment. The outside objects are put in the 'outPointers'
>> array. The entire ImageSegment (binary part plus outPointers) is
>> encoded in a SmartRefStream, and saved on the disk. (aProject
>> exportSegmentWithChangeSet:fileName:directory:) calls (anImageSegment
>> writeForExportWithSources:inDirectory:changeSet:).
>>
>> Note that every object inside the project is put into the
>> segment's arrayOfRoots. This is because a dummy SmartRefStream to
>> scan the project, in order to make intelligent decisions about what
>> belongs in the project.
>> See Project's class comment for what messages are sent to
>> objects as they are unpacked in a new image.
>>
>> ---- Older Details ------
>>
>> The primary kind of image segment is an Export Segment. It
>> can be saved on a server and read into a completely different Squeak
>> image.
>> Old way to create one:
>> (ImageSegment new copyFromRootsForExport: (Array with: Baz with: Baz
>> class))
>> writeForExport: 'myFile.extSeg'.
>> Old way to create one for a project:
>> (Project named: 'Play With Me - 3') exportSegment.
>> To read it into another image: Select 'myFile.extSeg' in a FileList,
>> Menu 'load as project'. It will install its classes automatically.
>> If you need to see the roots array, it is temporarily stored in
>> (SmartRefStream scannedObject).
>>
>> Most of 'states' of an ImageSegment are not used to export a project,
>> and have been abandoned.
>>
>> When a segment is written out onto a file, it goes in a
>> folder called <image name>_segs. If your image is called
>> "Squeak2.6.image", the folder "Squeak2.6_segs" must accompany the
>> image whenever your move, copy, or rename it.
>> Whenever a Class is in arrayOfRoots, its class (aClass class)
>> must also be in the arrayOfRoots.
>> There are two kinds of image segments. Normal image segments
>> are a piece of a specific Squeak image, and can only be read back
>> into that image. The image holds the array of outPointers that are
>> necessary to turn the bits in the file into objects.
>> To put out a normal segment that holds a Project (not the
>> current project), execute (Project named: 'xxx') storeSegment.
>>
>>
>> arrayOfRoots The objects that head the tree we will trace.
>> segment The WordArray of raw bits of all objects in the
>> tree.
>> outPointers Oops of all objects outside the segment
>> pointed to from inside.
>> state (see below)
>> segmentName Its basic name. Often the name of a Project.
>> fileName The local name of the file. 'Foo-23.seg'
>> userRootCnt number of roots submitted by caller. Extras
>> are added in preparation for saving.
>>
>> state that an ImageSegment may exist in...
>>
>> #activeCopy (has been copied, with the intent to
>> become active)
>> arrayOfRoots, segment, and outPointers have been created by
>> copyFromRoots:. The tree of objects has been encoded in the segment,
>> but those objects are still present in the Squeak system.
>>
>> #active (segment is actively holding objects)
>> The segment is now the only holder of tree of objects. Each of the
>> original roots has been transmuted into an ImageSegmentRootStub that
>> refers back to this image segment. The original objects in the
>> segment will all be garbageCollected.
>>
>> #onFile
>> The segment has been written out to a file and replaced by a file
>> pointer. Only ImageSegmentRootStubs and the array of outPointers
>> remains in the image. To get this far:
>> (ImageSegment new copyFromRoots: (Array with: Baz with: Baz class))
>> writeToFile: 'myFile.seg'.
>>
>> #inactive
>> The segment has been brought back into memory and turned back into
>> objects. rootsArray is set, but the segment is invalid.
>>
>> #onFileWithSymbols
>> The segment has been written out to a file, along with the text of
>> all the symbols in the outPointers array, and replaced by a file
>> pointer. This reduces the size of the outPointers array, and also
>> allows the system to reclaim any symbols that are not referred to
>> from elsewhere in the image. The specific format used is that of a
>> literal array as follows:
>> #(symbol1 symbol2 # symbol3 symbol4 'symbolWithSpaces' #
>> symbol5).
>> In this case, the original outPointers array was 8 long, but the
>> compacted table of outPointers retains only two entries. These get
>> inserted in place of the #'s in the array of symbols after it is read
>> back in. Symbols with embedded spaces or other strange characters
>> are written as strings, and converted back to symbols when read back
>> in. The symbol # is never written out.
>> NOTE: All IdentitySets or dictionaries must be rehashed when
>> being read back from this format. The symbols are effectively
>> internal. (No, not if read back into same image. If a different
>> image, then use #imported. -tk)
>>
>> #imported
>> The segment is on an external file or just read in from one. The
>> segment and outPointers are meant to be read into a foreign image.
>> In this form, the image segment can be read from a URL, and
>> installed. A copy of the original array of root objects is
>> constructed, with former outPointers bound to existing objects in the
>> host system.
>> (Any Class inside the segment MUST be in the arrayOfRoots.
>> This is so its association can be inserted into Smalltalk. The
>> class's metaclass must be in roots also. Methods that are in
>> outPointers because blocks point at them, were found and added to the
>> roots.
>> All IdentitySets and dictionaries are rehashed when being
>> read back from exported segments.)
>>
>>
>> To discover why only some of the objects in a project are being
>> written out, try this (***Destructive Test***). This breaks lots of
>> backpointers in the target project, and puts up an array of
>> suspicious objects, a list of the classes of the outPointers, and a
>> debugger.
>> "Close any transcripts in the target project"
>> World currentHand objectToPaste ifNotNil: [
>> self inform: 'Hand is holding a Morph in its paste buffer:\'
>> withCRs,
>> World currentHand objectToPaste printString].
>> PV := Project named: 'xxxx'.
>> (IS := ImageSegment new) findRogueRootsImSeg:
>> (Array with: PV world presenter with: PV world).
>> IS findOwnersOutPtrs. "Optionally: write a file with owner chains"
>> "Quit and DO NOT save"
>>
>> When an export image segment is brought into an image, it is like an
>> image starting up. Certain startUp messages need to be run. These
>> are byte and word reversals for nonPointer data that comes from a
>> machine of the opposite endianness. #startUpProc passes over all
>> objects in the segment, and:
>> The first time an instance of class X is encountered, (msg _
>> X startUpFrom: anImageSegment) is sent. If msg is nil, the usual
>> case, it means that instances of X do not need special work. X is
>> included in the IdentitySet, noStartUpNeeded. If msg is not nil,
>> store it in the dictionary, startUps (aClass -> aMessage).
>> When a later instance of X is encountered, if X is in
>> noStartUpNeeded, do nothing. If X is in startUps, send the message
>> to the instance. Typically this is a message like #swapShortObjects.
>> Every class that implements #startUp, should see if it needs
>> a parallel implementation of #startUpFrom:.
>>
>> On 11/26/15, Luciano Notarfrancesco <luchiano at gmail.com> wrote:
>> > I don't see image segments in Cuis... I don't even know if they still
>> exist
>> > in Squeak... Anyone is still using it?
>> >
>> > It would be cool to have it at least as a package. If I remember
>> correctly
>> > it was very simple, like two primitives to load and save, but I think
>> > it
>> > depended on something like mark and sweep or some particular kind of
>> > garbage collector and it might not work in new VMs.
>> >
>>
>> _______________________________________________
>> Cuis mailing list
>> Cuis at jvuletich.org
>> http://jvuletich.org/mailman/listinfo/cuis_jvuletich.org
>>
>
More information about the Cuis
mailing list