signature MLTON_WORLD =
sig
datatype status = Clone | Original
val load: string -> 'a
val save: string -> status
val saveThread: string * Thread.Runnable.t -> unit
end
-
datatype status
specifies whether a world is original or restarted (a clone).
-
load f
loads the saved computation from file f.
-
save f
saves the entire state of the computation to the file f. The computation can then be restarted at a later time using World.load or the load-world runtime option. The call to save in the original computation returns Original and the call in the restarted world returns Clone.
-
saveThread (f, rt)
saves the entire state of the computation to the file f that will resume with thread rt upon restart.
Notes
Executables that save and load worlds are incompatible with address space layout randomization (ASLR) of the executable (though, not of shared libraries). The state of a computation includes addresses into the code and data segments of the executable (e.g., static runtime-system data, return addresses); such addresses are invalid when interpreted by the executable loaded at a different base address.
Executables that save and load worlds should be compiled with an option to suppress the generation of position-independent executables.
-
Darwin 11 (Mac OS X Lion) and higher : -link-opt -fno-PIE
Example
Suppose that save-world.sml contains the following.
open MLton.World
val _ =
case save "world" of
Original => print "I am the original\n"
| Clone => print "I am the clone\n"
Then, if we compile save-world.sml and run it, the Original branch will execute, and a file named world will be created.
% mlton save-world.sml % ./save-world I am the original
We can then load world using the load-world run time option.
% ./save-world @MLton load-world world -- I am the clone