Re: [m-users.] Calling exit(3) from a foreign predicate
Volker Wysk <[email protected]> Tue, 23 Jan 2024 19:11:21 +0100
| Newsgroups | gmane.comp.lang.mercury.general |
|---|---|
| Message-ID | <[email protected]> |
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