memtrap: make installation of SIGBUS handler explicit to ease integration into libraries

This commit is contained in:
Lennart Poettering 2009-04-21 22:54:44 +02:00
parent 7b0086185f
commit 928adf412f
3 changed files with 18 additions and 23 deletions

View file

@ -154,21 +154,6 @@ pa_memtrap* pa_memtrap_add(const void *start, size_t size) {
lock = pa_static_mutex_get(&write_lock, FALSE, FALSE); lock = pa_static_mutex_get(&write_lock, FALSE, FALSE);
pa_mutex_lock(lock); 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); n = (unsigned) pa_atomic_load(&read_lock);
j = WHICH(n); j = WHICH(n);
@ -204,14 +189,6 @@ void pa_memtrap_remove(pa_memtrap *m) {
pa_xfree(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); pa_mutex_unlock(lock);
} }
@ -255,3 +232,18 @@ unlock:
return m; 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);
}

View file

@ -35,4 +35,6 @@ void pa_memtrap_remove(pa_memtrap *m);
pa_bool_t pa_memtrap_is_good(pa_memtrap *m); pa_bool_t pa_memtrap_is_good(pa_memtrap *m);
void pa_memtrap_install(void);
#endif #endif

View file

@ -35,6 +35,7 @@ int main(int argc, char *argv[]) {
pa_memtrap *m; pa_memtrap *m;
pa_log_set_level(PA_LOG_DEBUG); pa_log_set_level(PA_LOG_DEBUG);
pa_memtrap_install();
/* Create the memory map */ /* Create the memory map */
pa_assert_se((fd = open("sigbus-test-map", O_RDWR|O_TRUNC|O_CREAT, 0660)) >= 0); pa_assert_se((fd = open("sigbus-test-map", O_RDWR|O_TRUNC|O_CREAT, 0660)) >= 0);