diff options
author | Ulrich Drepper <drepper@redhat.com> | 2006-04-25 23:50:31 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2006-04-25 23:50:31 +0000 |
commit | 388df58d9be050a531948d5afb54d6104efa0845 (patch) | |
tree | e8fa04ce64895377becaaa3ba74cfc6519797608 /nscd/nscd_helper.c | |
parent | 5178e13aa29737c75e6c81f0d9238a0fa5d448be (diff) | |
download | glibc-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.c | 10 |
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)) { |