about summary refs log tree commit diff
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.tar.gz
glibc-50158f95525ca59459a90f2a7bc65ceb892a0807.tar.xz
glibc-50158f95525ca59459a90f2a7bc65ceb892a0807.zip
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));