about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAndreas Schwab <aschwab@redhat.com>2009-07-16 09:57:32 -0700
committerPetr Baudis <pasky@suse.cz>2009-07-16 20:41:54 +0200
commitcba457a16f1e4cc821ee1e28609f467787674a1f (patch)
treede3574ad41b8836ab08795b8537e8969d05b652e
parent475cfe06fa5de340302b2245e0a0a162d7350c32 (diff)
downloadglibc-cba457a16f1e4cc821ee1e28609f467787674a1f.tar.gz
glibc-cba457a16f1e4cc821ee1e28609f467787674a1f.tar.xz
glibc-cba457a16f1e4cc821ee1e28609f467787674a1f.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.
(cherry picked from commit 50158f95525ca59459a90f2a7bc65ceb892a0807)
-rw-r--r--ChangeLog6
-rw-r--r--nscd/cache.c2
2 files changed, 7 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 34a5ad631c..c71653d3f2 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));