On 13/08/2012 22:47, Phil Clayton wrote:
According to profiling messages that I'm generating, when a stand-alone executable terminates, any remaining finalizers (added with CInterface.setFinal) are not run. Consequently, resources that should be freed may not be. I think I would probably expect the semantics of finalizers to be such that they are run at some point before the program terminates. Does that sound sensible?
This can be worked around easily, for example by creating a variant of PolyML.export that adds a final PolyML.fullGC to the exported function (for both normal and exception paths). However, there is the question of whether, on termination, a full GC is needed or does a call to each finalizer suffice. If it is the latter, the work-around with an explicit GC does more work than required.
I've been wondering about this. It would be fairly simple to have the close-down routine go over the list of "vols" and call the finalisation on them. Since finalisation on vols is always done by calling a C function it shouldn't be too much of a problem.
Of course, this leaves open the possibility that there might be a crash or other failure that means that the finalisations still don't get called.
David