memtrap: make installation of SIGBUS handler explicit to ease integration into libraries
authorLennart Poettering <lennart@poettering.net>
Tue, 21 Apr 2009 20:54:44 +0000 (22:54 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 21 Apr 2009 20:54:44 +0000 (22:54 +0200)
src/pulsecore/memtrap.c
src/pulsecore/memtrap.h
src/tests/sigbus-test.c

index 4904253..a6ae510 100644 (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);
     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);
+}
index d93d672..6cad296 100644 (file)
@@ -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
index dec4f0f..4b9ca84 100644 (file)
@@ -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);