summaryrefslogtreecommitdiff
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)
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 6ddf9a1908..a81c5b46fb 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 ab842efc29..3e6793df2f 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));