diff --git a/ChangeLog b/ChangeLog index 76c82400ed..60d8001834 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2002-08-29 Jakub Jelinek + + * stdio-common/vfprintf.c (vfprintf): Add builtin_expect for + string_malloced, it is unlikely to be set. + Only call free with non-NULL workspace. + * sysdeps/sparc/sparc32/sparcv9/Makefile (sysdep-CFLAGS): Use + -mcpu=ultrasparc, not only tune for it. + (ASFLAGS*): Set unconditionally. + +2002-08-29 Jakub Jelinek + + * sysdeps/generic/readelflib.c (process_elf_file): Make loadaddr + ElfW(Addr). Don't mask upper 32-bits and lower 12 bits off from + p_vaddr/p_offset when computing loadaddr. + 2002-08-29 Ulrich Drepper * version.h (VERSION): Bump to 2.2.92. diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index 2ae14e01d8..93193ae754 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,13 @@ +2002-04-24 Steven Munroe + + * spinlock.c (__pthread_lock): Fix spurious wakeup + handling. Don't clear lowest bit of list pointer as sign the thread + is still on the wait list. Don't restart after spurious wakeup + with spinning to get the lock. + (__pthread_unlock): Take set lowest bit into account when handling + pointer to list elements. + Patch by Steve Munroe . + 2002-08-28 Roland McGrath * sysdeps/pthread/timer_routines.c (thread_func): Fix type in cast. diff --git a/linuxthreads/spinlock.c b/linuxthreads/spinlock.c index 582a95c2c2..47107bf9ee 100644 --- a/linuxthreads/spinlock.c +++ b/linuxthreads/spinlock.c @@ -85,8 +85,6 @@ void internal_function __pthread_lock(struct _pthread_fastlock * lock, spurious_wakeup_count = 0; spin_count = 0; -again: - /* On SMP, try spinning to get the lock. */ if (__pthread_smp_kernel) { @@ -114,6 +112,8 @@ again: lock->__spinlock += (spin_count - lock->__spinlock) / 8; } +again: + /* No luck, try once more or suspend. */ do { @@ -130,7 +130,7 @@ again: } if (self != NULL) { - THREAD_SETMEM(self, p_nextlock, (pthread_descr) (oldstatus & ~1L)); + THREAD_SETMEM(self, p_nextlock, (pthread_descr) (oldstatus)); /* Make sure the store in p_nextlock completes before performing the compare-and-swap */ MEMORY_BARRIER(); @@ -214,7 +214,7 @@ again: maxprio = thr->p_priority; } ptr = &(thr->p_nextlock); - thr = *ptr; + thr = (pthread_descr)((long)(thr->p_nextlock) & ~1L); } /* Remove max prio thread from waiting list. */ @@ -226,13 +226,13 @@ again: least significant bit is clear. */ thr = (pthread_descr) (oldstatus & ~1L); if (! __compare_and_swap_with_release_semantics - (&lock->__status, oldstatus, (long)(thr->p_nextlock))) + (&lock->__status, oldstatus, (long)(thr->p_nextlock) & ~1L)) goto again; } else { /* No risk of concurrent access, remove max prio thread normally. But in this case we must also flip the least significant bit of the status to mark the lock as released. */ - thr = *maxptr; + thr = (pthread_descr)((long)*maxptr & ~1L); *maxptr = thr->p_nextlock; /* Ensure deletion from linked list completes before we diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c index e59d6fbcd1..f181a0ae00 100644 --- a/stdio-common/vfprintf.c +++ b/stdio-common/vfprintf.c @@ -1084,7 +1084,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) outstring (string, len); \ if (left) \ PAD (L' '); \ - if (string_malloced) \ + if (__builin_expect (string_malloced, 0)) \ free (string); \ } \ break; @@ -1255,7 +1255,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) outstring (string, len); \ if (left) \ PAD (' '); \ - if (string_malloced) \ + if (__builtin_expect (string_malloced, 0)) \ free (string); \ } \ break; @@ -1595,7 +1595,8 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) /* The format is correctly handled. */ ++nspecs_done; - free (workstart); + if (__builtin_expect (workstart != NULL, 0)) + free (workstart); workstart = NULL; /* Look for next format specifier. */ @@ -1893,7 +1894,8 @@ do_positional: break; } - free (workstart); + if (__builtin_expect (workstart != NULL, 0)) + free (workstart); workstart = NULL; /* Write the following constant string. */ @@ -1904,7 +1906,8 @@ do_positional: } all_done: - free (workstart); + if (__builtin_expect (workstart != NULL, 0)) + free (workstart); /* Unlock the stream. */ #ifdef USE_IN_LIBIO _IO_funlockfile (s); diff --git a/sysdeps/generic/readelflib.c b/sysdeps/generic/readelflib.c index c8e439e4d6..27502a994a 100644 --- a/sysdeps/generic/readelflib.c +++ b/sysdeps/generic/readelflib.c @@ -37,7 +37,7 @@ do \ } \ } \ while (0); - + /* Returns 0 if everything is ok, != 0 in case of error. */ int process_elf_file (const char *file_name, const char *lib, int *flag, @@ -46,15 +46,15 @@ process_elf_file (const char *file_name, const char *lib, int *flag, { int i; unsigned int j; - int loadaddr; + ElfW(Addr) loadaddr; unsigned int dynamic_addr; size_t dynamic_size; char *program_interpreter; - + ElfW(Ehdr) *elf_header; ElfW(Phdr) *elf_pheader, *segment; ElfW(Dyn) *dynamic_segment, *dyn_entry; - char *dynamic_strings; + char *dynamic_strings; elf_header = (ElfW(Ehdr) *) file_contents; *osversion = 0; @@ -79,7 +79,7 @@ process_elf_file (const char *file_name, const char *lib, int *flag, elf_header->e_type); return 1; } - + /* Get information from elf program header. */ elf_pheader = (ElfW(Phdr) *) (elf_header->e_phoff + file_contents); check_ptr (elf_pheader); @@ -87,7 +87,7 @@ process_elf_file (const char *file_name, const char *lib, int *flag, /* The library is an elf library, now search for soname and libc5/libc6. */ *flag = FLAG_ELF; - + loadaddr = -1; dynamic_addr = 0; dynamic_size = 0; @@ -101,8 +101,7 @@ process_elf_file (const char *file_name, const char *lib, int *flag, { case PT_LOAD: if (loadaddr == -1) - loadaddr = (segment->p_vaddr & 0xfffff000) - - (segment->p_offset & 0xfffff000); + loadaddr = segment->p_vaddr - segment_p_offset; break; case PT_DYNAMIC: @@ -144,7 +143,7 @@ process_elf_file (const char *file_name, const char *lib, int *flag, default: break; } - + } if (loadaddr == -1) { @@ -155,7 +154,7 @@ process_elf_file (const char *file_name, const char *lib, int *flag, /* Now we can read the dynamic sections. */ if (dynamic_size == 0) return 1; - + dynamic_segment = (ElfW(Dyn) *) (file_contents + dynamic_addr); check_ptr (dynamic_segment); @@ -187,7 +186,7 @@ process_elf_file (const char *file_name, const char *lib, int *flag, if (dyn_entry->d_tag == DT_NEEDED) { - + if (*flag == FLAG_ELF) { /* Check if this is enough to classify the binary. */ @@ -204,7 +203,7 @@ process_elf_file (const char *file_name, const char *lib, int *flag, else if (dyn_entry->d_tag == DT_SONAME) *soname = xstrdup (name); - + /* Do we have everything we need? */ if (*soname && *flag != FLAG_ELF) return 0; diff --git a/sysdeps/sparc/sparc32/sparcv9/Makefile b/sysdeps/sparc/sparc32/sparcv9/Makefile index 3d46725e44..8067bda51e 100644 --- a/sysdeps/sparc/sparc32/sparcv9/Makefile +++ b/sysdeps/sparc/sparc32/sparcv9/Makefile @@ -1,15 +1,13 @@ -sysdep-CFLAGS += -mcpu=v8 -mtune=ultrasparc -Wa,-Av9a +sysdep-CFLAGS += -mcpu=ultrasparc -Wa,-Av9a ifeq ($(subdir),csu) sysdep_routines += hp-timing static-only-routines += hp-timing endif -ifeq ($(subst gnulib,string,$(subdir)),string) ASFLAGS-.o += -Wa,-Av9a ASFLAGS-.os += -Wa,-Av9a ASFLAGS-.op += -Wa,-Av9a ASFLAGS-.og += -Wa,-Av9a ASFLAGS-.ob += -Wa,-Av9a ASFLAGS-.oS += -Wa,-Av9a -endif