Mercurial > audlegacy
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 } |