diff options
author | Andreas Schwab <aschwab@redhat.com> | 2009-07-16 09:57:32 -0700 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2009-07-16 09:57:32 -0700 |
commit | 50158f95525ca59459a90f2a7bc65ceb892a0807 (patch) | |
tree | 1c1ecd6bab36b07e1643e7bb0142967cac85ba6c | |
parent | bec466d922ee22b94ac0d00415fb605e136efe6e (diff) | |
download | glibc-50158f95525ca59459a90f2a7bc65ceb892a0807.tar glibc-50158f95525ca59459a90f2a7bc65ceb892a0807.tar.gz glibc-50158f95525ca59459a90f2a7bc65ceb892a0807.tar.bz2 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-- | ChangeLog | 6 | ||||
-rw-r--r-- | nscd/cache.c | 2 |
2 files changed, 7 insertions, 1 deletions
@@ -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)); |