aboutsummaryrefslogtreecommitdiff
path: root/nscd/nscd_helper.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2006-04-25 23:50:31 +0000
committerUlrich Drepper <drepper@redhat.com>2006-04-25 23:50:31 +0000
commit388df58d9be050a531948d5afb54d6104efa0845 (patch)
treee8fa04ce64895377becaaa3ba74cfc6519797608 /nscd/nscd_helper.c
parent5178e13aa29737c75e6c81f0d9238a0fa5d448be (diff)
downloadglibc-388df58d9be050a531948d5afb54d6104efa0845.zip
glibc-388df58d9be050a531948d5afb54d6104efa0845.tar.gz
glibc-388df58d9be050a531948d5afb54d6104efa0845.tar.bz2
[BZ #2571]
* nscd/nscd_helper.c (__nscd_get_map_ref): Make mapptr argument a volatile pointer so that the mapptr->mapped value is re-read after the lock is retrieved. * nscd/nscd-client.h: Update __nscd_get_map_ref prototype. * sysdeps/unix/sysv/linux/ia64/clone2.S: Check for NULL stack
Diffstat (limited to 'nscd/nscd_helper.c')
-rw-r--r--nscd/nscd_helper.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/nscd/nscd_helper.c b/nscd/nscd_helper.c
index fd74944..1dfe746 100644
--- a/nscd/nscd_helper.c
+++ b/nscd/nscd_helper.c
@@ -316,17 +316,18 @@ get_mapping (request_type type, const char *key,
struct mapped_database *
__nscd_get_map_ref (request_type type, const char *name,
- struct locked_map_ptr *mapptr, int *gc_cyclep)
+ volatile struct locked_map_ptr *mapptr, int *gc_cyclep)
{
struct mapped_database *cur = mapptr->mapped;
if (cur == NO_MAPPING)
return cur;
int cnt = 0;
- while (atomic_compare_and_exchange_val_acq (&mapptr->lock, 1, 0) != 0)
+ while (__builtin_expect (atomic_compare_and_exchange_val_acq (&mapptr->lock,
+ 1, 0) != 0, 0))
{
// XXX Best number of rounds?
- if (++cnt > 5)
+ if (__builtin_expect (++cnt > 5, 0))
return NO_MAPPING;
atomic_delay ();
@@ -340,7 +341,8 @@ __nscd_get_map_ref (request_type type, const char *name,
if (cur == NULL
|| (cur->head->nscd_certainly_running == 0
&& cur->head->timestamp + MAPPING_TIMEOUT < time (NULL)))
- cur = get_mapping (type, name, &mapptr->mapped);
+ cur = get_mapping (type, name,
+ (struct mapped_database **) &mapptr->mapped);
if (__builtin_expect (cur != NO_MAPPING, 1))
{