From e6574c9ca263afb7d408dd5ebf09ad8cb0178469 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 18 Jul 2000 17:18:38 +0000 Subject: Update. 2000-07-18 Kaz Kylheku * spinlock.c (__pthread_alt_lock, __pthread_alt_timedlock): Fixed bug whereby thr field of waitnode structure would not be correctly set unless a null self pointer is passed to the functions. Eliminated redundant calls to thread_self(). --- dlfcn/dlopen.c | 2 +- dlfcn/dlopenold.c | 2 +- dlfcn/dlsym.c | 4 ++-- dlfcn/dlvsym.c | 4 ++-- elf/dl-profstub.c | 6 ++---- linuxthreads/ChangeLog | 7 +++++++ linuxthreads/spinlock.c | 11 ++++++----- malloc/malloc.c | 11 +++++------ sysdeps/generic/machine-gmon.h | 7 +++---- 9 files changed, 29 insertions(+), 25 deletions(-) diff --git a/dlfcn/dlopen.c b/dlfcn/dlopen.c index 76636fdba4..dae0b5880e 100644 --- a/dlfcn/dlopen.c +++ b/dlfcn/dlopen.c @@ -46,7 +46,7 @@ __dlopen_check (const char *file, int mode) struct dlopen_args args; args.file = file; args.mode = mode; - args.caller = __builtin_return_address (0); + args.caller = RETURN_ADDRESS (0); return _dlerror_run (dlopen_doit, &args) ? NULL : args.new; } diff --git a/dlfcn/dlopenold.c b/dlfcn/dlopenold.c index 3fc39d6999..d08427aef7 100644 --- a/dlfcn/dlopenold.c +++ b/dlfcn/dlopenold.c @@ -50,7 +50,7 @@ __dlopen_nocheck (const char *file, int mode) { struct dlopen_args args; args.file = file; - args.caller = __builtin_return_address (0); + args.caller = RETURN_ADDRESS (0); if ((mode & RTLD_BINDING_MASK) == 0) /* By default assume RTLD_LAZY. */ diff --git a/dlfcn/dlsym.c b/dlfcn/dlsym.c index d1c5f735f8..8793da9746 100644 --- a/dlfcn/dlsym.c +++ b/dlfcn/dlsym.c @@ -1,5 +1,5 @@ /* Look up a symbol in a shared object loaded by `dlopen'. - Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + Copyright (C) 1995, 96, 97, 98, 99, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -44,7 +44,7 @@ void * dlsym (void *handle, const char *name) { struct dlsym_args args; - args.who = __builtin_return_address (0); + args.who = RETURN_ADDRESS (0); args.handle = handle; args.name = name; diff --git a/dlfcn/dlvsym.c b/dlfcn/dlvsym.c index e316cb53e0..a46fc8cddf 100644 --- a/dlfcn/dlvsym.c +++ b/dlfcn/dlvsym.c @@ -1,5 +1,5 @@ /* Look up a versioned symbol in a shared object loaded by `dlopen'. - Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + Copyright (C) 1995, 96, 97, 98, 99, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -48,7 +48,7 @@ __dlvsym (void *handle, const char *name, const char *version_str) args.handle = handle; args.name = name; - args.who = __builtin_return_address (0); + args.who = RETURN_ADDRESS (0); args.version = version_str; return (_dlerror_run (dlvsym_doit, &args) ? NULL : args.sym); diff --git a/elf/dl-profstub.c b/elf/dl-profstub.c index db6693bdce..37b6631d52 100644 --- a/elf/dl-profstub.c +++ b/elf/dl-profstub.c @@ -30,8 +30,7 @@ extern struct link_map *_dl_profile_map; void _dl_mcount_wrapper (void *selfpc) { - _dl_mcount ((ElfW(Addr)) __builtin_return_address (0), - (ElfW(Addr)) selfpc); + _dl_mcount ((ElfW(Addr)) RETURN_ADDRESS (0), (ElfW(Addr)) selfpc); } @@ -39,6 +38,5 @@ void _dl_mcount_wrapper_check (void *selfpc) { if (_dl_profile_map != NULL) - _dl_mcount ((ElfW(Addr)) __builtin_return_address (0), - (ElfW(Addr)) selfpc); + _dl_mcount ((ElfW(Addr)) RETURN_ADDRESS (0), (ElfW(Addr)) selfpc); } diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index 5d06c1c572..fe1a4ed2e0 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,10 @@ +2000-07-18 Kaz Kylheku + + * spinlock.c (__pthread_alt_lock, __pthread_alt_timedlock): Fixed + bug whereby thr field of waitnode structure would not be correctly + set unless a null self pointer is passed to the functions. + Eliminated redundant calls to thread_self(). + 2000-07-18 Jakub Jelinek * pthread.c (__pthread_initialize_manager): Lock diff --git a/linuxthreads/spinlock.c b/linuxthreads/spinlock.c index 38d6b8ef30..43190a2eda 100644 --- a/linuxthreads/spinlock.c +++ b/linuxthreads/spinlock.c @@ -345,7 +345,7 @@ static void wait_node_dequeue(struct wait_node **pp_head, if (pp_node == pp_head) { long oldvalue = (long) p_node; long newvalue = (long) p_node->next; - + if (__compare_and_swap((long *) pp_node, oldvalue, newvalue)) return; @@ -388,7 +388,7 @@ void __pthread_alt_lock(struct _pthread_fastlock * lock, wait_node.abandoned = 0; wait_node.next = (struct wait_node *) lock->__status; - wait_node.thr = self = thread_self(); + wait_node.thr = self; suspend_needed = 1; } @@ -408,7 +408,8 @@ void __pthread_alt_lock(struct _pthread_fastlock * lock, newstatus = 1; } else { if (self == NULL) - wait_node.thr = self = thread_self(); + self = thread_self(); + wait_node.thr = self; newstatus = (long) &wait_node; } wait_node.abandoned = 0; @@ -461,7 +462,7 @@ int __pthread_alt_timedlock(struct _pthread_fastlock * lock, p_wait_node->abandoned = 0; p_wait_node->next = (struct wait_node *) lock->__status; - p_wait_node->thr = self = thread_self(); + p_wait_node->thr = self; } WRITE_MEMORY_BARRIER(); @@ -478,7 +479,7 @@ int __pthread_alt_timedlock(struct _pthread_fastlock * lock, newstatus = 1; } else { if (self == NULL) - p_wait_node->thr = self = thread_self(); + p_wait_node->thr = self; newstatus = (long) p_wait_node; } p_wait_node->abandoned = 0; diff --git a/malloc/malloc.c b/malloc/malloc.c index f2246f6184..981aae690d 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -2678,7 +2678,7 @@ Void_t* mALLOc(bytes) size_t bytes; Void_t* result; #if defined __GNUC__ && __GNUC__ >= 2 - result = (*__malloc_hook)(bytes, __builtin_return_address (0)); + result = (*__malloc_hook)(bytes, RETURN_ADDRESS (0)); #else result = (*__malloc_hook)(bytes, NULL); #endif @@ -2996,7 +2996,7 @@ void fREe(mem) Void_t* mem; #if defined _LIBC || defined MALLOC_HOOKS if (__free_hook != NULL) { #if defined __GNUC__ && __GNUC__ >= 2 - (*__free_hook)(mem, __builtin_return_address (0)); + (*__free_hook)(mem, RETURN_ADDRESS (0)); #else (*__free_hook)(mem, NULL); #endif @@ -3201,7 +3201,7 @@ Void_t* rEALLOc(oldmem, bytes) Void_t* oldmem; size_t bytes; Void_t* result; #if defined __GNUC__ && __GNUC__ >= 2 - result = (*__realloc_hook)(oldmem, bytes, __builtin_return_address (0)); + result = (*__realloc_hook)(oldmem, bytes, RETURN_ADDRESS (0)); #else result = (*__realloc_hook)(oldmem, bytes, NULL); #endif @@ -3478,8 +3478,7 @@ Void_t* mEMALIGn(alignment, bytes) size_t alignment; size_t bytes; Void_t* result; #if defined __GNUC__ && __GNUC__ >= 2 - result = (*__memalign_hook)(alignment, bytes, - __builtin_return_address (0)); + result = (*__memalign_hook)(alignment, bytes, RETURN_ADDRESS (0)); #else result = (*__memalign_hook)(alignment, bytes, NULL); #endif @@ -3671,7 +3670,7 @@ Void_t* cALLOc(n, elem_size) size_t n; size_t elem_size; if (__malloc_hook != NULL) { sz = n * elem_size; #if defined __GNUC__ && __GNUC__ >= 2 - mem = (*__malloc_hook)(sz, __builtin_return_address (0)); + mem = (*__malloc_hook)(sz, RETURN_ADDRESS (0)); #else mem = (*__malloc_hook)(sz, NULL); #endif diff --git a/sysdeps/generic/machine-gmon.h b/sysdeps/generic/machine-gmon.h index 3b63707eaf..c0c1d7001e 100644 --- a/sysdeps/generic/machine-gmon.h +++ b/sysdeps/generic/machine-gmon.h @@ -1,5 +1,5 @@ /* Machine-dependent definitions for profiling support. Generic GCC 2 version. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -22,7 +22,7 @@ void *__builtin_return_address (unsigned int N) returns the return address of the frame N frames up. */ -/* Be warned that GCC cannot usefully compile __builtin_return_address(N) +/* Be warned that GCC cannot usefully compile __builtin_return_address(N) for N != 0 on all machines. In this case, you may have to write your own version of _mcount(). */ @@ -50,6 +50,5 @@ static inline void mcount_internal (u_long frompc, u_long selfpc) #define MCOUNT \ void _mcount (void) \ { \ - mcount_internal ((u_long) __builtin_return_address (1), \ - (u_long) __builtin_return_address (0)); \ + mcount_internal ((u_long) RETURN_ADDRESS (1), (u_long) RETURN_ADDRESS (0)); \ } -- cgit v1.2.3