[mercury-users] Way to exit immediately from a Mercury program?
Julien Fischer
juliensf at cs.mu.OZ.AU
Thu Apr 27 16:13:58 AEST 2006
On Thu, 27 Apr 2006, Jonathan Morgan wrote:
> On 4/27/06, Julien Fischer <juliensf at cs.mu.oz.au> wrote:
> >
> > On Thu, 27 Apr 2006, Jonathan Morgan wrote:
> >
> > > On 4/26/06, Julien Fischer <juliensf at cs.mu.oz.au> wrote:
> > > > That's what we do in the GLUT binding (see
> > > > extras/graphics/mercury_glut/glut.m), defining exit similar to the
> > > > following:
> > > >
> > > > :- pragma foreign_proc("C",
> > > > exit(_IO0::di, _IO::uo),
> > > > [will_not_call_mercury, promise_pure],
> > > > "
> > > > exit(mercury_runtime_terminate());
> > > > ").
> > >
> > > Is it necessary to terminate the runtime? What happens if you don't?
> >
> > Finalizers may not be run, your program may return the wrong exit status
> > to the OS, trace counts or deep profiles may not be written etc.
>
> All of which can cause problems. Another thought: is there a similar
> termination function for the IL/Java backends?
For the Java backend no. I'm not sure what the IL backend does.
> > > > It should be noted, among other things, that terminating a program this
> > > > way will stuff up the deep profiler (and most probably isn't that great
> > > > if you wish to use the debugger either).
> > >
> > > Does this mean that these tools can't be used usefully used with
> > > various GUI toolkits? (I don't think GLUT is the only one that is
> > > likely to need such treatment).
> >
> > GLUT is something of a special case because glutMainLoop() never returns and
> > there isn't a quit event processing event or similar to break out of it
> > cleanly. Throwing an exception from within one of the callbacks and catch it
> > at the top-level seems to work (at least on x86-linux) but I didn't do that
> > when I wrote it because:
> >
> > (1) throwing exceptions across the C interface isn't recommended
> >
> > (2) it wasn't clear how GLUT would react if you then tried to re-enter the
> > main loop (from the look of the source code it would probably be
> > fine).
>
> I'm interested because Gtk+ also has a main loop that is never
> returned from. As I currently have it (which is the same as the C
> Gtk+ way of handling it) the Gtk quit must be called from the (main
> window) destroy event, otherwise the application will never terminate.
> I have not done any calling of Mercury termination functions, and
> it's not entirely clear to me where such calls should go, and whether
> the exit status works nicely with Gtk's cleanup functions.
IIRC, gtk has functions that allow you to run one (or a fixed number of)
iteration(s) of the main loop. It might be possible to bypass gtk's main
loop and implement your own at the Mercury level.
Julien.
--------------------------------------------------------------------------
mercury-users mailing list
post: mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe: Address: mercury-users-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------
More information about the users
mailing list