aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schwab <aschwab@redhat.com>2009-07-16 09:57:32 -0700
committerUlrich Drepper <drepper@redhat.com>2009-07-16 09:57:32 -0700
commit50158f95525ca59459a90f2a7bc65ceb892a0807 (patch)
tree1c1ecd6bab36b07e1643e7bb0142967cac85ba6c
parentbec466d922ee22b94ac0d00415fb605e136efe6e (diff)
downloadglibc-50158f95525ca59459a90f2a7bc65ceb892a0807.zip
glibc-50158f95525ca59459a90f2a7bc65ceb892a0807.tar.gz
glibc-50158f95525ca59459a90f2a7bc65ceb892a0807.tar.bz2
Use correct release semantic in list update.
nscd uses lockfree lists and we need to ensure the correct release semantics is used when adding to the list.
-rw-r--r--ChangeLog6
-rw-r--r--nscd/cache.c2
2 files changed, 7 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 6ddf9a1..a81c5b4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,10 @@
2009-07-16 Ulrich Drepper <drepper@redhat.com>
+
+ * nscd/cache.c (cache_add): Use atomic_compare_and_exchange_bool_rel
+ instead of atomic_compare_and_exchange_bool_acq to ensure pointer
+ is written before the list head update.
+ Patch by Andreas Schwab <aschwab@redhat.com>.
+
Jakub Jelinek <jakub@redhat.com>
* malloc/malloc.c [ATOMIC_FASTBINS] (_int_free): Make check for
diff --git a/nscd/cache.c b/nscd/cache.c
index ab842ef..3e6793d 100644
--- a/nscd/cache.c
+++ b/nscd/cache.c
@@ -179,7 +179,7 @@ cache_add (int type, const void *key, size_t len, struct datahead *packet,
/* Put the new entry in the first position. */
do
newp->next = table->head->array[hash];
- while (atomic_compare_and_exchange_bool_acq (&table->head->array[hash],
+ while (atomic_compare_and_exchange_bool_rel (&table->head->array[hash],
(ref_t) ((char *) newp
- table->data),
(ref_t) newp->next));