Re: [m-users.] Calling exit(3) from a foreign predicate

Mark Brown <[email protected]> Thu, 25 Jan 2024 13:31:56 +1100
Newsgroups gmane.comp.lang.mercury.general
Message-ID <CAM4AczBgN-e8OMj-5_Kvs-8zgfzBHV3a-CQPATkPNUtYOio=CQ@mail.gmail.com>
On Thu, Jan 25, 2024 at 1:40 AM Volker Wysk <[email protected]> wrote:
> Calling exit(3), without calling mercury_runtime_terminate() before, works.
> All thread are terminated and the program exits. It's only
> mercury_runtime_terminate() that blocks. I've read somewhere that it waits
> for all threads to terminate. Is there another function which doesn't? I'd
> like to properly shut down the Mercury runtime, if possible.

How was it started in the first place? If you entered via main/2 then
in principle the "proper" way to leave would be by exiting main/2. If
you used the standalone interface then mercury_terminate() is
documented right after mercury_init() in the User's Guide.

Do you have a situation (as in the GLUT example) where the existing
interfaces don't work?

Mark

>
> Volker
>
> Am Dienstag, dem 23.01.2024 um 19:11 +0100 schrieb Volker Wysk:
> > Am Donnerstag, dem 20.07.2023 um 20:31 +1000 schrieb Julien Fischer:
> > > On Thu, 20 Jul 2023, Volker Wysk wrote:
> > >
> > > > Just a short question:
> > > >
> > > > May a foreign predicate call the exit(3) function?
> > >
> > > A foreign predicate can do that, there's nothing the Mercury compiler
> > > can do to stop it.
> > >
> > > > Or does Mercury need a proper shutdown?
> > >
> > > Calling exit() directly will bypass the usual shutdown of the Mercury
> > > runtime. Among the effects of that will be:
> > >
> > > - Finalizers will not be run.
> > > - The Mercury exit status will not be returned to the OS.
> > >
> > > If for some reason, you do want to call exit() from a foreign predicate,
> > > I would suggest something like the following:
> > >
> > >       exit(mercury_runtime_terminate());
> >
> > I have multiple threads, and the mercury_runtime_terminate() call hangs. It
> > doesn't hang if there aren't any (additional) threads. I also get this
> > sometimes:
> >
> > fis: mercury_context.c:2571: action_shutdown_ws_engine: Assertion `engine_id
> > != 0' failed.
> >
> > Do you know a way to kill all threads? I've searched the web for a long time
> > and couldn't find any. (There's a page from IBM, but that seems to apply
> > only to AIX. It doesn't work that way in Linux.) I've also looked at
> > mercury_wrapper.h, mercury_thread.h and mercury_threadscope.h.
> >
> > >
> > > (mercury_runtime_terminate() is declared in runtime/mercury_wrapper.h)
> > >
> > > The only time I've wanted to something similar was from within the
> > > event loop of the old GLUT library, where there that library provided
> > > no way of getting out of the event loop. (See the quit/2 predicate
> > > in extras/graphics/mercury_glut/glut.m.)
> > >
> > > In general, given the choice, I would simply throw an exception that is
> > > caught be a top-level exception handler in main/2 and exit (normally)
> > > that way.
> >
> > I've tried this. It looks like the program doesn't exit while there are
> > still running threads. Those can be long-running, so I need to kill them
> > asynchronously.
> >
> > Cheers,
> > Volker
> > _______________________________________________
> > users mailing list
> > [email protected]
> > https://lists.mercurylang.org/listinfo/users
>
> _______________________________________________
> users mailing list
> [email protected]
> https://lists.mercurylang.org/listinfo/users
_______________________________________________
users mailing list
[email protected]
https://lists.mercurylang.org/listinfo/users