The Storage object for the MOZ is the first object to be run. It loads
all the classes it can find when its start
method is run and sets
up dictionaries and such so other objects can find each other.
MOZ is disk based, that is, there is no loading of objects at the beginning of the MOZ, besides some of the one-instance objects.
This turns out to be quite trivial in Oz: when objects are loaded, they are pointed to by a weak dictionary. When they are no longer pointed to by anything else, the weak dictionary facility is used to save them to disk.
After the main program loads the Storage object, it loads the Server object and runs that. Everything else is loaded from there as needed.
When an object is loaded, any of its attributes that are of type
objectRef
(as defined in the exports
list) are
instantiated not with the appropriate object wrapper but with a
procedure defined by the Storage object that checks if the object is
currently actually loaded from disk. If it is, the procedure
returns the wrapper. If not, the procedure loads the object from
disk and then returns the wrapper if not.
A full-shutdown save process goes as follows (individual object saves
can be inferred): for each entry in the dictionary that maps objects to
file names, call the object's toRecord
and save the result of
that to the appropriately named file.
Objects are stored in files named <num>.obj, where <num> is a number that is only used internally. These files are saved in direcories named after the class of the object.