Mercurial > audlegacy
comparison src/audlegacy/signals.c @ 4834:38b491487bd8
renamed dbus symbol to audlegacy
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Thu, 21 May 2009 19:17:02 +0900 |
parents | 901cd268f0ca |
children | aed7b7a97932 |
comparison
equal
deleted
inserted
replaced
4833:34d54dc5576d | 4834:38b491487bd8 |
---|---|
94 sigset_t waitset; | 94 sigset_t waitset; |
95 int sig; | 95 int sig; |
96 | 96 |
97 sigemptyset(&waitset); | 97 sigemptyset(&waitset); |
98 sigaddset(&waitset, SIGPIPE); | 98 sigaddset(&waitset, SIGPIPE); |
99 sigaddset(&waitset, SIGSEGV); | 99 sigaddset(&waitset, SIGSEGV); |
100 sigaddset(&waitset, SIGINT); | 100 sigaddset(&waitset, SIGINT); |
101 sigaddset(&waitset, SIGTERM); | 101 sigaddset(&waitset, SIGTERM); |
102 | 102 |
103 while(1) { | 103 while(1) { |
104 sigwait(&waitset, &sig); | 104 sigwait(&waitset, &sig); |
184 sigset_t waitset; | 184 sigset_t waitset; |
185 int sigfd; | 185 int sigfd; |
186 | 186 |
187 sigemptyset(&waitset); | 187 sigemptyset(&waitset); |
188 sigaddset(&waitset, SIGPIPE); | 188 sigaddset(&waitset, SIGPIPE); |
189 sigaddset(&waitset, SIGSEGV); | 189 sigaddset(&waitset, SIGSEGV); |
190 sigaddset(&waitset, SIGINT); | 190 sigaddset(&waitset, SIGINT); |
191 sigaddset(&waitset, SIGTERM); | 191 sigaddset(&waitset, SIGTERM); |
192 | 192 |
193 sigfd = signalfd(-1, &waitset, 0); | 193 sigfd = signalfd(-1, &waitset, 0); |
194 | 194 |
249 } | 249 } |
250 | 250 |
251 return old_action.sa_handler; | 251 return old_action.sa_handler; |
252 } | 252 } |
253 | 253 |
254 /* | 254 /* |
255 * A version of signal() that works more reliably across different | 255 * A version of signal() that works more reliably across different |
256 * platforms. It: | 256 * platforms. It: |
257 * a. restarts interrupted system calls | 257 * a. restarts interrupted system calls |
258 * b. does not reset the handler | 258 * b. does not reset the handler |
259 * c. blocks the same signal within the handler | 259 * c. blocks the same signal within the handler |
260 * | 260 * |
261 * (adapted from Unix Network Programming Vol. 1) | 261 * (adapted from Unix Network Programming Vol. 1) |
266 { | 266 { |
267 return signal_install_handler_full (signal_number, handler, NULL, 0); | 267 return signal_install_handler_full (signal_number, handler, NULL, 0); |
268 } | 268 } |
269 | 269 |
270 | 270 |
271 /* sets up blocking signals for pthreads. | 271 /* sets up blocking signals for pthreads. |
272 * linuxthreads sucks and needs this to make sigwait(2) work | 272 * linuxthreads sucks and needs this to make sigwait(2) work |
273 * correctly. --nenolod | 273 * correctly. --nenolod |
274 * | 274 * |
275 * correction -- this trick does not work on linuxthreads. | 275 * correction -- this trick does not work on linuxthreads. |
276 * going to keep it in it's own function though --nenolod | 276 * going to keep it in it's own function though --nenolod |
277 */ | 277 */ |
280 { | 280 { |
281 sigset_t blockset; | 281 sigset_t blockset; |
282 | 282 |
283 sigemptyset(&blockset); | 283 sigemptyset(&blockset); |
284 sigaddset(&blockset, SIGPIPE); | 284 sigaddset(&blockset, SIGPIPE); |
285 sigaddset(&blockset, SIGSEGV); | 285 sigaddset(&blockset, SIGSEGV); |
286 sigaddset(&blockset, SIGINT); | 286 sigaddset(&blockset, SIGINT); |
287 sigaddset(&blockset, SIGTERM); | 287 sigaddset(&blockset, SIGTERM); |
288 | 288 |
289 if(pthread_sigmask(SIG_BLOCK, &blockset, NULL)) | 289 if(pthread_sigmask(SIG_BLOCK, &blockset, NULL)) |
290 g_print("pthread_sigmask() failed.\n"); | 290 g_print("pthread_sigmask() failed.\n"); |
291 } | 291 } |
292 | 292 |
293 static gboolean | 293 static gboolean |
294 signal_check_for_broken_impl(void) | 294 signal_check_for_broken_impl(void) |
295 { | 295 { |
308 | 308 |
309 #ifdef USE_EGGSM | 309 #ifdef USE_EGGSM |
310 static void | 310 static void |
311 signal_session_quit_cb(EggSMClient *client, gpointer user_data) | 311 signal_session_quit_cb(EggSMClient *client, gpointer user_data) |
312 { | 312 { |
313 g_print("Session quit requested. Saving state and shutting down.\n"); | 313 g_print("Session quit requested. Saving state and shutting down.\n"); |
314 aud_quit(); | 314 aud_quit(); |
315 } | 315 } |
316 | 316 |
317 static void | 317 static void |
318 signal_session_save_cb(EggSMClient *client, const char *state_dir, gpointer user_data) | 318 signal_session_save_cb(EggSMClient *client, const char *state_dir, gpointer user_data) |
319 { | 319 { |
320 g_print("Session save requested. Saving state.\n"); | 320 g_print("Session save requested. Saving state.\n"); |
321 aud_config_save(); | 321 aud_config_save(); |
322 } | 322 } |
323 #endif | 323 #endif |
324 | 324 |
325 void | 325 void |
326 signal_handlers_init(void) | 326 signal_handlers_init(void) |
327 { | 327 { |
328 #ifdef USE_EGGSM | 328 #ifdef USE_EGGSM |
329 EggSMClient *client; | 329 EggSMClient *client; |
330 | 330 |
331 client = egg_sm_client_get (); | 331 client = egg_sm_client_get (); |
332 if (client != NULL) | 332 if (client != NULL) |
333 { | 333 { |
334 egg_sm_client_set_mode (EGG_SM_CLIENT_MODE_NORMAL); | 334 egg_sm_client_set_mode (EGG_SM_CLIENT_MODE_NORMAL); |
335 g_signal_connect (client, "quit", | 335 g_signal_connect (client, "quit", |
336 G_CALLBACK (signal_session_quit_cb), NULL); | 336 G_CALLBACK (signal_session_quit_cb), NULL); |
337 g_signal_connect (client, "save-state", | 337 g_signal_connect (client, "save-state", |
338 G_CALLBACK (signal_session_save_cb), NULL); | 338 G_CALLBACK (signal_session_save_cb), NULL); |
339 | 339 |
340 } | 340 } |
341 #endif | 341 #endif |
342 | 342 |
343 #if (!defined(HAVE_SIGNALFD) || !defined(HAVE_SYS_SIGNALFD_H)) | 343 #if (!defined(HAVE_SIGNALFD) || !defined(HAVE_SYS_SIGNALFD_H)) |
344 | 344 |