aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--lib/fuse_loop_mt.c14
2 files changed, 19 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index c153818..988a9e1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2005-11-27 Miklos Szeredi <miklos@szeredi.hu>
+
+ * Block TERM, INT, HUP and QUIT signals in all but the main
+ thread. According to POSIX it's not specified which thread will
+ receive these signals.
+
2005-11-22 Miklos Szeredi <miklos@szeredi.hu>
* Add detection of mainline FUSE code in running kernel
diff --git a/lib/fuse_loop_mt.c b/lib/fuse_loop_mt.c
index 95399d7..0532230 100644
--- a/lib/fuse_loop_mt.c
+++ b/lib/fuse_loop_mt.c
@@ -116,7 +116,19 @@ static void *do_work(void *data)
static int start_thread(struct fuse_worker *w, pthread_t *thread_id)
{
- int res = pthread_create(thread_id, NULL, do_work, w);
+ sigset_t oldset;
+ sigset_t newset;
+ int res;
+
+ /* Disallow signal reception in worker threads */
+ sigemptyset(&newset);
+ sigaddset(&newset, SIGTERM);
+ sigaddset(&newset, SIGINT);
+ sigaddset(&newset, SIGHUP);
+ sigaddset(&newset, SIGQUIT);
+ pthread_sigmask(SIG_BLOCK, &newset, &oldset);
+ res = pthread_create(thread_id, NULL, do_work, w);
+ pthread_sigmask(SIG_SETMASK, &oldset, NULL);
if (res != 0) {
fprintf(stderr, "fuse: error creating thread: %s\n", strerror(res));
return -1;