diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-05-10 17:07:30 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2007-05-10 17:07:30 +0000 |
commit | 6bad2cd171c7d81e9a43ccc79e91009438c948ac (patch) | |
tree | 86063014188ce685e4646023929ac7751dceacf6 | |
parent | 96bad006f14ac46ca7a59dc4c5ba5ed9ef7a1560 (diff) |
* nscd/connections.c (sighup_pending): New variable.
(nscd_run): If sighup_pending, prune all 3 caches.
(sighup_handler): Don't prune caches here, rather just set
sighup_pending flag.
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | nscd/connections.c | 46 |
2 files changed, 41 insertions, 12 deletions
@@ -1,3 +1,10 @@ +2006-07-02 Jakub Jelinek <jakub@redhat.com> + + * nscd/connections.c (sighup_pending): New variable. + (nscd_run): If sighup_pending, prune all 3 caches. + (sighup_handler): Don't prune caches here, rather just set + sighup_pending flag. + 2007-05-09 Jakub Jelinek <jakub@redhat.com> * sysdeps/ia64/fpu/fraiseexcpt.c (feraiseexcept): Don't raise overflow diff --git a/nscd/connections.c b/nscd/connections.c index 4e01b3182c..c3f9d0e7df 100644 --- a/nscd/connections.c +++ b/nscd/connections.c @@ -68,6 +68,7 @@ static gid_t *server_groups; # define NGROUPS 32 #endif static int server_ngroups; +static volatile int sighup_pending; static pthread_attr_t attr; @@ -1363,6 +1364,10 @@ nscd_run (void *p) if (readylist == NULL && to == ETIMEDOUT) { --nready; + + if (sighup_pending) + goto sighup_prune; + pthread_mutex_unlock (&readylist_lock); goto only_prune; } @@ -1372,6 +1377,34 @@ nscd_run (void *p) pthread_cond_wait (&readylist_cond, &readylist_lock); } + if (sighup_pending) + { + --nready; + pthread_cond_signal (&readylist_cond); + sighup_prune: + sighup_pending = 0; + pthread_mutex_unlock (&readylist_lock); + + /* Prune the password database. */ + if (dbs[pwddb].enabled) + prune_cache (&dbs[pwddb], LONG_MAX, -1); + + /* Prune the group database. */ + if (dbs[grpdb].enabled) + prune_cache (&dbs[grpdb], LONG_MAX, -1); + + /* Prune the host database. */ + if (dbs[hstdb].enabled) + prune_cache (&dbs[hstdb], LONG_MAX, -1); + + /* Re-locking. */ + pthread_mutex_lock (&readylist_lock); + + /* One more thread available. */ + ++nready; + continue; + } + struct fdlist *it = readylist->next; if (readylist->next == readylist) /* Just one entry on the list. */ @@ -1952,16 +1985,5 @@ finish_drop_privileges (void) void sighup_handler (int signum) { - /* Prune the password database. */ - if (dbs[pwddb].enabled) - prune_cache (&dbs[pwddb], LONG_MAX, -1); - - /* Prune the group database. */ - if (dbs[grpdb].enabled) - prune_cache (&dbs[grpdb], LONG_MAX, -1); - - /* Prune the host database. */ - if (dbs[hstdb].enabled) - prune_cache (&dbs[hstdb], LONG_MAX, -1); + sighup_pending = 1; } - |