Mercurial > audlegacy
annotate src/audacious/signals.c @ 2493:b7f48f00a342 trunk
[svn] - patch from Mark Glines to ad https:// URI support to playlists.
author | nenolod |
---|---|
date | Sat, 10 Feb 2007 12:29:21 -0800 |
parents | 113f75c7b0ce |
children | 021321cb5426 |
rev | line source |
---|---|
2313 | 1 /* |
2 * Audacious | |
3 * Copyright (c) 2005-2007 Audacious development team | |
4 * | |
5 * BMP - Cross-platform multimedia player | |
6 * Copyright (C) 2003-2005 BMP development team. | |
7 * | |
8 * This program is free software; you can redistribute it and/or modify | |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; under version 2 of the License. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 * GNU General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU General Public License | |
18 * along with this program; if not, write to the Free Software | |
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | |
20 * 02110-1301, USA. | |
21 */ | |
22 | |
23 #include <glib.h> | |
24 #include <glib/gi18n.h> | |
25 #include <glib/gprintf.h> | |
26 #include <config.h> | |
27 #include <stdlib.h> | |
28 #include <unistd.h> | |
29 #include <sys/types.h> | |
30 #include <signal.h> | |
31 | |
32 #include "main.h" | |
33 #include "ui_main.h" | |
34 #include "signals.h" | |
35 | |
2486 | 36 GCond *exit_cond; |
37 GMutex *exit_mutex; | |
38 | |
2313 | 39 typedef void (*SignalHandler) (gint); |
40 | |
41 static SignalHandler | |
42 signal_install_handler_full (gint signal_number, | |
43 SignalHandler handler, | |
44 gint *signals_to_block, | |
45 gsize n_signals) | |
46 { | |
47 struct sigaction action, old_action; | |
48 gsize i; | |
49 | |
50 action.sa_handler = handler; | |
51 action.sa_flags = SA_RESTART; | |
52 | |
53 sigemptyset (&action.sa_mask); | |
54 | |
55 for (i = 0; i < n_signals; i++) | |
56 sigaddset (&action.sa_mask, signals_to_block[i]); | |
57 | |
58 if (sigaction (signal_number, &action, &old_action) == -1) | |
59 { | |
60 g_message ("Failed to install handler for signal %d", signal_number); | |
61 return NULL; | |
62 } | |
63 | |
2373
ad1d7687814c
[svn] made strings.h for existing strings.c, cleanups
mf0102
parents:
2313
diff
changeset
|
64 return old_action.sa_handler; |
2313 | 65 } |
66 | |
67 /* | |
68 * A version of signal() that works more reliably across different | |
69 * platforms. It: | |
70 * a. restarts interrupted system calls | |
71 * b. does not reset the handler | |
72 * c. blocks the same signal within the handler | |
73 * | |
74 * (adapted from Unix Network Programming Vol. 1) | |
75 */ | |
76 static SignalHandler | |
77 signal_install_handler (gint signal_number, | |
78 SignalHandler handler) | |
79 { | |
80 return signal_install_handler_full (signal_number, handler, NULL, 0); | |
81 } | |
82 | |
83 static void | |
84 signal_empty_handler (gint signal_number) | |
85 { | |
86 /* empty */ | |
87 } | |
88 | |
89 static void | |
90 sigsegv_handler (gint signal_number) | |
91 { | |
92 #ifndef SIGSEGV_ABORT | |
93 g_printerr(_("\nReceived SIGSEGV\n\n" | |
94 "This could be a bug in Audacious. If you don't know why this happened, " | |
95 "file a bug at http://bugs-meta.atheme.org/\n\n")); | |
96 g_critical("Received SIGSEGV"); | |
97 | |
98 /* TO DO: log stack trace and possibly dump config file. */ | |
99 exit (EXIT_FAILURE); | |
100 #else | |
101 abort (); | |
102 #endif | |
103 } | |
104 | |
105 static void | |
106 sigterm_handler (gint signal_number) | |
107 { | |
108 cfg.terminate = TRUE; | |
2486 | 109 g_cond_signal(exit_cond); |
2313 | 110 } |
111 | |
2486 | 112 static void * |
113 signal_process_events (void *data) | |
2313 | 114 { |
2486 | 115 while (1) { |
116 if (cfg.terminate == TRUE) | |
117 { | |
118 g_print("Audacious has received SIGTERM and is shutting down.\n"); | |
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); | |
2313 | 124 } |
125 | |
2486 | 126 return NULL; |
2313 | 127 } |
128 | |
129 void | |
130 signal_handlers_init (void) | |
131 { | |
132 char *magic; | |
133 magic = getenv("AUD_ENSURE_BACKTRACE"); | |
134 | |
2486 | 135 exit_cond = g_cond_new(); |
136 exit_mutex = g_mutex_new(); | |
137 | |
2313 | 138 signal_install_handler(SIGPIPE, signal_empty_handler); |
139 signal_install_handler(SIGINT, sigterm_handler); | |
140 signal_install_handler(SIGTERM, sigterm_handler); | |
141 | |
142 /* in particular environment (maybe with glibc 2.5), core file | |
143 through signal handler doesn't contain useful back trace. --yaz */ | |
144 if (magic == NULL) | |
145 signal_install_handler(SIGSEGV, sigsegv_handler); | |
146 | |
2486 | 147 g_thread_create(signal_process_events, NULL, FALSE, NULL); |
148 | |
2313 | 149 } |