diff options
author | Ulrich Drepper <drepper@redhat.com> | 2006-05-29 07:00:16 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2006-05-29 07:00:16 +0000 |
commit | 9636a217e4a0a73113ffdaa9a2f0c8d1749cf1d9 (patch) | |
tree | eb310947247d941a4c71ca880fd1a9a132c8c4a0 | |
parent | ab50b2ec0193ad37c73d34c0e98ff16486af237e (diff) | |
download | glibc-9636a217e4a0a73113ffdaa9a2f0c8d1749cf1d9.zip glibc-9636a217e4a0a73113ffdaa9a2f0c8d1749cf1d9.tar.gz glibc-9636a217e4a0a73113ffdaa9a2f0c8d1749cf1d9.tar.bz2 |
* nscd/nscd.h (struct database_dyn): Add prunelock field.
* nscd/cache.c (prune_cache): Take prunelock before starting the
work. Just return in case it is already taken.
(inet6_option_alloc): Now a simple wrapper around option_alloc.
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | nscd/cache.c | 11 | ||||
-rw-r--r-- | nscd/nscd.h | 1 |
3 files changed, 18 insertions, 2 deletions
@@ -1,3 +1,9 @@ +2006-05-29 Ulrich Drepper <drepper@redhat.com> + + * nscd/nscd.h (struct database_dyn): Add prunelock field. + * nscd/cache.c (prune_cache): Take prunelock before starting the + work. Just return in case it is already taken. + 2006-05-25 Ulrich Drepper <drepper@redhat.com> * nis/nis_removemember.c (nis_removemember): Avoid unnecessary @@ -12,7 +18,7 @@ inet6_option_alloc. * inet/inet6_option.c (option_alloc): Renamed from inet6_option_alloc. Made static. - (inet6_option_alloc): New a simple wrapper around option_alloc. + (inet6_option_alloc): Now a simple wrapper around option_alloc. (inet6_option_append): Call option_alloc. * include/netinet/in.h: Remove libc_hidden_proto for inet6_option_alloc. diff --git a/nscd/cache.c b/nscd/cache.c index 787f8b4..899e2ca 100644 --- a/nscd/cache.c +++ b/nscd/cache.c @@ -1,4 +1,4 @@ -/* Copyright (c) 1998, 1999, 2003, 2004, 2005 Free Software Foundation, Inc. +/* Copyright (c) 1998, 1999, 2003-2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -198,6 +198,13 @@ prune_cache (struct database_dyn *table, time_t now) if (cnt == 0) return; + /* This function can be called from the cleanup thread but also in + response to an invalidate command. Make sure only one thread is + running. No need for the second to wait around. */ + if (pthread_mutex_trylock (&table->prunelock) != 0) + /* Te work is already being done. */ + return ; + /* If we check for the modification of the underlying file we invalidate the entries also in this case. */ if (table->check_file) @@ -455,4 +462,6 @@ prune_cache (struct database_dyn *table, time_t now) /* Run garbage collection if any entry has been removed or replaced. */ if (any) gc (table); + + pthread_mutex_unlock (&table->prunelock); } diff --git a/nscd/nscd.h b/nscd/nscd.h index 8b95630..4a95472 100644 --- a/nscd/nscd.h +++ b/nscd/nscd.h @@ -58,6 +58,7 @@ typedef enum struct database_dyn { pthread_rwlock_t lock; + pthread_mutex_t prunelock; int enabled; int check_file; |