The PolyML.Statistics structure provides a way for a program to read information about the run-time system. As well as getting information about the local Poly/ML process it is also possible to get information about another Poly/ML process being run by the same user.
structure Statistics:
sig
val getLocalStats : unit ->
{sizeHeap: int,
gcFullGCs: int,
timeGCUser: Time.time,
threadsInML: int,
gcPartialGCs: int,
threadsTotal: int,
timeGCSystem: Time.time,
userCounters: int vector,
threadsWaitIO: int,
timeNonGCUser: Time.time,
sizeAllocation: int,
timeNonGCSystem: Time.time,
threadsWaitMutex: int,
threadsWaitSignal: int,
sizeAllocationFree: int,
sizeHeapFreeLastGC: int,
threadsWaitCondVar: int,
sizeHeapFreeLastFullGC: int}
val getRemoteStats : int ->
{sizeHeap: int,
gcFullGCs: int,
timeGCUser: Time.time,
threadsInML: int,
gcPartialGCs: int,
threadsTotal: int,
timeGCSystem: Time.time,
userCounters: int vector,
threadsWaitIO: int,
timeNonGCUser: Time.time,
sizeAllocation: int,
timeNonGCSystem: Time.time,
threadsWaitMutex: int,
threadsWaitSignal: int,
sizeAllocationFree: int,
sizeHeapFreeLastGC: int,
threadsWaitCondVar: int,
sizeHeapFreeLastFullGC: int}
val setUserCounter : int * int -> unit
val numUserCounters : unit -> int
end
There are two functions that return information..
val getLocalStats : unit -> { ... }
val getRemoteStats : int -> { ... }
Returns information about another Poly/ML process. The argument is the process id (pid) of the Poly/ML process for which information is requested. Raises the Fail exception if this is not a currently running Poly/ML process or the calling user does not have permission to read the statistics. The statistics are held in shared memory and on Unix systems these are memory-mapped files in the user's .polyml directory.
The actual information returned is still being determined and may well change.
In addition to information about the run-time system the statistics mechanism provides a small array of values that can be set by the ML code. This allows an ML program to set values that can be read in another process.
val numUserCounters : unit -> int
Returns the number of counters available. Currently this is eight.
val setUserCounter : int * int -> unit
setUserCounter(n, m) stores the value m in the n-th counter.
Writing to the counters is potentially an expensive operation. If the information is likely to change rapidly it will usually be best to use a separate thread to poll the information periodically and update the counter.