[m-rev.] for review: add example of calling Mercury libraries from Java

Julien Fischer jfischer at opturion.com
Mon Dec 15 16:41:11 AEDT 2014


Hi Paul,

On Mon, 15 Dec 2014, Paul Bone wrote:

> On Fri, Dec 05, 2014 at 10:49:27PM +1100, Paul Bone wrote:
>>
>> In a workspace on my machine I've fixed the issue with creating the thread
>> pool.  However there are some assumptions inside MercuryThreadPool that I
>> made and will take longer to fix.  It looks as if the simplest fix will be
>> to require users to call something to close the thread pool when they're
>> finished with it.  So I can make the new MercuryRuntime class have a method
>> called finalise() that does both run_finalisers() and stops the thread pool
>> (if it's been started).  The more complicated solution is to make the thread
>> pool threads "daemon" threads, which is Java-speak meaning that the threads
>> will exit of the main thread exits.  The problem with that is that it may
>> differ from other Mercury backends.  I beleive that we want all backends to
>> wait for thread.spawn tasks to finish before finishing themselves, and
>> depending on the application some of these tasks may need to write and close
>> files.
>>
>> I'm leaning towards the first solution, especially since there would be a
>> run_finalisers() function anyway.  Does anyone see any problems with that?
>>
>
> I have a change to add a MercuryRuntime class with a finalise() method.
> However I've also found a mechanism in Java that allows me to run an
> "atexit"-like task.  This needs me to modify the way the thread pool works
> because "atexit"

Do you mean Runtime.addShutdownHook?

>  won't run unless the JVM is shutting down, and the JVM won't shutdown
>  while non-daemon threads are running (unless the user calls exit()).
>  And the threads used by the thread pool are non-daemon threads.  I
>  can't make them daemon threads without either breaking the
>  requirement that the program waits for all threads to finish before
>  exiting or adding extra synchronisation.
>
>
> It's easy enough to fix but it's a lower priority than some other work so
> I'm happy to leave it for now.  If I implement it I will still keep the
> finalise() method in case someone wants to explicitly run finalisers and
> shutdown.

I don't think you should be doing any automatic finalisation (or indeed
otherwise ineferering with the JVM instance any more than is absolutely
necessary to get the Mercury code running).  I would leave finalisation
of the Mercury runtime up to the programmer.

> The only problem with requiring users to finalise the runtime explicitly is
> if the main thread throws an exception and therefore skips the call to
> finalise() then the JVM won't exit.  This can be worked-around by using
> a finally block:
>
>    public void main(String[] args) {
>        try {
>            // Run program
>        }
>        finally {
>            MercuryRuntime.finalise();
>        }
>
>        System.exit(MercuryRuntime.getExitStatus());
>    }

So long as that's documented then it doesn't seem a problem.

Cheers,
Julien.



More information about the reviews mailing list