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

Volker Wysk post at volker-wysk.de
Thu Jan 25 01:40:35 AEDT 2024


Hi

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.

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
> users at lists.mercurylang.org
> https://lists.mercurylang.org/listinfo/users



More information about the users mailing list