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