mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 13:00:06 +00:00
* 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>
|
||||
|
||||
* 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.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@ -44,9 +44,12 @@ __new_sem_post:
|
||||
LOCK
|
||||
xaddl %edx, (%ebx)
|
||||
|
||||
testl %edx, %edx
|
||||
jne 2f
|
||||
|
||||
movl $SYS_futex, %eax
|
||||
movl $FUTEX_WAKE, %ecx
|
||||
addl $1, %edx
|
||||
movl $1, %edx
|
||||
ENTER_KERNEL
|
||||
|
||||
testl %eax, %eax
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003.
|
||||
|
||||
@ -32,12 +32,14 @@ __new_sem_post (sem_t *sem)
|
||||
int *futex = (int *) sem;
|
||||
|
||||
__asm __volatile (__lll_rel_instr ::: "memory");
|
||||
int nr = atomic_increment_val (futex);
|
||||
int err = lll_futex_wake (futex, nr);
|
||||
if (__builtin_expect (err, 0) < 0)
|
||||
if (atomic_increment_val (futex) == 1)
|
||||
{
|
||||
__set_errno (-err);
|
||||
return -1;
|
||||
int err = lll_futex_wake (futex, 1);
|
||||
if (__builtin_expect (err, 0) < 0)
|
||||
{
|
||||
__set_errno (-err);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
||||
|
||||
@ -31,12 +31,14 @@ __new_sem_post (sem_t *sem)
|
||||
{
|
||||
int *futex = (int *) sem;
|
||||
|
||||
int nr = atomic_increment_val (futex);
|
||||
int err = lll_futex_wake (futex, nr);
|
||||
if (__builtin_expect (err, 0) < 0)
|
||||
if (atomic_increment_val (futex) == 1)
|
||||
{
|
||||
__set_errno (-err);
|
||||
return -1;
|
||||
int err = lll_futex_wake (futex, 1);
|
||||
if (__builtin_expect (err, 0) < 0)
|
||||
{
|
||||
__set_errno (-err);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
||||
|
||||
@ -39,11 +39,14 @@ __new_sem_post (sem_t *sem)
|
||||
nr = ++*futex;
|
||||
__sparc32_atomic_do_unlock24 (futex + 1);
|
||||
}
|
||||
int err = lll_futex_wake (futex, nr);
|
||||
if (__builtin_expect (err, 0) < 0)
|
||||
if (nr == 1)
|
||||
{
|
||||
__set_errno (-err);
|
||||
return -1;
|
||||
int err = lll_futex_wake (futex, 1);
|
||||
if (__builtin_expect (err, 0) < 0)
|
||||
{
|
||||
__set_errno (-err);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
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.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@ -41,15 +41,18 @@ sem_post:
|
||||
LOCK
|
||||
xaddl %edx, (%rdi)
|
||||
|
||||
testl %edx, %edx
|
||||
jne 2f
|
||||
|
||||
movl $SYS_futex, %eax
|
||||
movl $FUTEX_WAKE, %esi
|
||||
incl %edx
|
||||
movl $1, %edx
|
||||
syscall
|
||||
|
||||
testq %rax, %rax
|
||||
js 1f
|
||||
|
||||
xorl %eax, %eax
|
||||
2: xorl %eax, %eax
|
||||
retq
|
||||
|
||||
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.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@ -40,12 +40,6 @@
|
||||
.align 16
|
||||
cfi_startproc
|
||||
sem_timedwait:
|
||||
/* First check for cancellation. */
|
||||
movl %fs:CANCELHANDLING, %eax
|
||||
andl $0xfffffff9, %eax
|
||||
cmpl $8, %eax
|
||||
je 11f
|
||||
|
||||
movl (%rdi), %eax
|
||||
2: testl %eax, %eax
|
||||
je 1f
|
||||
@ -160,16 +154,5 @@ sem_timedwait:
|
||||
|
||||
orl $-1, %eax
|
||||
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
|
||||
.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.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@ -37,12 +37,6 @@
|
||||
.align 16
|
||||
cfi_startproc
|
||||
sem_wait:
|
||||
/* First check for cancellation. */
|
||||
movl %fs:CANCELHANDLING, %eax
|
||||
andl $0xfffffff9, %eax
|
||||
cmpl $8, %eax
|
||||
je 4f
|
||||
|
||||
pushq %r12
|
||||
cfi_adjust_cfa_offset(8)
|
||||
cfi_offset(12, -16)
|
||||
@ -109,12 +103,5 @@ sem_wait:
|
||||
cfi_restore(12)
|
||||
|
||||
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
|
||||
.size sem_wait,.-sem_wait
|
||||
|
Loading…
Reference in New Issue
Block a user