From d86a3e307ec8ef4d35d8a9b96f3a5db1fbc5cd86 Mon Sep 17 00:00:00 2001 From: Nickolai Zeldovich Date: Sat, 4 Jan 2003 05:20:55 +0000 Subject: [PATCH] Create a special thread to receive signals in the pthread fileserver, in order to avoid deadlock (we have signal handlers that unsafely grab locks). --- src/viced/viced.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/viced/viced.c b/src/viced/viced.c index 3fc8ef036..5473f4f25 100644 --- a/src/viced/viced.c +++ b/src/viced/viced.c @@ -319,6 +319,21 @@ CheckAdminName() } /*CheckAdminName*/ +#ifdef AFS_PTHREAD_ENV +/* A special LWP that will receive signals, to avoid deadlock */ +static void SignalLWP() +{ + sigset_t nsigset; + + sigfillset(&nsigset); + assert(AFS_SET_SIGMASK(SIG_UNBLOCK, &nsigset, NULL) == 0); + + while (1) + sleep(60); +} +#endif + + /* This LWP does things roughly every 5 minutes */ static void FiveMinuteCheckLWP() { @@ -1337,7 +1352,7 @@ main(int argc, char * argv[]) #ifdef AFS_PTHREAD_ENV pthread_t parentPid, serverPid; pthread_attr_t tattr; - AFS_SIGSET_DECL; + sigset_t nsigset; #else /* AFS_PTHREAD_ENV */ PROCESS parentPid, serverPid; #endif /* AFS_PTHREAD_ENV */ @@ -1609,12 +1624,14 @@ main(int argc, char * argv[]) #ifdef AFS_PTHREAD_ENV assert(pthread_attr_init(&tattr) == 0); assert(pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED) == 0); - /* Block signals in the threads */ - AFS_SIGSET_CLEAR(); + /* Block signals in this thread (and children), create a signal thread */ + sigfillset(&nsigset); + assert(AFS_SET_SIGMASK(SIG_BLOCK, &nsigset, NULL) == 0); + assert(pthread_create(&serverPid, &tattr, (void *)SignalLWP, NULL) == 0); + assert(pthread_create(&serverPid, &tattr, (void *)FiveMinuteCheckLWP, &fiveminutes) == 0); assert(pthread_create(&serverPid, &tattr, (void *)HostCheckLWP, &fiveminutes) == 0); assert(pthread_create(&serverPid, &tattr, (void *)FsyncCheckLWP, &fiveminutes) == 0); - AFS_SIGSET_RESTORE(); #else /* AFS_PTHREAD_ENV */ assert(LWP_CreateProcess(FiveMinuteCheckLWP, stack*1024, LWP_MAX_PRIORITY - 2, (void *) &fiveminutes, "FiveMinuteChecks", &serverPid) == LWP_SUCCESS); -- 2.39.5