From 298b6cf050ca2c7031df495991fc709c976eeeba Mon Sep 17 00:00:00 2001 From: root Date: Wed, 20 Jul 2005 09:21:27 +0200 Subject: [PATCH] [multipathd] interim support for reaping DM events waiter threads It is sort of late in the game for redhat to be making kernel patches for the next release, so here is an alternate way of getting to break out of the waitevent pthread. Martin Marzinski, Redhat. I merge the patch, mainly because some users will get stuck unkowing of Ed's patch, and it doesn't get in the way when this kernel patch will be merged. --- multipathd/main.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/multipathd/main.c b/multipathd/main.c index afef235..c2b4ef0 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -322,6 +322,16 @@ free_waiter (void * data) FREE(wp); } +static sigset_t unblock_sigusr1(void) +{ + sigset_t set, old; + + sigemptyset(&set); + sigaddset(&set, SIGUSR1); + pthread_sigmask(SIG_UNBLOCK, &set, &old); + return old; +} + /* * returns the reschedule delay * negative means *stop* @@ -329,6 +339,7 @@ free_waiter (void * data) static int waiteventloop (struct event_thread * waiter) { + sigset_t set; int event_nr; int r; @@ -348,7 +359,9 @@ waiteventloop (struct event_thread * waiter) dm_task_no_open_count(waiter->dmt); pthread_testcancel(); + set = unblock_sigusr1(); dm_task_run(waiter->dmt); + pthread_sigmask(SIG_SETMASK, &set, NULL); pthread_testcancel(); dm_task_destroy(waiter->dmt); waiter->dmt = NULL; @@ -421,13 +434,19 @@ static int stop_waiter_thread (struct multipath * mpp, struct paths * allpaths) { struct event_thread * wp = (struct event_thread *)mpp->waiter; + pthread_t thread = wp->thread; + int r; if (!wp) return 1; condlog(2, "%s: reap event checker", wp->mapname); - return pthread_cancel(wp->thread); + if ((r = pthread_cancel(thread))) + return r; + + pthread_kill(thread, SIGUSR1); + return 0; } static int -- 2.7.4