From 84fa8af38d2eab0f72349abb8136811bd3e96570 Mon Sep 17 00:00:00 2001 From: Anand Avati Date: Tue, 24 Sep 2013 09:45:08 -0700 Subject: core: block unused signals in created threads Block all signal except those which are set for explicit handling in glusterfs_signals_setup(). Since thread spawning code in libglusterfs and xlators can get called from application threads when used through libgfapi, it is necessary to do this blocking. Change-Id: Ia320f80521a83d2edcda50b9ad414583a0175281 BUG: 1011662 Signed-off-by: Anand Avati Reviewed-on: http://review.gluster.org/5995 Tested-by: Gluster Build System Reviewed-by: Amar Tumballi Reviewed-by: Vijay Bellur --- libglusterfs/src/common-utils.c | 27 +++++++++++++++++++++++++++ libglusterfs/src/common-utils.h | 3 +++ libglusterfs/src/syncop.c | 8 ++++---- libglusterfs/src/timer.c | 2 +- 4 files changed, 35 insertions(+), 5 deletions(-) (limited to 'libglusterfs') diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index f223a3f8a..d57cd8a55 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -2807,6 +2807,7 @@ out: } + /* Sets log file path from user provided arguments */ int gf_set_log_file_path (cmd_args_t *cmd_args) @@ -2868,3 +2869,29 @@ gf_set_log_file_path (cmd_args_t *cmd_args) done: return ret; } + +int +gf_thread_create (pthread_t *thread, const pthread_attr_t *attr, + void *(*start_routine)(void *), void *arg) +{ + sigset_t set, old; + int ret; + + sigemptyset (&set); + + sigfillset (&set); + sigdelset (&set, SIGSEGV); + sigdelset (&set, SIGBUS); + sigdelset (&set, SIGILL); + sigdelset (&set, SIGSYS); + sigdelset (&set, SIGFPE); + sigdelset (&set, SIGABRT); + + pthread_sigmask (SIG_BLOCK, &set, &old); + + ret = pthread_create (thread, attr, start_routine, arg); + + pthread_sigmask (SIG_SETMASK, &old, NULL); + + return ret; +} diff --git a/libglusterfs/src/common-utils.h b/libglusterfs/src/common-utils.h index bc8a2db55..3c99a4212 100644 --- a/libglusterfs/src/common-utils.h +++ b/libglusterfs/src/common-utils.h @@ -588,4 +588,7 @@ gf_boolean_t gf_is_local_addr (char *hostname); gf_boolean_t gf_is_same_address (char *host1, char *host2); void md5_wrapper(const unsigned char *data, size_t len, char *md5); +int gf_thread_create (pthread_t *thread, const pthread_attr_t *attr, + void *(*start_routine)(void *), void *arg); + #endif /* _COMMON_UTILS_H */ diff --git a/libglusterfs/src/syncop.c b/libglusterfs/src/syncop.c index d2c8381a3..cd267cacc 100644 --- a/libglusterfs/src/syncop.c +++ b/libglusterfs/src/syncop.c @@ -453,8 +453,8 @@ syncenv_scale (struct syncenv *env) } env->proc[i].env = env; - ret = pthread_create (&env->proc[i].processor, NULL, - syncenv_processor, &env->proc[i]); + ret = gf_thread_create (&env->proc[i].processor, NULL, + syncenv_processor, &env->proc[i]); if (ret) break; env->procs++; @@ -507,8 +507,8 @@ syncenv_new (size_t stacksize, int procmin, int procmax) for (i = 0; i < newenv->procmin; i++) { newenv->proc[i].env = newenv; - ret = pthread_create (&newenv->proc[i].processor, NULL, - syncenv_processor, &newenv->proc[i]); + ret = gf_thread_create (&newenv->proc[i].processor, NULL, + syncenv_processor, &newenv->proc[i]); if (ret) break; newenv->procs++; diff --git a/libglusterfs/src/timer.c b/libglusterfs/src/timer.c index ae40142ad..97a746b91 100644 --- a/libglusterfs/src/timer.c +++ b/libglusterfs/src/timer.c @@ -213,7 +213,7 @@ gf_timer_registry_init (glusterfs_ctx_t *ctx) reg->stale.prev = ®->stale; ctx->timer = reg; - pthread_create (®->th, NULL, gf_timer_proc, ctx); + gf_thread_create (®->th, NULL, gf_timer_proc, ctx); } out: return ctx->timer; -- cgit