[asterisk-dev] Forking after threading

Simon Perreault simon.perreault at viagenie.ca
Thu Sep 20 10:46:23 CDT 2007


Hi,

Currently Asterisk's main() does something like this:

ast_event_init(...);	/* create event thread */
daemon(0,0);		/* fork */
pthread_init(...);	/* create other misc. threads */

This causes Asterisk to not work on FreeBSD. It's a well known bug [1]. 
However, it doesn't seem that it will be resolved soon since the behavior of 
that style of coding (i.e. forking after threading) is undefined in POSIX.

So I made this tiny change to Asterisk, which I humbly submit to this list for 
conideration. There are many implications to this change and it will need 
much scrutiny.

What do you think of it?

Thanks,
Simon

[1] http://www.freebsd.org/cgi/query-pr.cgi?pr=threads/101323

--- main/asterisk.c (revision 83228)
+++ main/asterisk.c (working copy)
@@ -2541,7 +2541,6 @@
    ast_alaw_init();
    callerid_init();
    ast_builtins_init();
-   ast_event_init();
    ast_utils_init();
    tdd_init();
    /* When Asterisk restarts after it has dropped the root privileges,
@@ -2841,6 +2840,9 @@
    if (test_for_thread_safety())
        ast_verbose("Warning! Asterisk is not thread safe.\n");

+   /* Start event thread after forking. */
+   ast_event_init();
+
    ast_makesocket();
    sigemptyset(&sigs);
    sigaddset(&sigs, SIGHUP);



More information about the asterisk-dev mailing list