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

Volker Wysk post at volker-wysk.de
Wed Jan 24 05:11:21 AEDT 2024


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


More information about the users mailing list