Mercurial > audlegacy
annotate audacious/signals.c @ 2257:af716dc0cdb9 trunk
[svn] - do not create GtkAccelGroup anymore; use ui_manager_get_accel_group to get accelerator groups from ui_manager
author | giacomo |
---|---|
date | Thu, 04 Jan 2007 03:58:58 -0800 |
parents | d507d2c1f75c |
children | 9841545632e9 |
rev | line source |
---|---|
2156
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
1 /* |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
2 * Audacious |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
3 * Copyright (c) 2005-2007 Audacious development team |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
4 * |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
5 * BMP - Cross-platform multimedia player |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
6 * Copyright (C) 2003-2005 BMP development team. |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
7 * |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
8 * This program is free software; you can redistribute it and/or modify |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
9 * it under the terms of the GNU General Public License as published by |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
10 * the Free Software Foundation; under version 2 of the License. |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
11 * |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
12 * This program is distributed in the hope that it will be useful, |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
15 * GNU General Public License for more details. |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
16 * |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
17 * You should have received a copy of the GNU General Public License |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
18 * along with this program; if not, write to the Free Software |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
20 * 02110-1301, USA. |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
21 */ |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
22 |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
23 #include <glib.h> |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
24 #include <glib/gi18n.h> |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
25 #include <glib/gprintf.h> |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
26 #include <config.h> |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
27 #include <stdlib.h> |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
28 #include <unistd.h> |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
29 #include <sys/types.h> |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
30 #include <signal.h> |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
31 |
2222 | 32 #include "main.h" |
2237 | 33 #include "ui_main.h" |
2156
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
34 #include "signals.h" |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
35 |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
36 typedef void (*SignalHandler) (gint); |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
37 |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
38 static SignalHandler |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
39 signal_install_handler_full (gint signal_number, |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
40 SignalHandler handler, |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
41 gint *signals_to_block, |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
42 gsize n_signals) |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
43 { |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
44 struct sigaction action, old_action; |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
45 gsize i; |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
46 |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
47 action.sa_handler = handler; |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
48 action.sa_flags = SA_RESTART; |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
49 |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
50 sigemptyset (&action.sa_mask); |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
51 |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
52 for (i = 0; i < n_signals; i++) |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
53 sigaddset (&action.sa_mask, signals_to_block[i]); |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
54 |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
55 if (sigaction (signal_number, &action, &old_action) == -1) |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
56 { |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
57 g_message ("Failed to install handler for signal %d", signal_number); |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
58 return NULL; |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
59 } |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
60 |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
61 return old_action.sa_handler; |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
62 } |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
63 |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
64 /* |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
65 * A version of signal() that works more reliably across different |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
66 * platforms. It: |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
67 * a. restarts interrupted system calls |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
68 * b. does not reset the handler |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
69 * c. blocks the same signal within the handler |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
70 * |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
71 * (adapted from Unix Network Programming Vol. 1) |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
72 */ |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
73 static SignalHandler |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
74 signal_install_handler (gint signal_number, |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
75 SignalHandler handler) |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
76 { |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
77 return signal_install_handler_full (signal_number, handler, NULL, 0); |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
78 } |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
79 |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
80 static void |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
81 signal_empty_handler (gint signal_number) |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
82 { |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
83 /* empty */ |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
84 } |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
85 |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
86 static void |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
87 sigsegv_handler (gint signal_number) |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
88 { |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
89 #ifdef HANDLE_SIGSEGV |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
90 g_printerr(_("\nReceived SIGSEGV\n\n" |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
91 "This could be a bug in Audacious. If you don't know why this happened, " |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
92 "file a bug at http://bugs-meta.atheme.org/\n\n")); |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
93 |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
94 exit (EXIT_FAILURE); |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
95 #else |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
96 abort (); |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
97 #endif |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
98 } |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
99 |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
100 static void |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
101 sigterm_handler (gint signal_number) |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
102 { |
2222 | 103 cfg.terminate = TRUE; |
104 } | |
105 | |
106 static gboolean | |
107 signal_process_events (gpointer data) | |
108 { | |
109 if (cfg.terminate == TRUE) | |
110 { | |
111 g_message("Audacious has received SIGTERM and is shutting down."); | |
112 mainwin_quit_cb(); | |
113 return FALSE; | |
114 } | |
115 | |
116 return TRUE; | |
2156
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
117 } |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
118 |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
119 void |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
120 signal_handlers_init (void) |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
121 { |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
122 char *magic; |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
123 magic = getenv("AUD_ENSURE_BACKTRACE"); |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
124 |
2222 | 125 signal_install_handler(SIGPIPE, signal_empty_handler); |
126 signal_install_handler(SIGINT, sigterm_handler); | |
127 signal_install_handler(SIGTERM, sigterm_handler); | |
2156
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
128 |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
129 /* in particular environment (maybe with glibc 2.5), core file |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
130 through signal handler doesn't contain useful back trace. --yaz */ |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
131 if (magic == NULL) |
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
132 signal_install_handler(SIGSEGV, sigsegv_handler); |
2222 | 133 |
134 g_timeout_add(100, signal_process_events, NULL); | |
2156
a792aaee8e8e
[svn] - new signal handling which does not block (based on concept from BMP 0.9.8 that never got released)
nenolod
parents:
diff
changeset
|
135 } |