mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-28 00:21:52 +03:00
[BZ #4586]
2007-06-06 Jakub Jelinek <jakub@redhat.com> BZ #4586 * sysdeps/i386/ldbl2mpn.c (__mpn_extract_long_double): Treat pseudo-zeros as zero. * sysdeps/x86_64/ldbl2mpn.c: New file. * sysdeps/ia64/ldbl2mpn.c: New file.
This commit is contained in:
@ -1,3 +1,11 @@
|
|||||||
|
2007-06-06 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
BZ #4586
|
||||||
|
* sysdeps/i386/ldbl2mpn.c (__mpn_extract_long_double): Treat
|
||||||
|
pseudo-zeros as zero.
|
||||||
|
* sysdeps/x86_64/ldbl2mpn.c: New file.
|
||||||
|
* sysdeps/ia64/ldbl2mpn.c: New file.
|
||||||
|
|
||||||
2007-06-04 Jakub Jelinek <jakub@redhat.com>
|
2007-06-04 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* sysdeps/ieee754/ldbl-128ibm/printf_fphex.c
|
* sysdeps/ieee754/ldbl-128ibm/printf_fphex.c
|
||||||
|
@ -949,7 +949,7 @@ __nptl_setxid (struct xid_command *cmdp)
|
|||||||
int cur = cmdp->cntr;
|
int cur = cmdp->cntr;
|
||||||
while (cur != 0)
|
while (cur != 0)
|
||||||
{
|
{
|
||||||
lll_futex_wait (&cmdp->cntr, cur);
|
lll_private_futex_wait (&cmdp->cntr, cur);
|
||||||
cur = cmdp->cntr;
|
cur = cmdp->cntr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1035,7 +1035,7 @@ __wait_lookup_done (void)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
do
|
do
|
||||||
lll_futex_wait (gscope_flagp, THREAD_GSCOPE_FLAG_WAIT);
|
lll_private_futex_wait (gscope_flagp, THREAD_GSCOPE_FLAG_WAIT);
|
||||||
while (*gscope_flagp == THREAD_GSCOPE_FLAG_WAIT);
|
while (*gscope_flagp == THREAD_GSCOPE_FLAG_WAIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1057,7 +1057,7 @@ __wait_lookup_done (void)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
do
|
do
|
||||||
lll_futex_wait (gscope_flagp, THREAD_GSCOPE_FLAG_WAIT);
|
lll_private_futex_wait (gscope_flagp, THREAD_GSCOPE_FLAG_WAIT);
|
||||||
while (*gscope_flagp == THREAD_GSCOPE_FLAG_WAIT);
|
while (*gscope_flagp == THREAD_GSCOPE_FLAG_WAIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,7 +216,7 @@ sighandler_setxid (int sig, siginfo_t *si, void *ctx)
|
|||||||
__xidcmd->id[1], __xidcmd->id[2]);
|
__xidcmd->id[1], __xidcmd->id[2]);
|
||||||
|
|
||||||
if (atomic_decrement_val (&__xidcmd->cntr) == 0)
|
if (atomic_decrement_val (&__xidcmd->cntr) == 0)
|
||||||
lll_futex_wake (&__xidcmd->cntr, 1);
|
lll_private_futex_wake (&__xidcmd->cntr, 1);
|
||||||
|
|
||||||
/* Reset the SETXID flag. */
|
/* Reset the SETXID flag. */
|
||||||
struct pthread *self = THREAD_SELF;
|
struct pthread *self = THREAD_SELF;
|
||||||
@ -225,7 +225,7 @@ sighandler_setxid (int sig, siginfo_t *si, void *ctx)
|
|||||||
|
|
||||||
/* And release the futex. */
|
/* And release the futex. */
|
||||||
self->setxid_futex = 1;
|
self->setxid_futex = 1;
|
||||||
lll_futex_wake (&self->setxid_futex, 1);
|
lll_private_futex_wake (&self->setxid_futex, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Low level locking macros used in NPTL implementation. Stub version.
|
/* Low level locking macros used in NPTL implementation. Stub version.
|
||||||
Copyright (C) 2002 Free Software Foundation, Inc.
|
Copyright (C) 2002, 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.
|
||||||
|
|
||||||
@ -21,16 +21,6 @@
|
|||||||
#include <atomic.h>
|
#include <atomic.h>
|
||||||
|
|
||||||
|
|
||||||
/* Implement generic mutex. Basic futex syscall support is required:
|
|
||||||
|
|
||||||
lll_futex_wait(futex, value) - call sys_futex with FUTEX_WAIT
|
|
||||||
and third parameter VALUE
|
|
||||||
|
|
||||||
lll_futex_wake(futex, value) - call sys_futex with FUTEX_WAKE
|
|
||||||
and third parameter VALUE
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* Mutex lock counter:
|
/* Mutex lock counter:
|
||||||
bit 31 clear means unlocked;
|
bit 31 clear means unlocked;
|
||||||
bit 31 set means locked.
|
bit 31 set means locked.
|
||||||
@ -66,7 +56,9 @@ __generic_mutex_lock (int *mutex)
|
|||||||
if (v >= 0)
|
if (v >= 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
lll_futex_wait (mutex, v);
|
lll_futex_wait (mutex, v,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,7 +74,9 @@ __generic_mutex_unlock (int *mutex)
|
|||||||
|
|
||||||
/* There are other threads waiting for this mutex, wake one of them
|
/* There are other threads waiting for this mutex, wake one of them
|
||||||
up. */
|
up. */
|
||||||
lll_futex_wake (mutex, 1);
|
lll_futex_wake (mutex, 1,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* 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 Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
|
Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
|
||||||
|
|
||||||
@ -45,7 +45,9 @@ pthread_barrier_wait (barrier)
|
|||||||
++ibarrier->curr_event;
|
++ibarrier->curr_event;
|
||||||
|
|
||||||
/* Wake up everybody. */
|
/* Wake up everybody. */
|
||||||
lll_futex_wake (&ibarrier->curr_event, INT_MAX);
|
lll_futex_wake (&ibarrier->curr_event, INT_MAX,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
|
|
||||||
/* This is the thread which finished the serialization. */
|
/* This is the thread which finished the serialization. */
|
||||||
result = PTHREAD_BARRIER_SERIAL_THREAD;
|
result = PTHREAD_BARRIER_SERIAL_THREAD;
|
||||||
@ -61,7 +63,9 @@ pthread_barrier_wait (barrier)
|
|||||||
|
|
||||||
/* Wait for the event counter of the barrier to change. */
|
/* Wait for the event counter of the barrier to change. */
|
||||||
do
|
do
|
||||||
lll_futex_wait (&ibarrier->curr_event, event);
|
lll_futex_wait (&ibarrier->curr_event, event,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
while (event == ibarrier->curr_event);
|
while (event == ibarrier->curr_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* 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 Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
|
Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
|
||||||
|
|
||||||
@ -69,7 +69,9 @@ __pthread_cond_broadcast (cond)
|
|||||||
{
|
{
|
||||||
/* The requeue functionality is not available. */
|
/* The requeue functionality is not available. */
|
||||||
wake_all:
|
wake_all:
|
||||||
lll_futex_wake (&cond->__data.__futex, INT_MAX);
|
lll_futex_wake (&cond->__data.__futex, INT_MAX,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* That's all. */
|
/* That's all. */
|
||||||
|
@ -59,14 +59,18 @@ __pthread_cond_destroy (cond)
|
|||||||
&& cond->__data.__mutex != (void *) ~0l)
|
&& cond->__data.__mutex != (void *) ~0l)
|
||||||
{
|
{
|
||||||
pthread_mutex_t *mut = (pthread_mutex_t *) cond->__data.__mutex;
|
pthread_mutex_t *mut = (pthread_mutex_t *) cond->__data.__mutex;
|
||||||
lll_futex_wake (&mut->__data.__lock, INT_MAX);
|
lll_futex_wake (&mut->__data.__lock, INT_MAX,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
}
|
}
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
lll_mutex_unlock (cond->__data.__lock);
|
lll_mutex_unlock (cond->__data.__lock);
|
||||||
|
|
||||||
lll_futex_wait (&cond->__data.__nwaiters, nwaiters);
|
lll_futex_wait (&cond->__data.__nwaiters, nwaiters,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
|
|
||||||
lll_mutex_lock (cond->__data.__lock);
|
lll_mutex_lock (cond->__data.__lock);
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* 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 Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
|
Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
|
||||||
|
|
||||||
@ -44,11 +44,15 @@ __pthread_cond_signal (cond)
|
|||||||
|
|
||||||
/* Wake one. */
|
/* Wake one. */
|
||||||
if (! __builtin_expect (lll_futex_wake_unlock (&cond->__data.__futex, 1,
|
if (! __builtin_expect (lll_futex_wake_unlock (&cond->__data.__futex, 1,
|
||||||
1, &cond->__data.__lock),
|
1, &cond->__data.__lock,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED),
|
||||||
0))
|
0))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
lll_futex_wake (&cond->__data.__futex, 1);
|
lll_futex_wake (&cond->__data.__futex, 1,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We are done. */
|
/* We are done. */
|
||||||
|
@ -153,7 +153,9 @@ __pthread_cond_timedwait (cond, mutex, abstime)
|
|||||||
|
|
||||||
/* Wait until woken by signal or broadcast. */
|
/* Wait until woken by signal or broadcast. */
|
||||||
err = lll_futex_timed_wait (&cond->__data.__futex,
|
err = lll_futex_timed_wait (&cond->__data.__futex,
|
||||||
futex_val, &rt);
|
futex_val, &rt,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
|
|
||||||
/* Disable asynchronous cancellation. */
|
/* Disable asynchronous cancellation. */
|
||||||
__pthread_disable_asynccancel (cbuffer.oldtype);
|
__pthread_disable_asynccancel (cbuffer.oldtype);
|
||||||
@ -196,7 +198,9 @@ __pthread_cond_timedwait (cond, mutex, abstime)
|
|||||||
and it can be successfully destroyed. */
|
and it can be successfully destroyed. */
|
||||||
if (cond->__data.__total_seq == -1ULL
|
if (cond->__data.__total_seq == -1ULL
|
||||||
&& cond->__data.__nwaiters < (1 << COND_NWAITERS_SHIFT))
|
&& cond->__data.__nwaiters < (1 << COND_NWAITERS_SHIFT))
|
||||||
lll_futex_wake (&cond->__data.__nwaiters, 1);
|
lll_futex_wake (&cond->__data.__nwaiters, 1,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
|
|
||||||
/* We are done with the condvar. */
|
/* We are done with the condvar. */
|
||||||
lll_mutex_unlock (cond->__data.__lock);
|
lll_mutex_unlock (cond->__data.__lock);
|
||||||
|
@ -71,7 +71,9 @@ __condvar_cleanup (void *arg)
|
|||||||
if (cbuffer->cond->__data.__total_seq == -1ULL
|
if (cbuffer->cond->__data.__total_seq == -1ULL
|
||||||
&& cbuffer->cond->__data.__nwaiters < (1 << COND_NWAITERS_SHIFT))
|
&& cbuffer->cond->__data.__nwaiters < (1 << COND_NWAITERS_SHIFT))
|
||||||
{
|
{
|
||||||
lll_futex_wake (&cbuffer->cond->__data.__nwaiters, 1);
|
lll_futex_wake (&cbuffer->cond->__data.__nwaiters, 1,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
destroying = 1;
|
destroying = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,7 +82,9 @@ __condvar_cleanup (void *arg)
|
|||||||
|
|
||||||
/* Wake everybody to make sure no condvar signal gets lost. */
|
/* Wake everybody to make sure no condvar signal gets lost. */
|
||||||
if (! destroying)
|
if (! destroying)
|
||||||
lll_futex_wake (&cbuffer->cond->__data.__futex, INT_MAX);
|
lll_futex_wake (&cbuffer->cond->__data.__futex, INT_MAX,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
|
|
||||||
/* Get the mutex before returning unless asynchronous cancellation
|
/* Get the mutex before returning unless asynchronous cancellation
|
||||||
is in effect. */
|
is in effect. */
|
||||||
@ -146,7 +150,9 @@ __pthread_cond_wait (cond, mutex)
|
|||||||
cbuffer.oldtype = __pthread_enable_asynccancel ();
|
cbuffer.oldtype = __pthread_enable_asynccancel ();
|
||||||
|
|
||||||
/* Wait until woken by signal or broadcast. */
|
/* Wait until woken by signal or broadcast. */
|
||||||
lll_futex_wait (&cond->__data.__futex, futex_val);
|
lll_futex_wait (&cond->__data.__futex, futex_val,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
|
|
||||||
/* Disable asynchronous cancellation. */
|
/* Disable asynchronous cancellation. */
|
||||||
__pthread_disable_asynccancel (cbuffer.oldtype);
|
__pthread_disable_asynccancel (cbuffer.oldtype);
|
||||||
@ -175,7 +181,9 @@ __pthread_cond_wait (cond, mutex)
|
|||||||
and it can be successfully destroyed. */
|
and it can be successfully destroyed. */
|
||||||
if (cond->__data.__total_seq == -1ULL
|
if (cond->__data.__total_seq == -1ULL
|
||||||
&& cond->__data.__nwaiters < (1 << COND_NWAITERS_SHIFT))
|
&& cond->__data.__nwaiters < (1 << COND_NWAITERS_SHIFT))
|
||||||
lll_futex_wake (&cond->__data.__nwaiters, 1);
|
lll_futex_wake (&cond->__data.__nwaiters, 1,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
|
|
||||||
/* We are done with the condvar. */
|
/* We are done with the condvar. */
|
||||||
lll_mutex_unlock (cond->__data.__lock);
|
lll_mutex_unlock (cond->__data.__lock);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
/* Copyright (C) 2002,2003,2004,2005,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 Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
@ -385,7 +385,7 @@ start_thread (void *arg)
|
|||||||
/* Some other thread might call any of the setXid functions and expect
|
/* Some other thread might call any of the setXid functions and expect
|
||||||
us to reply. In this case wait until we did that. */
|
us to reply. In this case wait until we did that. */
|
||||||
do
|
do
|
||||||
lll_futex_wait (&pd->setxid_futex, 0);
|
lll_private_futex_wait (&pd->setxid_futex, 0);
|
||||||
while (pd->cancelhandling & SETXID_BITMASK);
|
while (pd->cancelhandling & SETXID_BITMASK);
|
||||||
|
|
||||||
/* Reset the value so that the stack can be reused. */
|
/* Reset the value so that the stack can be reused. */
|
||||||
|
@ -408,7 +408,9 @@ __pthread_mutex_lock (mutex)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
if (oldval != ceilval)
|
if (oldval != ceilval)
|
||||||
lll_futex_wait (&mutex->__data.__lock, ceilval | 2);
|
lll_futex_wait (&mutex->__data.__lock, ceilval | 2,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
}
|
}
|
||||||
while (atomic_compare_and_exchange_val_acq (&mutex->__data.__lock,
|
while (atomic_compare_and_exchange_val_acq (&mutex->__data.__lock,
|
||||||
ceilval | 2, ceilval)
|
ceilval | 2, ceilval)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Set current priority ceiling of pthread_mutex_t.
|
/* Set current priority ceiling of pthread_mutex_t.
|
||||||
Copyright (C) 2006 Free Software Foundation, Inc.
|
Copyright (C) 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>, 2006.
|
Contributed by Jakub Jelinek <jakub@redhat.com>, 2006.
|
||||||
|
|
||||||
@ -80,7 +80,9 @@ pthread_mutex_setprioceiling (mutex, prioceiling, old_ceiling)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
if (oldval != ceilval)
|
if (oldval != ceilval)
|
||||||
lll_futex_wait (&mutex->__data.__lock, ceilval | 2);
|
lll_futex_wait (&mutex->__data.__lock, ceilval | 2,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
}
|
}
|
||||||
while (atomic_compare_and_exchange_val_acq (&mutex->__data.__lock,
|
while (atomic_compare_and_exchange_val_acq (&mutex->__data.__lock,
|
||||||
ceilval | 2, ceilval)
|
ceilval | 2, ceilval)
|
||||||
@ -110,7 +112,9 @@ pthread_mutex_setprioceiling (mutex, prioceiling, old_ceiling)
|
|||||||
| (prioceiling << PTHREAD_MUTEX_PRIO_CEILING_SHIFT);
|
| (prioceiling << PTHREAD_MUTEX_PRIO_CEILING_SHIFT);
|
||||||
atomic_full_barrier ();
|
atomic_full_barrier ();
|
||||||
|
|
||||||
lll_futex_wake (&mutex->__data.__lock, INT_MAX);
|
lll_futex_wake (&mutex->__data.__lock, INT_MAX,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -441,7 +441,9 @@ pthread_mutex_timedlock (mutex, abstime)
|
|||||||
}
|
}
|
||||||
|
|
||||||
lll_futex_timed_wait (&mutex->__data.__lock,
|
lll_futex_timed_wait (&mutex->__data.__lock,
|
||||||
ceilval | 2, &rt);
|
ceilval | 2, &rt,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (atomic_compare_and_exchange_val_acq (&mutex->__data.__lock,
|
while (atomic_compare_and_exchange_val_acq (&mutex->__data.__lock,
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc.
|
/* Copyright (C) 2002, 2003, 2005, 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 Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
@ -240,7 +240,9 @@ __pthread_mutex_unlock_usercnt (mutex, decr)
|
|||||||
newval, oldval));
|
newval, oldval));
|
||||||
|
|
||||||
if ((oldval & ~PTHREAD_MUTEX_PRIO_CEILING_MASK) > 1)
|
if ((oldval & ~PTHREAD_MUTEX_PRIO_CEILING_MASK) > 1)
|
||||||
lll_futex_wake (&mutex->__data.__lock, 1);
|
lll_futex_wake (&mutex->__data.__lock, 1,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
|
|
||||||
int oldprio = newval >> PTHREAD_MUTEX_PRIO_CEILING_SHIFT;
|
int oldprio = newval >> PTHREAD_MUTEX_PRIO_CEILING_SHIFT;
|
||||||
return __pthread_tpp_change_priority (oldprio, -1);
|
return __pthread_tpp_change_priority (oldprio, -1);
|
||||||
|
@ -114,7 +114,9 @@ pthread_rwlock_timedrdlock (rwlock, abstime)
|
|||||||
|
|
||||||
/* Wait for the writer to finish. */
|
/* Wait for the writer to finish. */
|
||||||
err = lll_futex_timed_wait (&rwlock->__data.__readers_wakeup,
|
err = lll_futex_timed_wait (&rwlock->__data.__readers_wakeup,
|
||||||
waitval, &rt);
|
waitval, &rt,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
|
|
||||||
/* Get the lock. */
|
/* Get the lock. */
|
||||||
lll_mutex_lock (rwlock->__data.__lock);
|
lll_mutex_lock (rwlock->__data.__lock);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* 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 Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
|
Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
|
||||||
|
|
||||||
@ -104,7 +104,9 @@ pthread_rwlock_timedwrlock (rwlock, abstime)
|
|||||||
|
|
||||||
/* Wait for the writer or reader(s) to finish. */
|
/* Wait for the writer or reader(s) to finish. */
|
||||||
err = lll_futex_timed_wait (&rwlock->__data.__writer_wakeup,
|
err = lll_futex_timed_wait (&rwlock->__data.__writer_wakeup,
|
||||||
waitval, &rt);
|
waitval, &rt,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
|
|
||||||
/* Get the lock. */
|
/* Get the lock. */
|
||||||
lll_mutex_lock (rwlock->__data.__lock);
|
lll_mutex_lock (rwlock->__data.__lock);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
/* Copyright (C) 2003, 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 Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
|
Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
|
||||||
|
|
||||||
@ -38,14 +38,18 @@ __pthread_rwlock_unlock (pthread_rwlock_t *rwlock)
|
|||||||
{
|
{
|
||||||
++rwlock->__data.__writer_wakeup;
|
++rwlock->__data.__writer_wakeup;
|
||||||
lll_mutex_unlock (rwlock->__data.__lock);
|
lll_mutex_unlock (rwlock->__data.__lock);
|
||||||
lll_futex_wake (&rwlock->__data.__writer_wakeup, 1);
|
lll_futex_wake (&rwlock->__data.__writer_wakeup, 1,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else if (rwlock->__data.__nr_readers_queued)
|
else if (rwlock->__data.__nr_readers_queued)
|
||||||
{
|
{
|
||||||
++rwlock->__data.__readers_wakeup;
|
++rwlock->__data.__readers_wakeup;
|
||||||
lll_mutex_unlock (rwlock->__data.__lock);
|
lll_mutex_unlock (rwlock->__data.__lock);
|
||||||
lll_futex_wake (&rwlock->__data.__readers_wakeup, INT_MAX);
|
lll_futex_wake (&rwlock->__data.__readers_wakeup, INT_MAX,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -131,7 +131,7 @@ typedef struct
|
|||||||
= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
|
= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
|
||||||
THREAD_GSCOPE_FLAG_UNUSED); \
|
THREAD_GSCOPE_FLAG_UNUSED); \
|
||||||
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
|
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
|
||||||
lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
|
lll_private_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
#define THREAD_GSCOPE_SET_FLAG() \
|
#define THREAD_GSCOPE_SET_FLAG() \
|
||||||
|
@ -449,7 +449,7 @@ union user_desc_init
|
|||||||
: "i" (offsetof (struct pthread, header.gscope_flag)), \
|
: "i" (offsetof (struct pthread, header.gscope_flag)), \
|
||||||
"0" (THREAD_GSCOPE_FLAG_UNUSED)); \
|
"0" (THREAD_GSCOPE_FLAG_UNUSED)); \
|
||||||
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
|
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
|
||||||
lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
|
lll_private_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
#define THREAD_GSCOPE_SET_FLAG() \
|
#define THREAD_GSCOPE_SET_FLAG() \
|
||||||
|
@ -173,7 +173,7 @@ register struct pthread *__thread_self __asm__("r13");
|
|||||||
= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
|
= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
|
||||||
THREAD_GSCOPE_FLAG_UNUSED); \
|
THREAD_GSCOPE_FLAG_UNUSED); \
|
||||||
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
|
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
|
||||||
lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
|
lll_private_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
#define THREAD_GSCOPE_SET_FLAG() \
|
#define THREAD_GSCOPE_SET_FLAG() \
|
||||||
|
@ -190,7 +190,7 @@ register void *__thread_register __asm__ ("r13");
|
|||||||
= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
|
= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
|
||||||
THREAD_GSCOPE_FLAG_UNUSED); \
|
THREAD_GSCOPE_FLAG_UNUSED); \
|
||||||
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
|
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
|
||||||
lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
|
lll_private_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
#define THREAD_GSCOPE_SET_FLAG() \
|
#define THREAD_GSCOPE_SET_FLAG() \
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2006 Free Software Foundation, Inc.
|
/* Copyright (C) 2006, 2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -30,7 +30,7 @@
|
|||||||
#define AIO_MISC_NOTIFY(waitlist) \
|
#define AIO_MISC_NOTIFY(waitlist) \
|
||||||
do { \
|
do { \
|
||||||
if (*waitlist->counterp > 0 && --*waitlist->counterp == 0) \
|
if (*waitlist->counterp > 0 && --*waitlist->counterp == 0) \
|
||||||
lll_futex_wake (waitlist->counterp, 1); \
|
lll_private_futex_wake (waitlist->counterp, 1); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define AIO_MISC_WAIT(result, futex, timeout, cancel) \
|
#define AIO_MISC_WAIT(result, futex, timeout, cancel) \
|
||||||
@ -49,7 +49,8 @@
|
|||||||
int status; \
|
int status; \
|
||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
status = lll_futex_timed_wait (futexaddr, oldval, timeout); \
|
status = lll_private_futex_timed_wait (futexaddr, oldval, \
|
||||||
|
timeout); \
|
||||||
if (status != -EWOULDBLOCK) \
|
if (status != -EWOULDBLOCK) \
|
||||||
break; \
|
break; \
|
||||||
\
|
\
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2006 Free Software Foundation, Inc.
|
/* Copyright (C) 2006, 2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -31,7 +31,7 @@
|
|||||||
#define GAI_MISC_NOTIFY(waitlist) \
|
#define GAI_MISC_NOTIFY(waitlist) \
|
||||||
do { \
|
do { \
|
||||||
if (*waitlist->counterp > 0 && --*waitlist->counterp == 0) \
|
if (*waitlist->counterp > 0 && --*waitlist->counterp == 0) \
|
||||||
lll_futex_wake (waitlist->counterp, 1); \
|
lll_private_futex_wake (waitlist->counterp, 1); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define GAI_MISC_WAIT(result, futex, timeout, cancel) \
|
#define GAI_MISC_WAIT(result, futex, timeout, cancel) \
|
||||||
@ -50,7 +50,8 @@
|
|||||||
int status; \
|
int status; \
|
||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
status = lll_futex_timed_wait (futexaddr, oldval, timeout); \
|
status = lll_private_futex_timed_wait (futexaddr, oldval, \
|
||||||
|
timeout); \
|
||||||
if (status != -EWOULDBLOCK) \
|
if (status != -EWOULDBLOCK) \
|
||||||
break; \
|
break; \
|
||||||
\
|
\
|
||||||
|
@ -183,7 +183,7 @@ typedef struct
|
|||||||
= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
|
= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
|
||||||
THREAD_GSCOPE_FLAG_UNUSED); \
|
THREAD_GSCOPE_FLAG_UNUSED); \
|
||||||
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
|
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
|
||||||
lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
|
lll_private_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
#define THREAD_GSCOPE_SET_FLAG() \
|
#define THREAD_GSCOPE_SET_FLAG() \
|
||||||
|
@ -160,7 +160,7 @@ typedef struct
|
|||||||
= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
|
= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
|
||||||
THREAD_GSCOPE_FLAG_UNUSED); \
|
THREAD_GSCOPE_FLAG_UNUSED); \
|
||||||
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
|
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
|
||||||
lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
|
lll_private_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
#define THREAD_GSCOPE_SET_FLAG() \
|
#define THREAD_GSCOPE_SET_FLAG() \
|
||||||
|
@ -151,7 +151,7 @@ register struct pthread *__thread_self __asm__("%g7");
|
|||||||
= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
|
= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
|
||||||
THREAD_GSCOPE_FLAG_UNUSED); \
|
THREAD_GSCOPE_FLAG_UNUSED); \
|
||||||
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
|
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
|
||||||
lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
|
lll_private_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
#define THREAD_GSCOPE_SET_FLAG() \
|
#define THREAD_GSCOPE_SET_FLAG() \
|
||||||
|
@ -203,7 +203,7 @@ __libc_fork (void)
|
|||||||
|
|
||||||
if (atomic_decrement_and_test (&allp->handler->refcntr)
|
if (atomic_decrement_and_test (&allp->handler->refcntr)
|
||||||
&& allp->handler->need_signal)
|
&& allp->handler->need_signal)
|
||||||
lll_futex_wake (allp->handler->refcntr, 1);
|
lll_private_futex_wake (allp->handler->refcntr, 1);
|
||||||
|
|
||||||
allp = allp->next;
|
allp = allp->next;
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,8 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <bits/pthreadtypes.h>
|
#include <bits/pthreadtypes.h>
|
||||||
|
#include <kernel-features.h>
|
||||||
|
#include <tcb-offsets.h>
|
||||||
|
|
||||||
#ifndef LOCK_INSTR
|
#ifndef LOCK_INSTR
|
||||||
# ifdef UP
|
# ifdef UP
|
||||||
@ -41,6 +43,13 @@
|
|||||||
#define FUTEX_PRIVATE_FLAG 128
|
#define FUTEX_PRIVATE_FLAG 128
|
||||||
|
|
||||||
|
|
||||||
|
/* Values for 'private' parameter of locking macros. Yes, the
|
||||||
|
definition seems to be backwards. But it is not. The bit will be
|
||||||
|
reversed before passing to the system call. */
|
||||||
|
#define LLL_PRIVATE 0
|
||||||
|
#define LLL_SHARED FUTEX_PRIVATE_FLAG
|
||||||
|
|
||||||
|
|
||||||
/* Initializer for compatibility lock. */
|
/* Initializer for compatibility lock. */
|
||||||
#define LLL_MUTEX_LOCK_INITIALIZER (0)
|
#define LLL_MUTEX_LOCK_INITIALIZER (0)
|
||||||
#define LLL_MUTEX_LOCK_INITIALIZER_LOCKED (1)
|
#define LLL_MUTEX_LOCK_INITIALIZER_LOCKED (1)
|
||||||
@ -145,23 +154,11 @@ LLL_STUB_UNWIND_INFO_START \
|
|||||||
LLL_STUB_UNWIND_INFO_END
|
LLL_STUB_UNWIND_INFO_END
|
||||||
|
|
||||||
|
|
||||||
#define lll_futex_wait(futex, val) \
|
#define lll_futex_wait(futex, val, private) \
|
||||||
({ \
|
lll_futex_timed_wait (futex, val, NULL, private)
|
||||||
int __status; \
|
|
||||||
register __typeof (val) _val asm ("edx") = (val); \
|
|
||||||
__asm __volatile (LLL_EBX_LOAD \
|
|
||||||
LLL_ENTER_KERNEL \
|
|
||||||
LLL_EBX_LOAD \
|
|
||||||
: "=a" (__status) \
|
|
||||||
: "0" (SYS_futex), LLL_EBX_REG (futex), "S" (0), \
|
|
||||||
"c" (FUTEX_WAIT), "d" (_val), \
|
|
||||||
"i" (offsetof (tcbhead_t, sysinfo)) \
|
|
||||||
: "memory"); \
|
|
||||||
__status; \
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
#define lll_futex_timed_wait(futex, val, timeout) \
|
#define lll_futex_timed_wait(futex, val, timeout, private) \
|
||||||
({ \
|
({ \
|
||||||
int __status; \
|
int __status; \
|
||||||
register __typeof (val) _val asm ("edx") = (val); \
|
register __typeof (val) _val asm ("edx") = (val); \
|
||||||
@ -177,7 +174,7 @@ LLL_STUB_UNWIND_INFO_END
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
#define lll_futex_wake(futex, nr) \
|
#define lll_futex_wake(futex, nr, private) \
|
||||||
do { \
|
do { \
|
||||||
int __ignore; \
|
int __ignore; \
|
||||||
register __typeof (nr) _nr asm ("edx") = (nr); \
|
register __typeof (nr) _nr asm ("edx") = (nr); \
|
||||||
@ -192,6 +189,77 @@ LLL_STUB_UNWIND_INFO_END
|
|||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
#define lll_private_futex_wait(futex, val) \
|
||||||
|
lll_private_futex_timed_wait (futex, val, NULL)
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __ASSUME_PRIVATE_FUTEX
|
||||||
|
# define lll_private_futex_timed_wait(futex, val, timeout) \
|
||||||
|
({ \
|
||||||
|
int __status; \
|
||||||
|
register __typeof (val) _val asm ("edx") = (val); \
|
||||||
|
__asm __volatile (LLL_EBX_LOAD \
|
||||||
|
LLL_ENTER_KERNEL \
|
||||||
|
LLL_EBX_LOAD \
|
||||||
|
: "=a" (__status) \
|
||||||
|
: "0" (SYS_futex), LLL_EBX_REG (futex), "S" (timeout), \
|
||||||
|
"c" (FUTEX_WAIT | FUTEX_PRIVATE_FLAG)), "d" (_val), \
|
||||||
|
"i" (offsetof (tcbhead_t, sysinfo)) \
|
||||||
|
: "memory"); \
|
||||||
|
__status; \
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
# define lll_private_futex_wake(futex, nr) \
|
||||||
|
do { \
|
||||||
|
int __ignore; \
|
||||||
|
register __typeof (nr) _nr asm ("edx") = (nr); \
|
||||||
|
__asm __volatile (LLL_EBX_LOAD \
|
||||||
|
LLL_ENTER_KERNEL \
|
||||||
|
LLL_EBX_LOAD \
|
||||||
|
: "=a" (__ignore) \
|
||||||
|
: "0" (SYS_futex), LLL_EBX_REG (futex), \
|
||||||
|
"c" (FUTEX_WAKE | FUTEX_PRIVATE_FLAG), "d" (_nr), \
|
||||||
|
"i" (0) /* phony, to align next arg's number */, \
|
||||||
|
"i" (offsetof (tcbhead_t, sysinfo))); \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
# define lll_private_futex_timed_wait(futex, val, timeout) \
|
||||||
|
({ \
|
||||||
|
int __status; \
|
||||||
|
int __ignore; \
|
||||||
|
register __typeof (val) _val asm ("edx") = (val); \
|
||||||
|
__asm __volatile ("movl %%gs:%P7, %%ecx\n\t" \
|
||||||
|
LLL_EBX_LOAD \
|
||||||
|
LLL_ENTER_KERNEL \
|
||||||
|
LLL_EBX_LOAD \
|
||||||
|
: "=a" (__status), "=c" (__ignore) \
|
||||||
|
: LLL_EBX_REG (futex), "0" (SYS_futex), "S" (timeout), \
|
||||||
|
"d" (_val), "i" (offsetof (tcbhead_t, sysinfo)), \
|
||||||
|
"i" (PRIVATE_FUTEX) \
|
||||||
|
: "memory"); \
|
||||||
|
__status; \
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
# define lll_private_futex_wake(futex, nr) \
|
||||||
|
do { \
|
||||||
|
int __ignore; \
|
||||||
|
int __ignore2; \
|
||||||
|
register __typeof (nr) _nr asm ("edx") = (nr); \
|
||||||
|
__asm __volatile ("orl %%gs:%P7, %%ecx\n\t" \
|
||||||
|
LLL_EBX_LOAD \
|
||||||
|
LLL_ENTER_KERNEL \
|
||||||
|
LLL_EBX_LOAD \
|
||||||
|
: "=a" (__ignore), "=c" (__ignore2) \
|
||||||
|
: LLL_EBX_REG (futex), "0" (SYS_futex), \
|
||||||
|
"1" (FUTEX_WAKE), "d" (_nr), \
|
||||||
|
"i" (offsetof (tcbhead_t, sysinfo)), \
|
||||||
|
"i" (PRIVATE_FUTEX)); \
|
||||||
|
} while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Does not preserve %eax and %ecx. */
|
/* Does not preserve %eax and %ecx. */
|
||||||
extern int __lll_mutex_lock_wait (int val, int *__futex)
|
extern int __lll_mutex_lock_wait (int val, int *__futex)
|
||||||
__attribute ((regparm (2))) attribute_hidden;
|
__attribute ((regparm (2))) attribute_hidden;
|
||||||
@ -415,21 +483,6 @@ extern int __lll_mutex_unlock_wake (int *__futex)
|
|||||||
"i" (offsetof (tcbhead_t, sysinfo))); })
|
"i" (offsetof (tcbhead_t, sysinfo))); })
|
||||||
|
|
||||||
|
|
||||||
#define lll_futex_wake(futex, nr) \
|
|
||||||
do { \
|
|
||||||
int __ignore; \
|
|
||||||
register __typeof (nr) _nr asm ("edx") = (nr); \
|
|
||||||
__asm __volatile (LLL_EBX_LOAD \
|
|
||||||
LLL_ENTER_KERNEL \
|
|
||||||
LLL_EBX_LOAD \
|
|
||||||
: "=a" (__ignore) \
|
|
||||||
: "0" (SYS_futex), LLL_EBX_REG (futex), \
|
|
||||||
"c" (FUTEX_WAKE), "d" (_nr), \
|
|
||||||
"i" (0) /* phony, to align next arg's number */, \
|
|
||||||
"i" (offsetof (tcbhead_t, sysinfo))); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
|
|
||||||
#define lll_mutex_islocked(futex) \
|
#define lll_mutex_islocked(futex) \
|
||||||
(futex != 0)
|
(futex != 0)
|
||||||
|
|
||||||
|
@ -31,7 +31,9 @@ __lll_lock_wait (int *futex)
|
|||||||
{
|
{
|
||||||
int oldval = atomic_compare_and_exchange_val_acq (futex, 2, 1);
|
int oldval = atomic_compare_and_exchange_val_acq (futex, 2, 1);
|
||||||
if (oldval != 0)
|
if (oldval != 0)
|
||||||
lll_futex_wait (futex, 2);
|
lll_futex_wait (futex, 2,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
}
|
}
|
||||||
while (atomic_compare_and_exchange_bool_acq (futex, 2, 0) != 0);
|
while (atomic_compare_and_exchange_bool_acq (futex, 2, 0) != 0);
|
||||||
}
|
}
|
||||||
@ -68,7 +70,9 @@ __lll_timedlock_wait (int *futex, const struct timespec *abstime)
|
|||||||
/* Wait. */
|
/* Wait. */
|
||||||
int oldval = atomic_compare_and_exchange_val_acq (futex, 2, 1);
|
int oldval = atomic_compare_and_exchange_val_acq (futex, 2, 1);
|
||||||
if (oldval != 0)
|
if (oldval != 0)
|
||||||
lll_futex_timed_wait (futex, 2, &rt);
|
lll_futex_timed_wait (futex, 2, &rt,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
}
|
}
|
||||||
while (atomic_compare_and_exchange_bool_acq (futex, 2, 0) != 0);
|
while (atomic_compare_and_exchange_bool_acq (futex, 2, 0) != 0);
|
||||||
|
|
||||||
@ -108,8 +112,9 @@ __lll_timedwait_tid (int *tidp, const struct timespec *abstime)
|
|||||||
if (rt.tv_sec < 0)
|
if (rt.tv_sec < 0)
|
||||||
return ETIMEDOUT;
|
return ETIMEDOUT;
|
||||||
|
|
||||||
/* Wait until thread terminates. */
|
/* Wait until thread terminates. The kernel so far does not use
|
||||||
if (lll_futex_timed_wait (tidp, tid, &rt) == -ETIMEDOUT)
|
the private futex operations for this. */
|
||||||
|
if (lll_futex_timed_wait (tidp, tid, &rt, LLL_SHARED) == -ETIMEDOUT)
|
||||||
return ETIMEDOUT;
|
return ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,7 +44,9 @@ __lll_robust_lock_wait (int *futex)
|
|||||||
&& atomic_compare_and_exchange_bool_acq (futex, newval, oldval))
|
&& atomic_compare_and_exchange_bool_acq (futex, newval, oldval))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
lll_futex_wait (futex, newval);
|
lll_futex_wait (futex, newval,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
|
|
||||||
try:
|
try:
|
||||||
;
|
;
|
||||||
@ -100,7 +102,9 @@ __lll_robust_timedlock_wait (int *futex, const struct timespec *abstime)
|
|||||||
&& atomic_compare_and_exchange_bool_acq (futex, newval, oldval))
|
&& atomic_compare_and_exchange_bool_acq (futex, newval, oldval))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
lll_futex_timed_wait (futex, newval, &rt);
|
lll_futex_timed_wait (futex, newval, &rt,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
|
|
||||||
try:
|
try:
|
||||||
;
|
;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Defintions for lowlevel handling in ld.so.
|
/* Defintions for lowlevel handling in ld.so.
|
||||||
Copyright (C) 2006 Free Software Foundation, Inc.
|
Copyright (C) 2006, 2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -76,7 +76,7 @@ typedef int __rtld_mrlock_t;
|
|||||||
atomic_or (&(lock), __RTLD_MRLOCK_RWAIT); \
|
atomic_or (&(lock), __RTLD_MRLOCK_RWAIT); \
|
||||||
oldval |= __RTLD_MRLOCK_RWAIT; \
|
oldval |= __RTLD_MRLOCK_RWAIT; \
|
||||||
} \
|
} \
|
||||||
lll_futex_wait (lock, oldval); \
|
lll_private_futex_wait (lock, oldval); \
|
||||||
} \
|
} \
|
||||||
out:; \
|
out:; \
|
||||||
} while (0)
|
} while (0)
|
||||||
@ -90,7 +90,7 @@ typedef int __rtld_mrlock_t;
|
|||||||
== (__RTLD_MRLOCK_INC | __RTLD_MRLOCK_WWAIT), 0)) \
|
== (__RTLD_MRLOCK_INC | __RTLD_MRLOCK_WWAIT), 0)) \
|
||||||
/* We have to wake all threads since there might be some queued \
|
/* We have to wake all threads since there might be some queued \
|
||||||
readers already. */ \
|
readers already. */ \
|
||||||
lll_futex_wake (&(lock), 0x7fffffff); \
|
lll_private_futex_wake (&(lock), 0x7fffffff); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
@ -119,7 +119,7 @@ typedef int __rtld_mrlock_t;
|
|||||||
} \
|
} \
|
||||||
atomic_or (&(lock), __RTLD_MRLOCK_WWAIT); \
|
atomic_or (&(lock), __RTLD_MRLOCK_WWAIT); \
|
||||||
oldval |= __RTLD_MRLOCK_WWAIT; \
|
oldval |= __RTLD_MRLOCK_WWAIT; \
|
||||||
lll_futex_wait (lock, oldval); \
|
lll_private_futex_wait (lock, oldval); \
|
||||||
} \
|
} \
|
||||||
out:; \
|
out:; \
|
||||||
} while (0)
|
} while (0)
|
||||||
@ -129,7 +129,7 @@ typedef int __rtld_mrlock_t;
|
|||||||
do { \
|
do { \
|
||||||
int oldval = atomic_exchange_and_add (&(lock), -__RTLD_MRLOCK_WRITER); \
|
int oldval = atomic_exchange_and_add (&(lock), -__RTLD_MRLOCK_WRITER); \
|
||||||
if (__builtin_expect ((oldval & __RTLD_MRLOCK_RWAIT) != 0, 0)) \
|
if (__builtin_expect ((oldval & __RTLD_MRLOCK_RWAIT) != 0, 0)) \
|
||||||
lll_futex_wake (&(lock), 0x7fffffff); \
|
lll_private_futex_wake (&(lock), 0x7fffffff); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
@ -142,12 +142,12 @@ typedef int __rtld_mrlock_t;
|
|||||||
int val = word; \
|
int val = word; \
|
||||||
if (val == 0) \
|
if (val == 0) \
|
||||||
break; \
|
break; \
|
||||||
lll_futex_wait (&(word), val); \
|
lll_private_futex_wait (&(word), val); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
#define __rtld_notify(word) \
|
#define __rtld_notify(word) \
|
||||||
lll_futex_wake (&(word), 1)
|
lll_private_futex_wake (&(word), 1)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -35,7 +35,9 @@ __new_sem_post (sem_t *sem)
|
|||||||
atomic_full_barrier ();
|
atomic_full_barrier ();
|
||||||
if (isem->nwaiters > 0)
|
if (isem->nwaiters > 0)
|
||||||
{
|
{
|
||||||
int err = lll_futex_wake (&isem->value, 1);
|
int err = lll_futex_wake (&isem->value, 1,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
if (__builtin_expect (err, 0) < 0)
|
if (__builtin_expect (err, 0) < 0)
|
||||||
{
|
{
|
||||||
__set_errno (-err);
|
__set_errno (-err);
|
||||||
@ -55,7 +57,8 @@ __old_sem_post (sem_t *sem)
|
|||||||
int *futex = (int *) sem;
|
int *futex = (int *) sem;
|
||||||
|
|
||||||
int nr = atomic_increment_val (futex);
|
int nr = atomic_increment_val (futex);
|
||||||
int err = lll_futex_wake (futex, 1);
|
/* We always have to assume it is a shared semaphore. */
|
||||||
|
int err = lll_futex_wake (futex, 1, LLL_SHARED);
|
||||||
if (__builtin_expect (err, 0) < 0)
|
if (__builtin_expect (err, 0) < 0)
|
||||||
{
|
{
|
||||||
__set_errno (-err);
|
__set_errno (-err);
|
||||||
|
@ -84,7 +84,9 @@ sem_timedwait (sem_t *sem, const struct timespec *abstime)
|
|||||||
/* Enable asynchronous cancellation. Required by the standard. */
|
/* Enable asynchronous cancellation. Required by the standard. */
|
||||||
int oldtype = __pthread_enable_asynccancel ();
|
int oldtype = __pthread_enable_asynccancel ();
|
||||||
|
|
||||||
err = lll_futex_timed_wait (&isem->value, 0, &rt);
|
err = lll_futex_timed_wait (&isem->value, 0, &rt,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
|
|
||||||
/* Disable asynchronous cancellation. */
|
/* Disable asynchronous cancellation. */
|
||||||
__pthread_disable_asynccancel (oldtype);
|
__pthread_disable_asynccancel (oldtype);
|
||||||
|
@ -56,7 +56,9 @@ __new_sem_wait (sem_t *sem)
|
|||||||
/* Enable asynchronous cancellation. Required by the standard. */
|
/* Enable asynchronous cancellation. Required by the standard. */
|
||||||
int oldtype = __pthread_enable_asynccancel ();
|
int oldtype = __pthread_enable_asynccancel ();
|
||||||
|
|
||||||
err = lll_futex_wait (&isem->value, 0);
|
err = lll_futex_wait (&isem->value, 0,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
|
|
||||||
/* Disable asynchronous cancellation. */
|
/* Disable asynchronous cancellation. */
|
||||||
__pthread_disable_asynccancel (oldtype);
|
__pthread_disable_asynccancel (oldtype);
|
||||||
@ -100,7 +102,8 @@ __old_sem_wait (sem_t *sem)
|
|||||||
/* Enable asynchronous cancellation. Required by the standard. */
|
/* Enable asynchronous cancellation. Required by the standard. */
|
||||||
int oldtype = __pthread_enable_asynccancel ();
|
int oldtype = __pthread_enable_asynccancel ();
|
||||||
|
|
||||||
err = lll_futex_wait (futex, 0);
|
/* Always assume the semaphore is shared. */
|
||||||
|
err = lll_futex_wait (futex, 0, LLL_SHARED);
|
||||||
|
|
||||||
/* Disable asynchronous cancellation. */
|
/* Disable asynchronous cancellation. */
|
||||||
__pthread_disable_asynccancel (oldtype);
|
__pthread_disable_asynccancel (oldtype);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* 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.
|
||||||
|
|
||||||
@ -30,7 +30,7 @@ clear_once_control (void *arg)
|
|||||||
pthread_once_t *once_control = (pthread_once_t *) arg;
|
pthread_once_t *once_control = (pthread_once_t *) arg;
|
||||||
|
|
||||||
*once_control = 0;
|
*once_control = 0;
|
||||||
lll_futex_wake (once_control, INT_MAX);
|
lll_private_futex_wake (once_control, INT_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -84,7 +84,7 @@ __pthread_once (once_control, init_routine)
|
|||||||
atomic_increment (once_control);
|
atomic_increment (once_control);
|
||||||
|
|
||||||
/* Wake up all other threads. */
|
/* Wake up all other threads. */
|
||||||
lll_futex_wake (once_control, INT_MAX);
|
lll_private_futex_wake (once_control, INT_MAX);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* 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 Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
|
Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
|
||||||
|
|
||||||
@ -52,7 +52,9 @@ pthread_barrier_wait (barrier)
|
|||||||
++ibarrier->b.curr_event;
|
++ibarrier->b.curr_event;
|
||||||
|
|
||||||
/* Wake up everybody. */
|
/* Wake up everybody. */
|
||||||
lll_futex_wake (&ibarrier->b.curr_event, INT_MAX);
|
lll_futex_wake (&ibarrier->b.curr_event, INT_MAX,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
|
|
||||||
/* This is the thread which finished the serialization. */
|
/* This is the thread which finished the serialization. */
|
||||||
result = PTHREAD_BARRIER_SERIAL_THREAD;
|
result = PTHREAD_BARRIER_SERIAL_THREAD;
|
||||||
@ -68,7 +70,9 @@ pthread_barrier_wait (barrier)
|
|||||||
|
|
||||||
/* Wait for the event counter of the barrier to change. */
|
/* Wait for the event counter of the barrier to change. */
|
||||||
do
|
do
|
||||||
lll_futex_wait (&ibarrier->b.curr_event, event);
|
lll_futex_wait (&ibarrier->b.curr_event, event,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
while (event == ibarrier->b.curr_event);
|
while (event == ibarrier->b.curr_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,7 +39,9 @@ __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);
|
int err = lll_futex_wake (futex, nr,
|
||||||
|
// XYZ check mutex flag
|
||||||
|
LLL_SHARED);
|
||||||
if (__builtin_expect (err, 0) < 0)
|
if (__builtin_expect (err, 0) < 0)
|
||||||
{
|
{
|
||||||
__set_errno (-err);
|
__set_errno (-err);
|
||||||
|
@ -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.
|
||||||
|
|
||||||
@ -104,7 +104,7 @@ __unregister_atfork (dso_handle)
|
|||||||
atomic_decrement (&deleted->handler->refcntr);
|
atomic_decrement (&deleted->handler->refcntr);
|
||||||
unsigned int val;
|
unsigned int val;
|
||||||
while ((val = deleted->handler->refcntr) != 0)
|
while ((val = deleted->handler->refcntr) != 0)
|
||||||
lll_futex_wait (&deleted->handler->refcntr, val);
|
lll_private_futex_wait (&deleted->handler->refcntr, val);
|
||||||
|
|
||||||
deleted = deleted->next;
|
deleted = deleted->next;
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,8 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <bits/pthreadtypes.h>
|
#include <bits/pthreadtypes.h>
|
||||||
|
#include <kernel-features.h>
|
||||||
|
#include <tcb-offsets.h>
|
||||||
|
|
||||||
#ifndef LOCK_INSTR
|
#ifndef LOCK_INSTR
|
||||||
# ifdef UP
|
# ifdef UP
|
||||||
@ -42,6 +44,13 @@
|
|||||||
#define FUTEX_PRIVATE_FLAG 128
|
#define FUTEX_PRIVATE_FLAG 128
|
||||||
|
|
||||||
|
|
||||||
|
/* Values for 'private' parameter of locking macros. Yes, the
|
||||||
|
definition seems to be backwards. But it is not. The bit will be
|
||||||
|
reversed before passing to the system call. */
|
||||||
|
#define LLL_PRIVATE 0
|
||||||
|
#define LLL_SHARED FUTEX_PRIVATE_FLAG
|
||||||
|
|
||||||
|
|
||||||
/* Initializer for compatibility lock. */
|
/* Initializer for compatibility lock. */
|
||||||
#define LLL_MUTEX_LOCK_INITIALIZER (0)
|
#define LLL_MUTEX_LOCK_INITIALIZER (0)
|
||||||
#define LLL_MUTEX_LOCK_INITIALIZER_LOCKED (1)
|
#define LLL_MUTEX_LOCK_INITIALIZER_LOCKED (1)
|
||||||
@ -149,21 +158,11 @@ LLL_STUB_UNWIND_INFO_START \
|
|||||||
LLL_STUB_UNWIND_INFO_END
|
LLL_STUB_UNWIND_INFO_END
|
||||||
|
|
||||||
|
|
||||||
#define lll_futex_wait(futex, val) \
|
#define lll_futex_wait(futex, val, private) \
|
||||||
({ \
|
lll_futex_timed_wait(futex, val, NULL, private)
|
||||||
int __status; \
|
|
||||||
register __typeof (val) _val __asm ("edx") = (val); \
|
|
||||||
__asm __volatile ("xorq %%r10, %%r10\n\t" \
|
|
||||||
"syscall" \
|
|
||||||
: "=a" (__status) \
|
|
||||||
: "0" (SYS_futex), "D" (futex), "S" (FUTEX_WAIT), \
|
|
||||||
"d" (_val) \
|
|
||||||
: "memory", "cc", "r10", "r11", "cx"); \
|
|
||||||
__status; \
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
#define lll_futex_timed_wait(futex, val, timeout) \
|
#define lll_futex_timed_wait(futex, val, timeout, private) \
|
||||||
({ \
|
({ \
|
||||||
register const struct timespec *__to __asm ("r10") = timeout; \
|
register const struct timespec *__to __asm ("r10") = timeout; \
|
||||||
int __status; \
|
int __status; \
|
||||||
@ -177,7 +176,7 @@ LLL_STUB_UNWIND_INFO_END
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
#define lll_futex_wake(futex, nr) \
|
#define lll_futex_wake(futex, nr, private) \
|
||||||
do { \
|
do { \
|
||||||
int __ignore; \
|
int __ignore; \
|
||||||
register __typeof (nr) _nr __asm ("edx") = (nr); \
|
register __typeof (nr) _nr __asm ("edx") = (nr); \
|
||||||
@ -189,6 +188,69 @@ LLL_STUB_UNWIND_INFO_END
|
|||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
#define lll_private_futex_wait(futex, val) \
|
||||||
|
lll_private_futex_timed_wait (futex, val, NULL)
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __ASSUME_PRIVATE_FUTEX
|
||||||
|
# define lll_private_futex_timed_wait(futex, val, timeout) \
|
||||||
|
({ \
|
||||||
|
register const struct timespec *__to __asm ("r10") = timeout; \
|
||||||
|
int __status; \
|
||||||
|
register __typeof (val) _val __asm ("edx") = (val); \
|
||||||
|
__asm __volatile ("syscall" \
|
||||||
|
: "=a" (__status) \
|
||||||
|
: "0" (SYS_futex), "D" (futex), \
|
||||||
|
"S" (FUTEX_WAIT | FUTEX_PRIVATE_FLAG), \
|
||||||
|
"d" (_val), "r" (__to) \
|
||||||
|
: "memory", "cc", "r11", "cx"); \
|
||||||
|
__status; \
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
# define lll_private_futex_wake(futex, nr) \
|
||||||
|
do { \
|
||||||
|
int __ignore; \
|
||||||
|
register __typeof (nr) _nr __asm ("edx") = (nr); \
|
||||||
|
__asm __volatile ("syscall" \
|
||||||
|
: "=a" (__ignore) \
|
||||||
|
: "0" (SYS_futex), "D" (futex), \
|
||||||
|
"S" (FUTEX_WAKE | FUTEX_PRIVATE_FLAG), \
|
||||||
|
"d" (_nr) \
|
||||||
|
: "memory", "cc", "r10", "r11", "cx"); \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
# define lll_private_futex_timed_wait(futex, val, timeout) \
|
||||||
|
({ \
|
||||||
|
register const struct timespec *__to __asm ("r10") = timeout; \
|
||||||
|
int __status; \
|
||||||
|
int __ignore; \
|
||||||
|
register __typeof (val) _val __asm ("edx") = (val); \
|
||||||
|
__asm __volatile ("movl %%fs:%P3, %%esi\n\t" \
|
||||||
|
"syscall" \
|
||||||
|
: "=a" (__status), "=S" (__ignore) \
|
||||||
|
: "0" (SYS_futex), "i" (PRIVATE_FUTEX), "D" (futex), \
|
||||||
|
"d" (_val), "r" (__to) \
|
||||||
|
: "memory", "cc", "r11", "cx"); \
|
||||||
|
__status; \
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
# define lll_private_futex_wake(futex, nr) \
|
||||||
|
do { \
|
||||||
|
int __ignore; \
|
||||||
|
int __ignore2; \
|
||||||
|
register __typeof (nr) _nr __asm ("edx") = (nr); \
|
||||||
|
__asm __volatile ("orl %%fs:%P3, %%esi\n\t" \
|
||||||
|
"syscall" \
|
||||||
|
: "=a" (__ignore), "=S" (__ignore2) \
|
||||||
|
: "0" (SYS_futex), "i" (PRIVATE_FUTEX), "D" (futex), \
|
||||||
|
"1" (FUTEX_WAKE), "d" (_nr) \
|
||||||
|
: "memory", "cc", "r10", "r11", "cx"); \
|
||||||
|
} while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Does not preserve %eax and %ecx. */
|
/* Does not preserve %eax and %ecx. */
|
||||||
extern int __lll_mutex_lock_wait (int *__futex, int __val) attribute_hidden;
|
extern int __lll_mutex_lock_wait (int *__futex, int __val) attribute_hidden;
|
||||||
/* Does not preserver %eax, %ecx, and %edx. */
|
/* Does not preserver %eax, %ecx, and %edx. */
|
||||||
|
@ -355,7 +355,7 @@ typedef struct
|
|||||||
: "i" (offsetof (struct pthread, header.gscope_flag)), \
|
: "i" (offsetof (struct pthread, header.gscope_flag)), \
|
||||||
"0" (THREAD_GSCOPE_FLAG_UNUSED)); \
|
"0" (THREAD_GSCOPE_FLAG_UNUSED)); \
|
||||||
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
|
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
|
||||||
lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
|
lll_private_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
#define THREAD_GSCOPE_SET_FLAG() \
|
#define THREAD_GSCOPE_SET_FLAG() \
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
|
/* Copyright (C) 1995, 1996, 1997, 2000, 2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -19,7 +19,7 @@
|
|||||||
#include "gmp.h"
|
#include "gmp.h"
|
||||||
#include "gmp-impl.h"
|
#include "gmp-impl.h"
|
||||||
#include "longlong.h"
|
#include "longlong.h"
|
||||||
#include "ieee754.h"
|
#include <ieee754.h>
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ __mpn_extract_long_double (mp_ptr res_ptr, mp_size_t size,
|
|||||||
#elif BITS_PER_MP_LIMB == 64
|
#elif BITS_PER_MP_LIMB == 64
|
||||||
/* Hopefully the compiler will combine the two bitfield extracts
|
/* Hopefully the compiler will combine the two bitfield extracts
|
||||||
and this composition into just the original quadword extract. */
|
and this composition into just the original quadword extract. */
|
||||||
res_ptr[0] = ((unsigned long int) u.ieee.mantissa0 << 32) | u.ieee.mantissa1;
|
res_ptr[0] = ((mp_limb_t) u.ieee.mantissa0 << 32) | u.ieee.mantissa1;
|
||||||
#define N 1
|
#define N 1
|
||||||
#else
|
#else
|
||||||
#error "mp_limb size " BITS_PER_MP_LIMB "not accounted for"
|
#error "mp_limb size " BITS_PER_MP_LIMB "not accounted for"
|
||||||
@ -109,6 +109,13 @@ __mpn_extract_long_double (mp_ptr res_ptr, mp_size_t size,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (u.ieee.exponent < 0x7fff
|
||||||
|
#if N == 2
|
||||||
|
&& res_ptr[0] == 0
|
||||||
|
#endif
|
||||||
|
&& res_ptr[N - 1] == 0)
|
||||||
|
/* Pseudo zero. */
|
||||||
|
*expt = 0;
|
||||||
|
|
||||||
return N;
|
return N;
|
||||||
}
|
}
|
||||||
|
1
sysdeps/ia64/ldbl2mpn.c
Normal file
1
sysdeps/ia64/ldbl2mpn.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "../i386/ldbl2mpn.c"
|
1
sysdeps/x86_64/ldbl2mpn.c
Normal file
1
sysdeps/x86_64/ldbl2mpn.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "../i386/ldbl2mpn.c"
|
Reference in New Issue
Block a user