mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	Fall back to signal() when sigaction isn't supported.
git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/ossman@391 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
		
							parent
							
								
									3ed983c945
								
							
						
					
					
						commit
						ec87cb1571
					
				
					 2 changed files with 25 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -30,6 +30,7 @@
 | 
			
		|||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
 | 
			
		||||
#include "mainloop-signal.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -38,7 +39,11 @@
 | 
			
		|||
 | 
			
		||||
struct pa_signal_event {
 | 
			
		||||
    int sig;
 | 
			
		||||
#ifdef HAVE_SIGACTION
 | 
			
		||||
    struct sigaction saved_sigaction;
 | 
			
		||||
#else
 | 
			
		||||
    void (*saved_handler)(int sig);
 | 
			
		||||
#endif
 | 
			
		||||
    void (*callback) (struct pa_mainloop_api*a, struct pa_signal_event *e, int signal, void *userdata);
 | 
			
		||||
    void *userdata;
 | 
			
		||||
    void (*destroy_callback) (struct pa_mainloop_api*a, struct pa_signal_event*e, void *userdata);
 | 
			
		||||
| 
						 | 
				
			
			@ -51,6 +56,9 @@ static struct pa_io_event* io_event = NULL;
 | 
			
		|||
static struct pa_signal_event *signals = NULL;
 | 
			
		||||
 | 
			
		||||
static void signal_handler(int sig) {
 | 
			
		||||
#ifndef HAVE_SIGACTION
 | 
			
		||||
    signal(sig, signal_handler);
 | 
			
		||||
#endif
 | 
			
		||||
    write(signal_pipe[1], &sig, sizeof(sig));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -120,7 +128,11 @@ void pa_signal_done(void) {
 | 
			
		|||
 | 
			
		||||
struct pa_signal_event* pa_signal_new(int sig, void (*callback) (struct pa_mainloop_api *api, struct pa_signal_event*e, int sig, void *userdata), void *userdata) {
 | 
			
		||||
    struct pa_signal_event *e = NULL;
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_SIGACTION
 | 
			
		||||
    struct sigaction sa;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    assert(sig > 0 && callback);
 | 
			
		||||
    
 | 
			
		||||
    for (e = signals; e; e = e->next)
 | 
			
		||||
| 
						 | 
				
			
			@ -133,12 +145,16 @@ struct pa_signal_event* pa_signal_new(int sig, void (*callback) (struct pa_mainl
 | 
			
		|||
    e->userdata = userdata;
 | 
			
		||||
    e->destroy_callback = NULL;
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_SIGACTION
 | 
			
		||||
    memset(&sa, 0, sizeof(sa));
 | 
			
		||||
    sa.sa_handler = signal_handler;
 | 
			
		||||
    sigemptyset(&sa.sa_mask);
 | 
			
		||||
    sa.sa_flags = SA_RESTART;
 | 
			
		||||
    
 | 
			
		||||
    if (sigaction(sig, &sa, &e->saved_sigaction) < 0)
 | 
			
		||||
#else
 | 
			
		||||
    if ((e->saved_handler = signal(sig, signal_handler)) == SIG_ERR)
 | 
			
		||||
#endif
 | 
			
		||||
        goto fail;
 | 
			
		||||
 | 
			
		||||
    e->previous = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -162,7 +178,11 @@ void pa_signal_free(struct pa_signal_event *e) {
 | 
			
		|||
    else
 | 
			
		||||
        signals = e->next;
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_SIGACTION
 | 
			
		||||
    sigaction(e->sig, &e->saved_sigaction, NULL);
 | 
			
		||||
#else
 | 
			
		||||
    signal(e->sig, e->saved_handler);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    if (e->destroy_callback)
 | 
			
		||||
        e->destroy_callback(api, e, e->userdata);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -153,6 +153,7 @@ ssize_t pa_loop_write(int fd, const void*data, size_t size) {
 | 
			
		|||
/* Print a warning messages in case that the given signal is not
 | 
			
		||||
 * blocked or trapped */
 | 
			
		||||
void pa_check_signal_is_blocked(int sig) {
 | 
			
		||||
#ifdef HAVE_SIGACTION
 | 
			
		||||
    struct sigaction sa;
 | 
			
		||||
    sigset_t set;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -185,6 +186,9 @@ void pa_check_signal_is_blocked(int sig) {
 | 
			
		|||
        return;
 | 
			
		||||
    
 | 
			
		||||
    pa_log(__FILE__": WARNING: %s is not trapped. This might cause malfunction!\n", pa_strsignal(sig));
 | 
			
		||||
#else /* HAVE_SIGACTION */
 | 
			
		||||
    pa_log(__FILE__": WARNING: %s might not be trapped. This might cause malfunction!\n", pa_strsignal(sig));
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* The following function is based on an example from the GNU libc
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue