mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-04 13:29:59 -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);
|
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);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue