-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* sysdeps/sparc/fpu/fraiseexcpt.c (__feraiseexcept): Fix raising
FE_UNDERFLOW on Niagara CPUs. * sysdeps/sparc/fpu/feholdexcpt.c (feholdexcept): Clear all exceptions. * sysdeps/unix/sysv/linux/sparc/internaltypes.h (sparc_new_sem, sparc_old_sem): New structs. * sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c (__sem_wait_cleanup): New function. (__new_sem_wait): Use sparc_new_sem structure. Bump and afterwards decrease nwaiters. Register __sem_wait_cleanup as cleanup handler. Pass isem->private ^ FUTEX_PRIVATE_FLAG as last argument to lll_futex_wait. (__old_sem_wait): New function. * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_wait.c: Include nptl/sysdeps/unix/sysv/linux/sparc version. * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_timedwait.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_post.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc32/sem_trywait.c (__new_sem_trywait): Use sparc_old_sem structure. * sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c (sem_timedwait): Use sparc_new_sem structure. Bump and afterwards decrease nwaiters. Register __sem_wait_cleanup as cleanup handler. Pass isem->private ^ FUTEX_PRIVATE_FLAG as last argument to lll_futex_timed_wait. * sysdeps/unix/sysv/linux/sparc/sparc32/sem_post.c (__new_sem_post): Use sparc_new_sem structure. Only wake if nwaiters > 0. Pass isem->private ^ FUTEX_PRIVATE_FLAG as last argument to lll_futex_wake. (__old_sem_post): New function. * sysdeps/unix/sysv/linux/sparc/sem_wait.c: New file. * sysdeps/unix/sysv/linux/sparc/sem_init.c: New file. * sysdeps/unix/sysv/linux/sparc/sem_timedwait.c: New file. * sysdeps/unix/sysv/linux/sparc/sem_post.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_init.c: Remove. * sysdeps/unix/sysv/linux/sparc/sparc32/sem_init.c: Remove. 2007-08-15 Jakub Jelinek <jakub@redhat.com> * sysdeps/sparc/fpu/fraiseexcpt.c (__feraiseexcept): Fix raising FE_UNDERFLOW on Niagara CPUs. * sysdeps/sparc/fpu/feholdexcpt.c (feholdexcept): Clear all exceptions.
- Loading branch information
Jakub Jelinek
committed
Aug 15, 2007
1 parent
d13f4a4
commit e4720b0
Showing
17 changed files
with
638 additions
and
94 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
/* sem_post -- post to a POSIX semaphore. SPARC version. | ||
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. | ||
The GNU C Library is free software; you can redistribute it and/or | ||
modify it under the terms of the GNU Lesser General Public | ||
License as published by the Free Software Foundation; either | ||
version 2.1 of the License, or (at your option) any later version. | ||
The GNU C Library is distributed in the hope that it will be useful, | ||
but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
Lesser General Public License for more details. | ||
You should have received a copy of the GNU Lesser General Public | ||
License along with the GNU C Library; if not, write to the Free | ||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | ||
02111-1307 USA. */ | ||
|
||
#include <errno.h> | ||
#include <sysdep.h> | ||
#include <lowlevellock.h> | ||
#include <internaltypes.h> | ||
#include <semaphore.h> | ||
|
||
#include <shlib-compat.h> | ||
|
||
int | ||
__new_sem_post (sem_t *sem) | ||
{ | ||
struct sparc_new_sem *isem = (struct sparc_new_sem *) sem; | ||
|
||
int nr = atomic_increment_val (&isem->value); | ||
atomic_full_barrier (); | ||
if (isem->nwaiters > 0) | ||
{ | ||
int err = lll_futex_wake (&isem->value, 1, | ||
isem->private ^ FUTEX_PRIVATE_FLAG); | ||
if (__builtin_expect (err, 0) < 0) | ||
{ | ||
__set_errno (-err); | ||
return -1; | ||
} | ||
} | ||
return 0; | ||
} | ||
versioned_symbol (libpthread, __new_sem_post, sem_post, GLIBC_2_1); | ||
|
||
|
||
#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_1) | ||
int | ||
attribute_compat_text_section | ||
__old_sem_post (sem_t *sem) | ||
{ | ||
struct sparc_old_sem *isem = (struct sparc_old_sem *) sem; | ||
|
||
int nr = atomic_increment_val (&isem->value); | ||
int err = lll_futex_wake (&isem->value, 1, | ||
isem->private ^ FUTEX_PRIVATE_FLAG); | ||
if (__builtin_expect (err, 0) < 0) | ||
{ | ||
__set_errno (-err); | ||
return -1; | ||
} | ||
return 0; | ||
} | ||
compat_symbol (libpthread, __old_sem_post, sem_post, GLIBC_2_0); | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
/* sem_timedwait -- wait on a semaphore. Generic futex-using version. | ||
Copyright (C) 2003, 2007 Free Software Foundation, Inc. | ||
This file is part of the GNU C Library. | ||
Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003. | ||
The GNU C Library is free software; you can redistribute it and/or | ||
modify it under the terms of the GNU Lesser General Public | ||
License as published by the Free Software Foundation; either | ||
version 2.1 of the License, or (at your option) any later version. | ||
The GNU C Library is distributed in the hope that it will be useful, | ||
but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
Lesser General Public License for more details. | ||
You should have received a copy of the GNU Lesser General Public | ||
License along with the GNU C Library; if not, write to the Free | ||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | ||
02111-1307 USA. */ | ||
|
||
#include <errno.h> | ||
#include <sysdep.h> | ||
#include <lowlevellock.h> | ||
#include <internaltypes.h> | ||
#include <semaphore.h> | ||
|
||
#include <pthreadP.h> | ||
#include <shlib-compat.h> | ||
|
||
|
||
extern void __sem_wait_cleanup (void *arg) attribute_hidden; | ||
|
||
|
||
int | ||
sem_timedwait (sem_t *sem, const struct timespec *abstime) | ||
{ | ||
struct sparc_new_sem *isem = (struct sparc_new_sem *) sem; | ||
int err; | ||
|
||
if (atomic_decrement_if_positive (&isem->value) > 0) | ||
return 0; | ||
|
||
if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000) | ||
{ | ||
__set_errno (EINVAL); | ||
return -1; | ||
} | ||
|
||
atomic_increment (&isem->nwaiters); | ||
|
||
pthread_cleanup_push (__sem_wait_cleanup, isem); | ||
|
||
while (1) | ||
{ | ||
struct timeval tv; | ||
struct timespec rt; | ||
int sec, nsec; | ||
|
||
/* Get the current time. */ | ||
__gettimeofday (&tv, NULL); | ||
|
||
/* Compute relative timeout. */ | ||
sec = abstime->tv_sec - tv.tv_sec; | ||
nsec = abstime->tv_nsec - tv.tv_usec * 1000; | ||
if (nsec < 0) | ||
{ | ||
nsec += 1000000000; | ||
--sec; | ||
} | ||
|
||
/* Already timed out? */ | ||
err = -ETIMEDOUT; | ||
if (sec < 0) | ||
{ | ||
__set_errno (ETIMEDOUT); | ||
err = -1; | ||
break; | ||
} | ||
|
||
/* Do wait. */ | ||
rt.tv_sec = sec; | ||
rt.tv_nsec = nsec; | ||
|
||
/* Enable asynchronous cancellation. Required by the standard. */ | ||
int oldtype = __pthread_enable_asynccancel (); | ||
|
||
err = lll_futex_timed_wait (&isem->value, 0, &rt, | ||
isem->private ^ FUTEX_PRIVATE_FLAG); | ||
|
||
/* Disable asynchronous cancellation. */ | ||
__pthread_disable_asynccancel (oldtype); | ||
|
||
if (err != 0 && err != -EWOULDBLOCK) | ||
{ | ||
__set_errno (-err); | ||
err = -1; | ||
break; | ||
} | ||
|
||
if (atomic_decrement_if_positive (&isem->value) > 0) | ||
{ | ||
err = 0; | ||
break; | ||
} | ||
} | ||
|
||
pthread_cleanup_pop (0); | ||
|
||
atomic_decrement (&isem->nwaiters); | ||
|
||
return err; | ||
} |
Oops, something went wrong.