2003-02-24  David Mosberger  <davidm@hpl.hp.com>

	* sysdeps/unix/sysv/linux/ia64/sysdep.S (__syscall_error): Fix
	unwind info.
This commit is contained in:
Ulrich Drepper 2003-02-27 10:32:38 +00:00
parent e361e438a1
commit d2637c7053
6 changed files with 63 additions and 15 deletions

View File

@ -1,3 +1,8 @@
2003-02-24 David Mosberger <davidm@hpl.hp.com>
* sysdeps/unix/sysv/linux/ia64/sysdep.S (__syscall_error): Fix
unwind info.
2003-02-27 Ulrich Drepper <drepper@redhat.com> 2003-02-27 Ulrich Drepper <drepper@redhat.com>
* resolv/res_libc.c [USE___THREAD] (_res): Don't need the * resolv/res_libc.c [USE___THREAD] (_res): Don't need the

View File

@ -1,3 +1,12 @@
2003-02-27 Ulrich Drepper <drepper@redhat.com>
* sysdeps/pthread/pthread_rwlock_unlock.c
(__pthread_rwlock_unlock): Release internal lock early. Don't try
to wake up readers if there are none.
* sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S:
Release internal lock before wake threads.
2003-02-26 Ulrich Drepper <drepper@redhat.com> 2003-02-26 Ulrich Drepper <drepper@redhat.com>
* Makefile (tests): Add tst-rwlock10 and tst-rwlock11. * Makefile (tests): Add tst-rwlock10 and tst-rwlock11.

View File

@ -96,11 +96,15 @@ pthread_rwlock_unlock(pthread_rwlock_t *rwlock)
if (!rwlock->readers) { if (!rwlock->readers) {
if (rwlock->nr_writers_queued) { if (rwlock->nr_writers_queued) {
++rwlock->writer_wakeup; ++rwlock->writer_wakeup;
lll_unlock(rwlock->lock);
futex_wake(&rwlock->writer_wakeup, 1); futex_wake(&rwlock->writer_wakeup, 1);
return;
} else } else
if (rwlock->nr_readers_queued) { if (rwlock->nr_readers_queued) {
++rwlock->readers_wakeup; ++rwlock->readers_wakeup;
lll_unlock(rwlock->lock);
futex_wake(&rwlock->readers_wakeup, MAX_INT); futex_wake(&rwlock->readers_wakeup, MAX_INT);
return;
} }
} }

View File

@ -24,27 +24,32 @@
#include <pthreadP.h> #include <pthreadP.h>
/* Unlock RWLOCK. */ /* Unlock RWLOCK. */
int __pthread_rwlock_unlock (pthread_rwlock_t *rwlock) int
__pthread_rwlock_unlock (pthread_rwlock_t *rwlock)
{ {
lll_mutex_lock(rwlock->__data.__lock); lll_mutex_lock (rwlock->__data.__lock);
if (rwlock->__data.__writer) if (rwlock->__data.__writer)
rwlock->__data.__writer = 0; rwlock->__data.__writer = 0;
else else
rwlock->__data.__nr_readers--; --rwlock->__data.__nr_readers;
if (!rwlock->__data.__nr_readers) if (rwlock->__data.__nr_readers == 0)
{ {
if (rwlock->__data.__nr_writers_queued) if (rwlock->__data.__nr_writers_queued)
{ {
++rwlock->__data.__writer_wakeup; ++rwlock->__data.__writer_wakeup;
lll_futex_wake(&rwlock->__data.__writer_wakeup, 1); lll_mutex_unlock (rwlock->__data.__lock);
lll_futex_wake (&rwlock->__data.__writer_wakeup, 1);
return 0;
} }
else else if (rwlock->__data.__nr_readers_queued)
{ {
++rwlock->__data.__readers_wakeup; ++rwlock->__data.__readers_wakeup;
lll_futex_wake(&rwlock->__data.__readers_wakeup, INT_MAX); lll_mutex_unlock (rwlock->__data.__lock);
lll_futex_wake (&rwlock->__data.__readers_wakeup, INT_MAX);
return 0;
} }
} }
lll_mutex_unlock(rwlock->__data.__lock); lll_mutex_unlock (rwlock->__data.__lock);
return 0; return 0;
} }

View File

@ -76,10 +76,25 @@ __pthread_rwlock_unlock:
leal READERS_WAKEUP(%edi), %ebx leal READERS_WAKEUP(%edi), %ebx
0: incl (%ebx) 0: incl (%ebx)
xorl %esi, %esi LOCK
#if MUTEX == 0
decl (%edi)
#else
decl MUTEX(%edi)
#endif
jne 7f
8: xorl %esi, %esi
movl $SYS_futex, %eax movl $SYS_futex, %eax
ENTER_KERNEL ENTER_KERNEL
xorl %eax, %eax
popl %edi
popl %esi
popl %ebx
ret
.align 16
6: LOCK 6: LOCK
#if MUTEX == 0 #if MUTEX == 0
decl (%edi) decl (%edi)
@ -112,6 +127,15 @@ __pthread_rwlock_unlock:
call __lll_mutex_unlock_wake call __lll_mutex_unlock_wake
jmp 4b jmp 4b
7:
#if MUTEX == 0
movl %edi, %eax
#else
leal MUTEX(%edx), %eax
#endif
call __lll_mutex_unlock_wake
jmp 8b
.size __pthread_rwlock_unlock,.-__pthread_rwlock_unlock .size __pthread_rwlock_unlock,.-__pthread_rwlock_unlock
.globl pthread_rwlock_unlock .globl pthread_rwlock_unlock

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. /* Copyright (C) 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>. Contributed by David Mosberger-Tang <davidm@hpl.hp.com>.
@ -23,18 +23,19 @@
ENTRY(__syscall_error) ENTRY(__syscall_error)
#ifdef _LIBC_REENTRANT #ifdef _LIBC_REENTRANT
.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(0) .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(0)
alloc r35=ar.pfs, 0, 4, 0, 0 alloc r33=ar.pfs, 0, 4, 0, 0
mov r32=rp mov r32=rp
mov r33=r8 .body
mov r35=r8
mov r34=r1 mov r34=r1
;; ;;
br.call.sptk.many b0 = __errno_location# br.call.sptk.many b0 = __errno_location
.Lret0: /* force new bundle */ .Lret0: /* force new bundle */
st4 [r8]=r33 st4 [r8]=r35
mov r1=r34 mov r1=r34
mov rp=r32 mov rp=r32
mov r8=-1 mov r8=-1
mov ar.pfs=r35 mov ar.pfs=r33
#else /* _LIBC_REENTRANT */ #else /* _LIBC_REENTRANT */
/* /*
* Note that the gp has to be set properly for this to work. * Note that the gp has to be set properly for this to work.