On 15/08/12 15:27, David Matthews wrote:
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.
After some more thought, I'm starting to think that this may be the way
to go, with no guarantee that finalizers occur in a particular order.
That is because I'm not sure that the alternative, with a full final GC,
helps ordered finalizers. At the moment, I can't see how finalizers can
be ordered other than by using callbacks from finalizers. That requires
callback objects to exist at termination, but then there needs to be
some automatic GC of callback objects as other finalizers could be
blocked otherwise (because their vol is reference by the callback
function). Automatic GC of callback objects is generally difficult
because there is no way to know whether they will be called from C at a
future point.
At present, using a final full GC isn't going to work because callbacks
are never garbage collected, as mentioned in another message.
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.
That sounds fair enough. I don't think it is worse than the current
situation when calling C functions.
Phil
_______________________________________________
polyml mailing list
[email protected]
http://lists.inf.ed.ac.uk/mailman/listinfo/polyml