annotate src/audacious/signals.c @ 4449:19e3f3c5fe7f

introduce function aud_quit(), which is basically mainwin_quit_cb(), but is in main.c now because it is quite much the opposite of main() and should feel at home there.
author mf0102 <0102@gmx.at>
date Sat, 12 Apr 2008 19:24:55 +0200
parents 6456eadfe0ca
children 55262ebeba2d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
1 /*
2892
2f5e02538dfa Backed out changeset 06858ea4b9d01dab0ce54891221bd1534a9c5ade
William Pitcock <nenolod@atheme.org>
parents: 2863
diff changeset
2 * Audacious
2f5e02538dfa Backed out changeset 06858ea4b9d01dab0ce54891221bd1534a9c5ade
William Pitcock <nenolod@atheme.org>
parents: 2863
diff changeset
3 * Copyright (c) 2005-2007 Yoshiki Yazawa
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
4 *
2892
2f5e02538dfa Backed out changeset 06858ea4b9d01dab0ce54891221bd1534a9c5ade
William Pitcock <nenolod@atheme.org>
parents: 2863
diff changeset
5 * This program is free software; you can redistribute it and/or modify
2f5e02538dfa Backed out changeset 06858ea4b9d01dab0ce54891221bd1534a9c5ade
William Pitcock <nenolod@atheme.org>
parents: 2863
diff changeset
6 * it under the terms of the GNU General Public License as published by
3121
3b6d316f8b09 GPL3 relicensing.
William Pitcock <nenolod@atheme-project.org>
parents: 2892
diff changeset
7 * the Free Software Foundation; under version 3 of the License.
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
8 *
2892
2f5e02538dfa Backed out changeset 06858ea4b9d01dab0ce54891221bd1534a9c5ade
William Pitcock <nenolod@atheme.org>
parents: 2863
diff changeset
9 * This program is distributed in the hope that it will be useful,
2f5e02538dfa Backed out changeset 06858ea4b9d01dab0ce54891221bd1534a9c5ade
William Pitcock <nenolod@atheme.org>
parents: 2863
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2f5e02538dfa Backed out changeset 06858ea4b9d01dab0ce54891221bd1534a9c5ade
William Pitcock <nenolod@atheme.org>
parents: 2863
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2f5e02538dfa Backed out changeset 06858ea4b9d01dab0ce54891221bd1534a9c5ade
William Pitcock <nenolod@atheme.org>
parents: 2863
diff changeset
12 * GNU General Public License for more details.
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
13 *
2892
2f5e02538dfa Backed out changeset 06858ea4b9d01dab0ce54891221bd1534a9c5ade
William Pitcock <nenolod@atheme.org>
parents: 2863
diff changeset
14 * You should have received a copy of the GNU General Public License
3121
3b6d316f8b09 GPL3 relicensing.
William Pitcock <nenolod@atheme-project.org>
parents: 2892
diff changeset
15 * along with this program. If not, see <http://www.gnu.org/licenses>.
3123
f1c756f39e6c Invoke "Plugins are not derived work" clause provided by GPL3.
William Pitcock <nenolod@atheme-project.org>
parents: 3121
diff changeset
16 *
f1c756f39e6c Invoke "Plugins are not derived work" clause provided by GPL3.
William Pitcock <nenolod@atheme-project.org>
parents: 3121
diff changeset
17 * The Audacious team does not consider modular code linking to
f1c756f39e6c Invoke "Plugins are not derived work" clause provided by GPL3.
William Pitcock <nenolod@atheme-project.org>
parents: 3121
diff changeset
18 * Audacious or using our public API to be a derived work.
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
19 */
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
20
2677
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
21 //#define _XOPEN_SOURCE
2666
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
22 #include <unistd.h> /* for signal_check_for_broken_impl() */
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
23
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
24 #include <glib.h>
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
25 #include <glib/gi18n.h>
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
26 #include <config.h>
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
27 #include <stdlib.h>
2674
f3ee0b78150a [svn] - use pthread_sigmask(SIG_BLOCK, ...) instead of of SIG_SETMASK
nenolod
parents: 2666
diff changeset
28 #include <pthread.h> /* for pthread_sigmask() */
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
29 #include <signal.h>
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
30
2661
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
31 #ifdef HAVE_EXECINFO_H
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
32 # include <execinfo.h>
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
33 #endif
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
34
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
35 #include "main.h"
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
36 #include "signals.h"
2661
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
37 #include "build_stamp.h"
4315
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
38 #include "eggsmclient.h"
2661
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
39
2677
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
40 gint linuxthread_signal_number = 0;
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
41
2661
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
42 static void
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
43 signal_process_segv(void)
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
44 {
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
45 g_printerr(_("\nAudacious has caught signal 11 (SIGSEGV).\n\n"
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
46 "We apologize for the inconvenience, but Audacious has crashed.\n"
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
47 "This is a bug in the program, and should never happen under normal circumstances.\n"
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
48 "Your current configuration has been saved and should not be damaged.\n\n"
4431
6456eadfe0ca Updated bugtracker URL and made the sig11 handler tiny bit more informative.
Matti Hamalainen <ccr@tnsp.org>
parents: 4412
diff changeset
49 "You can help improve the quality of Audacious by filing a bug at http://bugzilla.atheme.org/\n"
2661
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
50 "Please include the entire text of this message and a description of what you were doing when\n"
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
51 "this crash occured in order to quickly expedite the handling of your bug report:\n\n"));
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
52
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
53 g_printerr("Program version: Audacious %s (buildid: %s)\n\n", VERSION, svn_stamp);
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
54
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
55 #ifdef HAVE_EXECINFO_H
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
56 {
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
57 void *stack[20];
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
58 size_t size;
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
59 char **strings;
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
60 size_t i;
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
61
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
62 size = backtrace(stack, 20);
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
63 strings = backtrace_symbols(stack, size);
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
64
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
65 g_printerr("Stacktrace (%zd frames):\n", size);
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
66
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
67 for (i = 0; i < size; i++)
2785
182aa34ae6c4 [svn] - implement some audacious-remote functions.
yaz
parents: 2677
diff changeset
68 g_printerr(" %ld. %s\n", (long)i + 1, strings[i]);
2661
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
69
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
70 g_free(strings);
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
71 }
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
72 #else
4431
6456eadfe0ca Updated bugtracker URL and made the sig11 handler tiny bit more informative.
Matti Hamalainen <ccr@tnsp.org>
parents: 4412
diff changeset
73 g_printerr(_("Stacktrace was unavailable. You might want to reproduce this "
6456eadfe0ca Updated bugtracker URL and made the sig11 handler tiny bit more informative.
Matti Hamalainen <ccr@tnsp.org>
parents: 4412
diff changeset
74 "problem while running Audacious under GDB to get a proper backtrace.\n"));
2661
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
75 #endif
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
76
4431
6456eadfe0ca Updated bugtracker URL and made the sig11 handler tiny bit more informative.
Matti Hamalainen <ccr@tnsp.org>
parents: 4412
diff changeset
77 g_printerr(_("\nBugs can be reported at http://bugzilla.atheme.org/ against "
6456eadfe0ca Updated bugtracker URL and made the sig11 handler tiny bit more informative.
Matti Hamalainen <ccr@tnsp.org>
parents: 4412
diff changeset
78 "the Audacious or Audacious Plugins product.\n"));
2661
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
79
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
80 g_critical("Received SIGSEGV -- Audacious has crashed.");
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
81
4412
180996fcf12a bmp_config_* -> aud_config_*
Matti Hamalainen <ccr@tnsp.org>
parents: 4345
diff changeset
82 aud_config_save();
2661
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
83 abort();
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
84 }
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
85
2629
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
86 static void *
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
87 signal_process_signals (void *data)
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
88 {
2629
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
89 sigset_t waitset;
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
90 int sig;
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
91
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
92 sigemptyset(&waitset);
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
93 sigaddset(&waitset, SIGPIPE);
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
94 sigaddset(&waitset, SIGSEGV);
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
95 sigaddset(&waitset, SIGINT);
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
96 sigaddset(&waitset, SIGTERM);
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
97
2629
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
98 while(1) {
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
99 sigwait(&waitset, &sig);
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
100
2629
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
101 switch(sig){
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
102 case SIGPIPE:
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
103 /*
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
104 * do something.
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
105 */
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
106 break;
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
107
2629
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
108 case SIGSEGV:
2661
f6c7271df7de [svn] - use execinfo.h to provide more useful information about crashes
nenolod
parents: 2638
diff changeset
109 signal_process_segv();
2629
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
110 break;
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
111
2629
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
112 case SIGINT:
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
113 g_print("Audacious has received SIGINT and is shutting down.\n");
4449
19e3f3c5fe7f introduce function aud_quit(), which is basically mainwin_quit_cb(), but
mf0102 <0102@gmx.at>
parents: 4431
diff changeset
114 aud_quit();
2629
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
115 break;
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
116
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
117 case SIGTERM:
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
118 g_print("Audacious has received SIGTERM and is shutting down.\n");
4449
19e3f3c5fe7f introduce function aud_quit(), which is basically mainwin_quit_cb(), but
mf0102 <0102@gmx.at>
parents: 4431
diff changeset
119 aud_quit();
2629
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
120 break;
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
121 }
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
122 }
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
123
2629
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
124 return NULL; //dummy
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
125 }
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
126
2677
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
127 /********************************************************************************/
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
128 /* for linuxthread */
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
129 /********************************************************************************/
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
130
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
131 typedef void (*SignalHandler) (gint);
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
132
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
133 static void *
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
134 signal_process_signals_linuxthread (void *data)
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
135 {
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
136 while(1) {
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
137 g_usleep(1000000);
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
138
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
139 switch(linuxthread_signal_number){
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
140 case SIGPIPE:
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
141 /*
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
142 * do something.
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
143 */
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
144 linuxthread_signal_number = 0;
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
145 break;
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
146
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
147 case SIGSEGV:
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
148 signal_process_segv();
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
149 break;
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
150
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
151 case SIGINT:
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
152 g_print("Audacious has received SIGINT and is shutting down.\n");
4449
19e3f3c5fe7f introduce function aud_quit(), which is basically mainwin_quit_cb(), but
mf0102 <0102@gmx.at>
parents: 4431
diff changeset
153 aud_quit();
2677
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
154 break;
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
155
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
156 case SIGTERM:
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
157 g_print("Audacious has received SIGTERM and is shutting down.\n");
4449
19e3f3c5fe7f introduce function aud_quit(), which is basically mainwin_quit_cb(), but
mf0102 <0102@gmx.at>
parents: 4431
diff changeset
158 aud_quit();
2677
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
159 break;
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
160 }
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
161 }
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
162
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
163 return NULL; //dummy
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
164 }
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
165
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
166 static void
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
167 linuxthread_handler (gint signal_number)
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
168 {
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
169 /* note: cannot manipulate mutex from signal handler */
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
170 linuxthread_signal_number = signal_number;
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
171 }
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
172
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
173 static SignalHandler
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
174 signal_install_handler_full (gint signal_number,
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
175 SignalHandler handler,
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
176 gint *signals_to_block,
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
177 gsize n_signals)
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
178 {
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
179 struct sigaction action, old_action;
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
180 gsize i;
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
181
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
182 action.sa_handler = handler;
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
183 action.sa_flags = SA_RESTART;
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
184
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
185 sigemptyset (&action.sa_mask);
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
186
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
187 for (i = 0; i < n_signals; i++)
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
188 sigaddset (&action.sa_mask, signals_to_block[i]);
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
189
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
190 if (sigaction (signal_number, &action, &old_action) == -1)
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
191 {
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
192 g_message ("Failed to install handler for signal %d", signal_number);
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
193 return NULL;
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
194 }
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
195
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
196 return old_action.sa_handler;
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
197 }
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
198
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
199 /*
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
200 * A version of signal() that works more reliably across different
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
201 * platforms. It:
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
202 * a. restarts interrupted system calls
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
203 * b. does not reset the handler
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
204 * c. blocks the same signal within the handler
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
205 *
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
206 * (adapted from Unix Network Programming Vol. 1)
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
207 */
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
208 static SignalHandler
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
209 signal_install_handler (gint signal_number,
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
210 SignalHandler handler)
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
211 {
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
212 return signal_install_handler_full (signal_number, handler, NULL, 0);
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
213 }
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
214
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
215
2664
1d9c5db3341d [svn] - handle sigwait(2) brokenness on linuxthreads
nenolod
parents: 2661
diff changeset
216 /* sets up blocking signals for pthreads.
1d9c5db3341d [svn] - handle sigwait(2) brokenness on linuxthreads
nenolod
parents: 2661
diff changeset
217 * linuxthreads sucks and needs this to make sigwait(2) work
1d9c5db3341d [svn] - handle sigwait(2) brokenness on linuxthreads
nenolod
parents: 2661
diff changeset
218 * correctly. --nenolod
2666
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
219 *
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
220 * correction -- this trick does not work on linuxthreads.
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
221 * going to keep it in it's own function though --nenolod
2664
1d9c5db3341d [svn] - handle sigwait(2) brokenness on linuxthreads
nenolod
parents: 2661
diff changeset
222 */
1d9c5db3341d [svn] - handle sigwait(2) brokenness on linuxthreads
nenolod
parents: 2661
diff changeset
223 static void
1d9c5db3341d [svn] - handle sigwait(2) brokenness on linuxthreads
nenolod
parents: 2661
diff changeset
224 signal_initialize_blockers(void)
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
225 {
2629
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
226 sigset_t blockset;
2486
113f75c7b0ce [svn] - make SIGTERM handler always work.
yaz
parents: 2373
diff changeset
227
2629
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
228 sigemptyset(&blockset);
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
229 sigaddset(&blockset, SIGPIPE);
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
230 sigaddset(&blockset, SIGSEGV);
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
231 sigaddset(&blockset, SIGINT);
021321cb5426 [svn] simplify and enhance signal handler:
yaz
parents: 2486
diff changeset
232 sigaddset(&blockset, SIGTERM);
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
233
2674
f3ee0b78150a [svn] - use pthread_sigmask(SIG_BLOCK, ...) instead of of SIG_SETMASK
nenolod
parents: 2666
diff changeset
234 if(pthread_sigmask(SIG_BLOCK, &blockset, NULL))
2664
1d9c5db3341d [svn] - handle sigwait(2) brokenness on linuxthreads
nenolod
parents: 2661
diff changeset
235 g_print("pthread_sigmask() failed.\n");
1d9c5db3341d [svn] - handle sigwait(2) brokenness on linuxthreads
nenolod
parents: 2661
diff changeset
236 }
1d9c5db3341d [svn] - handle sigwait(2) brokenness on linuxthreads
nenolod
parents: 2661
diff changeset
237
2666
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
238 static gboolean
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
239 signal_check_for_broken_impl(void)
2664
1d9c5db3341d [svn] - handle sigwait(2) brokenness on linuxthreads
nenolod
parents: 2661
diff changeset
240 {
2666
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
241 #ifdef _CS_GNU_LIBPTHREAD_VERSION
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
242 {
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
243 gchar str[1024];
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
244 confstr(_CS_GNU_LIBPTHREAD_VERSION, str, sizeof(str));
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
245
4069
b26a96a5da69 change code a bit to avoid using strncasecmp which gives a warning here
mf0102 <0102@gmx.at>
parents: 3123
diff changeset
246 if (g_ascii_strncasecmp("linuxthreads", str, 12) == 0)
2666
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
247 return TRUE;
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
248 }
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
249 #endif
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
250
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
251 return FALSE;
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
252 }
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
253
4315
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
254 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
255 signal_session_quit_cb(EggSMClient *client, gpointer user_data)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
256 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
257 g_print("Session quit requested. Saving state and shutting down.\n");
4449
19e3f3c5fe7f introduce function aud_quit(), which is basically mainwin_quit_cb(), but
mf0102 <0102@gmx.at>
parents: 4431
diff changeset
258 aud_quit();
4315
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
259 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
260
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
261 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
262 signal_session_save_cb(EggSMClient *client, const char *state_dir, gpointer user_data)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
263 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
264 g_print("Session save requested. Saving state.\n");
4412
180996fcf12a bmp_config_* -> aud_config_*
Matti Hamalainen <ccr@tnsp.org>
parents: 4345
diff changeset
265 aud_config_save();
4315
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
266 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
267
2666
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
268 void
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
269 signal_handlers_init(void)
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
270 {
4315
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
271 EggSMClient *client;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
272
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
273 client = egg_sm_client_get ();
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
274 if (client != NULL)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
275 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
276 egg_sm_client_set_mode (EGG_SM_CLIENT_MODE_NORMAL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
277 g_signal_connect (client, "quit",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
278 G_CALLBACK (signal_session_quit_cb), NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
279 g_signal_connect (client, "save-state",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
280 G_CALLBACK (signal_session_save_cb), NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
281
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
282 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents: 4069
diff changeset
283
2666
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
284 if (signal_check_for_broken_impl() != TRUE)
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
285 {
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
286 signal_initialize_blockers();
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
287 g_thread_create(signal_process_signals, NULL, FALSE, NULL);
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
288 }
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
289 else
2677
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
290 {
2666
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
291 g_printerr(_("Your signaling implementation is broken.\n"
78a8b3095274 [svn] - do not use the signal handler at all on linuxthreads and hope for the best
nenolod
parents: 2665
diff changeset
292 "Expect unusable crash reports.\n"));
2677
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
293
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
294 /* install special handler which catches signals and forwards to the signal handling thread */
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
295 signal_install_handler(SIGPIPE, linuxthread_handler);
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
296 signal_install_handler(SIGSEGV, linuxthread_handler);
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
297 signal_install_handler(SIGINT, linuxthread_handler);
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
298 signal_install_handler(SIGTERM, linuxthread_handler);
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
299
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
300 /* create handler thread */
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
301 g_thread_create(signal_process_signals_linuxthread, NULL, FALSE, NULL);
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
302
52785bdac597 [svn] - workaround for linuxthread's broken implementation of sigwait().
yaz
parents: 2674
diff changeset
303 }
2313
3149d4b1a9a9 [svn] - objective-make autodepend fixes
nenolod
parents:
diff changeset
304 }