mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	memtrap: make installation of SIGBUS handler explicit to ease integration into libraries
This commit is contained in:
		
							parent
							
								
									7b0086185f
								
							
						
					
					
						commit
						928adf412f
					
				
					 3 changed files with 18 additions and 23 deletions
				
			
		| 
						 | 
				
			
			@ -154,21 +154,6 @@ pa_memtrap* pa_memtrap_add(const void *start, size_t size) {
 | 
			
		|||
    lock = pa_static_mutex_get(&write_lock, FALSE, FALSE);
 | 
			
		||||
    pa_mutex_lock(lock);
 | 
			
		||||
 | 
			
		||||
    if (!memtraps[0]) {
 | 
			
		||||
        struct sigaction sa;
 | 
			
		||||
 | 
			
		||||
        /* Before we install the signal handler, make sure the
 | 
			
		||||
         * semaphore is valid so that the initialization of the
 | 
			
		||||
         * semaphore doesn't have to happen from the signal handler */
 | 
			
		||||
        pa_static_semaphore_get(&semaphore, 0);
 | 
			
		||||
 | 
			
		||||
        memset(&sa, 0, sizeof(sa));
 | 
			
		||||
        sa.sa_sigaction = signal_handler;
 | 
			
		||||
        sa.sa_flags = SA_RESTART|SA_SIGINFO;
 | 
			
		||||
 | 
			
		||||
        pa_assert_se(sigaction(SIGBUS, &sa, NULL) == 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    n = (unsigned) pa_atomic_load(&read_lock);
 | 
			
		||||
    j = WHICH(n);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -204,14 +189,6 @@ void pa_memtrap_remove(pa_memtrap *m) {
 | 
			
		|||
 | 
			
		||||
    pa_xfree(m);
 | 
			
		||||
 | 
			
		||||
    if (!memtraps[0]) {
 | 
			
		||||
        struct sigaction sa;
 | 
			
		||||
 | 
			
		||||
        memset(&sa, 0, sizeof(sa));
 | 
			
		||||
        sa.sa_handler = SIG_DFL;
 | 
			
		||||
        pa_assert_se(sigaction(SIGBUS, &sa, NULL) == 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pa_mutex_unlock(lock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -255,3 +232,18 @@ unlock:
 | 
			
		|||
 | 
			
		||||
    return m;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void pa_memtrap_install(void) {
 | 
			
		||||
    struct sigaction sa;
 | 
			
		||||
 | 
			
		||||
    /* Before we install the signal handler, make sure the semaphore
 | 
			
		||||
     * is valid so that the initialization of the semaphore
 | 
			
		||||
     * doesn't have to happen from the signal handler */
 | 
			
		||||
    pa_static_semaphore_get(&semaphore, 0);
 | 
			
		||||
 | 
			
		||||
    memset(&sa, 0, sizeof(sa));
 | 
			
		||||
    sa.sa_sigaction = signal_handler;
 | 
			
		||||
    sa.sa_flags = SA_RESTART|SA_SIGINFO;
 | 
			
		||||
 | 
			
		||||
    pa_assert_se(sigaction(SIGBUS, &sa, NULL) == 0);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,4 +35,6 @@ void pa_memtrap_remove(pa_memtrap *m);
 | 
			
		|||
 | 
			
		||||
pa_bool_t pa_memtrap_is_good(pa_memtrap *m);
 | 
			
		||||
 | 
			
		||||
void pa_memtrap_install(void);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,6 +35,7 @@ int main(int argc, char *argv[]) {
 | 
			
		|||
    pa_memtrap *m;
 | 
			
		||||
 | 
			
		||||
    pa_log_set_level(PA_LOG_DEBUG);
 | 
			
		||||
    pa_memtrap_install();
 | 
			
		||||
 | 
			
		||||
    /* Create the memory map */
 | 
			
		||||
    pa_assert_se((fd = open("sigbus-test-map", O_RDWR|O_TRUNC|O_CREAT, 0660)) >= 0);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue