#include <pthread.h>
+#include <signal.h>
#include "lock.h"
#include <stdio.h>
+
+void block_signal (int signum, sigset_t *old)
+{
+ sigset_t set;
+ sigemptyset(&set);
+ sigaddset(&set, signum);
+ pthread_sigmask(SIG_BLOCK, &set, old);
+}
+
void cleanup_lock (void * data)
{
unlock ((*(struct mutex_lock *)data));
#ifndef _LOCK_H
#define _LOCK_H
+#include <signal.h>
+
/*
* Wrapper for the mutex. Includes a ref-count to keep
* track of how many there are out-standing threads blocking
#endif
void cleanup_lock (void * data);
+void block_signal(int signum, sigset_t *old);
#endif /* _LOCK_H */
#include "log_pthread.h"
#include "log.h"
+#include "lock.h"
void log_safe (int prio, const char * fmt, va_list ap)
{
+ sigset_t old;
+
+ block_signal(SIGUSR1, &old);
+ block_signal(SIGHUP, NULL);
+
pthread_mutex_lock(logq_lock);
log_enqueue(prio, fmt, ap);
pthread_mutex_unlock(logq_lock);
pthread_mutex_lock(logev_lock);
pthread_cond_signal(logev_cond);
pthread_mutex_unlock(logev_lock);
+
+ pthread_sigmask(SIG_SETMASK, &old, NULL);
}
static void flush_logqueue (void)
void free_waiter (void *data)
{
+ sigset_t old;
struct event_thread *wp = (struct event_thread *)data;
/*
* indicate in mpp that the wp is already freed storage
*/
+ block_signal(SIGHUP, &old);
lock(wp->vecs->lock);
if (wp->mpp)
condlog(3, "free_waiter, mpp freed before wp=%p (%s).", wp, wp->mapname);
unlock(wp->vecs->lock);
+ pthread_sigmask(SIG_SETMASK, &old, NULL);
if (wp->dmt)
dm_task_destroy(wp->dmt);
waiter = (struct event_thread *)et;
pthread_cleanup_push(free_waiter, et);
+ block_signal(SIGUSR1, NULL);
+ block_signal(SIGHUP, NULL);
while (1) {
r = waiteventloop(waiter);
static void *
ueventloop (void * ap)
{
+ block_signal(SIGUSR1, NULL);
+ block_signal(SIGHUP, NULL);
+
if (uevent_listen(&uev_trigger, ap))
fprintf(stderr, "error starting uevent listener");
static void *
uxlsnrloop (void * ap)
{
+ block_signal(SIGUSR1, NULL);
+ block_signal(SIGHUP, NULL);
+
if (cli_init())
return NULL;
struct path *pp;
int count = 0;
unsigned int i;
+ sigset_t old;
mlockall(MCL_CURRENT | MCL_FUTURE);
vecs = (struct vectors *)ap;
}
while (1) {
+ block_signal(SIGHUP, &old);
pthread_cleanup_push(cleanup_lock, &vecs->lock);
lock(vecs->lock);
condlog(4, "tick");
}
lock_cleanup_pop(vecs->lock);
+ pthread_sigmask(SIG_SETMASK, &old, NULL);
sleep(1);
}
return NULL;
/*
* exit path
*/
+ block_signal(SIGHUP, NULL);
lock(vecs->lock);
remove_maps_and_stop_waiters(vecs);
free_pathvec(vecs->pathvec, FREE_PATHS);