comparison src/audacious/signals.c @ 2486:113f75c7b0ce trunk

[svn] - make SIGTERM handler always work.
author yaz
date Wed, 07 Feb 2007 21:08:20 -0800
parents ad1d7687814c
children 021321cb5426
comparison
equal deleted inserted replaced
2485:5ce3c51d4499 2486:113f75c7b0ce
30 #include <signal.h> 30 #include <signal.h>
31 31
32 #include "main.h" 32 #include "main.h"
33 #include "ui_main.h" 33 #include "ui_main.h"
34 #include "signals.h" 34 #include "signals.h"
35
36 GCond *exit_cond;
37 GMutex *exit_mutex;
35 38
36 typedef void (*SignalHandler) (gint); 39 typedef void (*SignalHandler) (gint);
37 40
38 static SignalHandler 41 static SignalHandler
39 signal_install_handler_full (gint signal_number, 42 signal_install_handler_full (gint signal_number,
101 104
102 static void 105 static void
103 sigterm_handler (gint signal_number) 106 sigterm_handler (gint signal_number)
104 { 107 {
105 cfg.terminate = TRUE; 108 cfg.terminate = TRUE;
109 g_cond_signal(exit_cond);
106 } 110 }
107 111
108 static gboolean 112 static void *
109 signal_process_events (gpointer data) 113 signal_process_events (void *data)
110 { 114 {
111 if (cfg.terminate == TRUE) 115 while (1) {
112 { 116 if (cfg.terminate == TRUE)
113 g_message("Audacious has received SIGTERM and is shutting down."); 117 {
114 mainwin_quit_cb(); 118 g_print("Audacious has received SIGTERM and is shutting down.\n");
115 return FALSE; 119 mainwin_quit_cb();
120 }
121 g_mutex_lock(exit_mutex);
122 g_cond_wait(exit_cond, exit_mutex);
123 g_mutex_unlock(exit_mutex);
116 } 124 }
117 125
118 return TRUE; 126 return NULL;
119 } 127 }
120 128
121 void 129 void
122 signal_handlers_init (void) 130 signal_handlers_init (void)
123 { 131 {
124 char *magic; 132 char *magic;
125 magic = getenv("AUD_ENSURE_BACKTRACE"); 133 magic = getenv("AUD_ENSURE_BACKTRACE");
134
135 exit_cond = g_cond_new();
136 exit_mutex = g_mutex_new();
126 137
127 signal_install_handler(SIGPIPE, signal_empty_handler); 138 signal_install_handler(SIGPIPE, signal_empty_handler);
128 signal_install_handler(SIGINT, sigterm_handler); 139 signal_install_handler(SIGINT, sigterm_handler);
129 signal_install_handler(SIGTERM, sigterm_handler); 140 signal_install_handler(SIGTERM, sigterm_handler);
130 141
131 /* in particular environment (maybe with glibc 2.5), core file 142 /* in particular environment (maybe with glibc 2.5), core file
132 through signal handler doesn't contain useful back trace. --yaz */ 143 through signal handler doesn't contain useful back trace. --yaz */
133 if (magic == NULL) 144 if (magic == NULL)
134 signal_install_handler(SIGSEGV, sigsegv_handler); 145 signal_install_handler(SIGSEGV, sigsegv_handler);
135 146
136 g_timeout_add(100, signal_process_events, NULL); 147 g_thread_create(signal_process_events, NULL, FALSE, NULL);
148
137 } 149 }