]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
automerge commit
authorAutomerge Script <automerge@asterisk.org>
Sat, 24 Feb 2007 00:20:55 +0000 (00:20 +0000)
committerAutomerge Script <automerge@asterisk.org>
Sat, 24 Feb 2007 00:20:55 +0000 (00:20 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2-netsec@56547 65c4cc65-6c06-0410-ace0-fbb531ad65f3

asterisk.c

index 763f56a8884c4a365783a4f89721bc3c6ac8eed7..228a1acd589d835e85146768963e08b66bb08c35 100644 (file)
@@ -234,7 +234,11 @@ static int shuttingdown = 0;
 static int restartnow = 0;
 static pthread_t consolethread = AST_PTHREADT_NULL;
 
-static unsigned int need_reload;
+static int sig_alert_pipe[2] = { -1, -1 };
+static struct {
+        unsigned int need_reload:1;
+        unsigned int need_quit:1;
+} sig_flags;
 
 #if !defined(LOW_MEMORY)
 struct file_version {
@@ -745,11 +749,14 @@ static void urg_handler(int num)
 
 static void hup_handler(int num)
 {
+       int a = 0;
        if (option_verbose > 1) 
                printf("Received HUP signal -- Reloading configs\n");
        if (restartnow)
                execvp(_argv[0], _argv);
-       need_reload = 1;
+       sig_flags.need_reload = 1;
+       if (sig_alert_pipe[1] != -1)
+               write(sig_alert_pipe[1], &a, sizeof(a));
        signal(num, hup_handler);
 }
 
@@ -942,7 +949,12 @@ static void quit_handler(int num, int nice, int safeshutdown, int restart)
 
 static void __quit_handler(int num)
 {
-       quit_handler(num, 0, 1, 0);
+       int a = 0;
+       sig_flags.need_quit = 1;
+       if (sig_alert_pipe[1] != -1)
+               write(sig_alert_pipe[1], &a, sizeof(a));
+       /* There is no need to restore the signal handler here, since the app
+        * is going to exit */
 }
 
 static const char *fix_header(char *outbuf, int maxout, const char *s, char *cmp)
@@ -1817,11 +1829,6 @@ static void ast_remotecontrol(char * data)
                                }
                        }
                }
-
-               if (need_reload) {
-                       need_reload = 0;
-                       ast_module_reload(NULL);
-               }
        }
        printf("\nDisconnected from Asterisk server\n");
 }
@@ -2005,6 +2012,26 @@ static void ast_readconfig(void) {
        ast_config_destroy(cfg);
 }
 
+static void *monitor_sig_flags(void *unused)
+{
+       for (;;) {
+               struct pollfd p = { sig_alert_pipe[0], POLLIN, 0 };
+               int a;
+               poll(&p, 1, -1);
+               if (sig_flags.need_reload) {
+                       sig_flags.need_reload = 0;
+                       ast_module_reload(NULL);
+               }
+               if (sig_flags.need_quit) {
+                       sig_flags.need_quit = 0;
+                       quit_handler(0, 0, 1, 0);
+               }
+               read(sig_alert_pipe[0], &a, sizeof(a));
+       }
+
+       return NULL;
+}
+
 int main(int argc, char *argv[])
 {
        int c;
@@ -2403,6 +2430,10 @@ int main(int argc, char *argv[])
                ast_verbose(term_color(tmp, "Asterisk Ready.\n", COLOR_BRWHITE, COLOR_BLACK, sizeof(tmp)));
        if (option_nofork)
                consolethread = pthread_self();
+
+       if (pipe(sig_alert_pipe))
+               sig_alert_pipe[0] = sig_alert_pipe[1] = -1;
+
        fully_booted = 1;
        pthread_sigmask(SIG_UNBLOCK, &sigs, NULL);
 #ifdef __AST_DEBUG_MALLOC
@@ -2414,6 +2445,14 @@ int main(int argc, char *argv[])
                /* Console stuff now... */
                /* Register our quit function */
                char title[256];
+               pthread_attr_t attr;
+               pthread_t dont_care;
+
+               pthread_attr_init(&attr);
+               pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+               ast_pthread_create(&dont_care, &attr, monitor_sig_flags, NULL);
+               pthread_attr_destroy(&attr);
+
                set_icon("Asterisk");
                snprintf(title, sizeof(title), "Asterisk Console on '%s' (pid %d)", hostname, ast_mainpid);
                set_title(title);
@@ -2439,21 +2478,10 @@ int main(int argc, char *argv[])
                                        break;
                                }
                        }
-                       if (need_reload) {
-                               need_reload = 0;
-                               ast_module_reload(NULL);
-                       }
-               }
-       }
-       /* Do nothing */
-       for(;;)  {      /* apparently needed for the MACos */
-               struct pollfd p = { -1 /* no descriptor */, 0, 0 };
-               poll(&p, 0, -1);
-               /* SIGHUP will cause this to break out of poll() */
-               if (need_reload) {
-                       need_reload = 0;
-                       ast_module_reload(NULL);
                }
        }
+
+       monitor_sig_flags(NULL);
+
        return 0;
 }