diff options
Diffstat (limited to 'nscd')
-rw-r--r-- | nscd/cache.c | 9 | ||||
-rw-r--r-- | nscd/mem.c | 4 |
2 files changed, 11 insertions, 2 deletions
diff --git a/nscd/cache.c b/nscd/cache.c index 0c4dfc0dcf..38ddd6d7ec 100644 --- a/nscd/cache.c +++ b/nscd/cache.c @@ -452,6 +452,11 @@ prune_cache (struct database_dyn *table, time_t now, int fd) pthread_rwlock_wrlock (&table->lock); } + /* Now we start modifying the data. Make sure all readers of the + data are aware of this and temporarily don't use the data. */ + atomic_fetch_add_relaxed (&table->head->gc_cycle, 1); + assert ((table->head->gc_cycle & 1) == 1); + while (first <= last) { if (mark[first]) @@ -492,6 +497,10 @@ prune_cache (struct database_dyn *table, time_t now, int fd) ++first; } + /* Now we are done modifying the data. */ + atomic_fetch_add_relaxed (&table->head->gc_cycle, 1); + assert ((table->head->gc_cycle & 1) == 0); + /* It's all done. */ pthread_rwlock_unlock (&table->lock); diff --git a/nscd/mem.c b/nscd/mem.c index 3d10bb9b46..de5bd12db5 100644 --- a/nscd/mem.c +++ b/nscd/mem.c @@ -264,7 +264,7 @@ gc (struct database_dyn *db) /* Now we start modifying the data. Make sure all readers of the data are aware of this and temporarily don't use the data. */ - ++db->head->gc_cycle; + atomic_fetch_add_relaxed (&db->head->gc_cycle, 1); assert ((db->head->gc_cycle & 1) == 1); @@ -490,7 +490,7 @@ gc (struct database_dyn *db) /* Now we are done modifying the data. */ - ++db->head->gc_cycle; + atomic_fetch_add_relaxed (&db->head->gc_cycle, 1); assert ((db->head->gc_cycle & 1) == 0); /* We are done. */ |