* sysdeps/unix/sysv/linux/sem_post.c: Only wake threads if old
value of semaphore was zero. * sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Likewise. * sysdeps/unix/sysv/linux/powerpc/sem_post.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc32/sem_post.c: Likewise. * sysdeps/unix/sysv/linux/x86_64/sem_post.S: Likewise. * sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Remove unnecessary extra cancellation test. * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: Likewise.
This commit is contained in:
parent
1d47e92f71
commit
83d87915da
|
@ -1,3 +1,16 @@
|
||||||
|
2007-05-14 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/sem_post.c: Only wake threads if old
|
||||||
|
value of semaphore was zero.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/sem_post.c: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/sparc32/sem_post.c: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/sem_post.S: Likewise.
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Remove unnecessary
|
||||||
|
extra cancellation test.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: Likewise.
|
||||||
|
|
||||||
2007-05-10 Ulrich Drepper <drepper@redhat.com>
|
2007-05-10 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
* descr.h (struct pthread): Rearrange members to fill hole in
|
* descr.h (struct pthread): Rearrange members to fill hole in
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
|
/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
|
@ -44,9 +44,12 @@ __new_sem_post:
|
||||||
LOCK
|
LOCK
|
||||||
xaddl %edx, (%ebx)
|
xaddl %edx, (%ebx)
|
||||||
|
|
||||||
|
testl %edx, %edx
|
||||||
|
jne 2f
|
||||||
|
|
||||||
movl $SYS_futex, %eax
|
movl $SYS_futex, %eax
|
||||||
movl $FUTEX_WAKE, %ecx
|
movl $FUTEX_WAKE, %ecx
|
||||||
addl $1, %edx
|
movl $1, %edx
|
||||||
ENTER_KERNEL
|
ENTER_KERNEL
|
||||||
|
|
||||||
testl %eax, %eax
|
testl %eax, %eax
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* sem_post -- post to a POSIX semaphore. Powerpc version.
|
/* sem_post -- post to a POSIX semaphore. Powerpc version.
|
||||||
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003.
|
Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003.
|
||||||
|
|
||||||
|
@ -32,12 +32,14 @@ __new_sem_post (sem_t *sem)
|
||||||
int *futex = (int *) sem;
|
int *futex = (int *) sem;
|
||||||
|
|
||||||
__asm __volatile (__lll_rel_instr ::: "memory");
|
__asm __volatile (__lll_rel_instr ::: "memory");
|
||||||
int nr = atomic_increment_val (futex);
|
if (atomic_increment_val (futex) == 1)
|
||||||
int err = lll_futex_wake (futex, nr);
|
|
||||||
if (__builtin_expect (err, 0) < 0)
|
|
||||||
{
|
{
|
||||||
__set_errno (-err);
|
int err = lll_futex_wake (futex, 1);
|
||||||
return -1;
|
if (__builtin_expect (err, 0) < 0)
|
||||||
|
{
|
||||||
|
__set_errno (-err);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* sem_post -- post to a POSIX semaphore. Generic futex-using version.
|
/* sem_post -- post to a POSIX semaphore. Generic futex-using version.
|
||||||
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
||||||
|
|
||||||
|
@ -31,12 +31,14 @@ __new_sem_post (sem_t *sem)
|
||||||
{
|
{
|
||||||
int *futex = (int *) sem;
|
int *futex = (int *) sem;
|
||||||
|
|
||||||
int nr = atomic_increment_val (futex);
|
if (atomic_increment_val (futex) == 1)
|
||||||
int err = lll_futex_wake (futex, nr);
|
|
||||||
if (__builtin_expect (err, 0) < 0)
|
|
||||||
{
|
{
|
||||||
__set_errno (-err);
|
int err = lll_futex_wake (futex, 1);
|
||||||
return -1;
|
if (__builtin_expect (err, 0) < 0)
|
||||||
|
{
|
||||||
|
__set_errno (-err);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* sem_post -- post to a POSIX semaphore. SPARC version.
|
/* sem_post -- post to a POSIX semaphore. SPARC version.
|
||||||
Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
|
Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
||||||
|
|
||||||
|
@ -39,11 +39,14 @@ __new_sem_post (sem_t *sem)
|
||||||
nr = ++*futex;
|
nr = ++*futex;
|
||||||
__sparc32_atomic_do_unlock24 (futex + 1);
|
__sparc32_atomic_do_unlock24 (futex + 1);
|
||||||
}
|
}
|
||||||
int err = lll_futex_wake (futex, nr);
|
if (nr == 1)
|
||||||
if (__builtin_expect (err, 0) < 0)
|
|
||||||
{
|
{
|
||||||
__set_errno (-err);
|
int err = lll_futex_wake (futex, 1);
|
||||||
return -1;
|
if (__builtin_expect (err, 0) < 0)
|
||||||
|
{
|
||||||
|
__set_errno (-err);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
|
/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
|
@ -41,15 +41,18 @@ sem_post:
|
||||||
LOCK
|
LOCK
|
||||||
xaddl %edx, (%rdi)
|
xaddl %edx, (%rdi)
|
||||||
|
|
||||||
|
testl %edx, %edx
|
||||||
|
jne 2f
|
||||||
|
|
||||||
movl $SYS_futex, %eax
|
movl $SYS_futex, %eax
|
||||||
movl $FUTEX_WAKE, %esi
|
movl $FUTEX_WAKE, %esi
|
||||||
incl %edx
|
movl $1, %edx
|
||||||
syscall
|
syscall
|
||||||
|
|
||||||
testq %rax, %rax
|
testq %rax, %rax
|
||||||
js 1f
|
js 1f
|
||||||
|
|
||||||
xorl %eax, %eax
|
2: xorl %eax, %eax
|
||||||
retq
|
retq
|
||||||
|
|
||||||
1:
|
1:
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
|
/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
|
@ -40,12 +40,6 @@
|
||||||
.align 16
|
.align 16
|
||||||
cfi_startproc
|
cfi_startproc
|
||||||
sem_timedwait:
|
sem_timedwait:
|
||||||
/* First check for cancellation. */
|
|
||||||
movl %fs:CANCELHANDLING, %eax
|
|
||||||
andl $0xfffffff9, %eax
|
|
||||||
cmpl $8, %eax
|
|
||||||
je 11f
|
|
||||||
|
|
||||||
movl (%rdi), %eax
|
movl (%rdi), %eax
|
||||||
2: testl %eax, %eax
|
2: testl %eax, %eax
|
||||||
je 1f
|
je 1f
|
||||||
|
@ -160,16 +154,5 @@ sem_timedwait:
|
||||||
|
|
||||||
orl $-1, %eax
|
orl $-1, %eax
|
||||||
jmp 10b
|
jmp 10b
|
||||||
cfi_adjust_cfa_offset(-48)
|
|
||||||
cfi_restore(14)
|
|
||||||
cfi_restore(13)
|
|
||||||
cfi_restore(12)
|
|
||||||
|
|
||||||
11: /* Canceled. */
|
|
||||||
movq $0xffffffffffffffff, %fs:RESULT
|
|
||||||
LOCK
|
|
||||||
orl $0x10, %fs:CANCELHANDLING
|
|
||||||
movq %fs:CLEANUP_JMP_BUF, %rdi
|
|
||||||
jmp HIDDEN_JUMPTARGET (__pthread_unwind)
|
|
||||||
cfi_endproc
|
cfi_endproc
|
||||||
.size sem_timedwait,.-sem_timedwait
|
.size sem_timedwait,.-sem_timedwait
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
|
/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
|
@ -37,12 +37,6 @@
|
||||||
.align 16
|
.align 16
|
||||||
cfi_startproc
|
cfi_startproc
|
||||||
sem_wait:
|
sem_wait:
|
||||||
/* First check for cancellation. */
|
|
||||||
movl %fs:CANCELHANDLING, %eax
|
|
||||||
andl $0xfffffff9, %eax
|
|
||||||
cmpl $8, %eax
|
|
||||||
je 4f
|
|
||||||
|
|
||||||
pushq %r12
|
pushq %r12
|
||||||
cfi_adjust_cfa_offset(8)
|
cfi_adjust_cfa_offset(8)
|
||||||
cfi_offset(12, -16)
|
cfi_offset(12, -16)
|
||||||
|
@ -109,12 +103,5 @@ sem_wait:
|
||||||
cfi_restore(12)
|
cfi_restore(12)
|
||||||
|
|
||||||
retq
|
retq
|
||||||
|
|
||||||
4: /* Canceled. */
|
|
||||||
movq $0xffffffffffffffff, %fs:RESULT
|
|
||||||
LOCK
|
|
||||||
orl $0x10, %fs:CANCELHANDLING
|
|
||||||
movq %fs:CLEANUP_JMP_BUF, %rdi
|
|
||||||
jmp HIDDEN_JUMPTARGET (__pthread_unwind)
|
|
||||||
cfi_endproc
|
cfi_endproc
|
||||||
.size sem_wait,.-sem_wait
|
.size sem_wait,.-sem_wait
|
||||||
|
|
Loading…
Reference in a new issue