mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-28 00:21:52 +03:00
[BZ #6955]
2008-11-01 Ulrich Drepper <drepper@redhat.com> [BZ #6955] * pthread_mutex_lock.c: Add support for private PI mutexes. * pthread_mutex_timedlock.c: Likewise. * pthread_mutex_trylock.c: Likewise. * pthread_mutex_unlock.c: Likewise. Patch mostly by Ben Jackson <ben@ben.com>.
This commit is contained in:
@ -1,3 +1,12 @@
|
|||||||
|
2008-11-01 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
[BZ #6955]
|
||||||
|
* pthread_mutex_lock.c: Add support for private PI mutexes.
|
||||||
|
* pthread_mutex_timedlock.c: Likewise.
|
||||||
|
* pthread_mutex_trylock.c: Likewise.
|
||||||
|
* pthread_mutex_unlock.c: Likewise.
|
||||||
|
Patch mostly by Ben Jackson <ben@ben.com>.
|
||||||
|
|
||||||
2008-10-31 Ulrich Drepper <drepper@redhat.com>
|
2008-10-31 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
[BZ #6843]
|
[BZ #6843]
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc.
|
/* Copyright (C) 2002-2007, 2008 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.
|
||||||
|
|
||||||
@ -269,9 +269,13 @@ __pthread_mutex_lock (mutex)
|
|||||||
{
|
{
|
||||||
/* The mutex is locked. The kernel will now take care of
|
/* The mutex is locked. The kernel will now take care of
|
||||||
everything. */
|
everything. */
|
||||||
|
int private = (robust
|
||||||
|
? PTHREAD_ROBUST_MUTEX_PSHARED (mutex)
|
||||||
|
: PTHREAD_MUTEX_PSHARED (mutex));
|
||||||
INTERNAL_SYSCALL_DECL (__err);
|
INTERNAL_SYSCALL_DECL (__err);
|
||||||
int e = INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock,
|
int e = INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock,
|
||||||
FUTEX_LOCK_PI, 1, 0);
|
__lll_private_flag (FUTEX_LOCK_PI,
|
||||||
|
private), 1, 0);
|
||||||
|
|
||||||
if (INTERNAL_SYSCALL_ERROR_P (e, __err)
|
if (INTERNAL_SYSCALL_ERROR_P (e, __err)
|
||||||
&& (INTERNAL_SYSCALL_ERRNO (e, __err) == ESRCH
|
&& (INTERNAL_SYSCALL_ERRNO (e, __err) == ESRCH
|
||||||
@ -327,7 +331,10 @@ __pthread_mutex_lock (mutex)
|
|||||||
|
|
||||||
INTERNAL_SYSCALL_DECL (__err);
|
INTERNAL_SYSCALL_DECL (__err);
|
||||||
INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock,
|
INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock,
|
||||||
FUTEX_UNLOCK_PI, 0, 0);
|
__lll_private_flag (FUTEX_UNLOCK_PI,
|
||||||
|
PTHREAD_ROBUST_MUTEX_PSHARED (mutex)
|
||||||
|
),
|
||||||
|
0, 0);
|
||||||
|
|
||||||
THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL);
|
THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL);
|
||||||
return ENOTRECOVERABLE;
|
return ENOTRECOVERABLE;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc.
|
/* Copyright (C) 2002-2007, 2008 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.
|
||||||
|
|
||||||
@ -254,10 +254,15 @@ pthread_mutex_timedlock (mutex, abstime)
|
|||||||
/* The mutex is locked. The kernel will now take care of
|
/* The mutex is locked. The kernel will now take care of
|
||||||
everything. The timeout value must be a relative value.
|
everything. The timeout value must be a relative value.
|
||||||
Convert it. */
|
Convert it. */
|
||||||
|
int private = (robust
|
||||||
|
? PTHREAD_ROBUST_MUTEX_PSHARED (mutex)
|
||||||
|
: PTHREAD_MUTEX_PSHARED (mutex));
|
||||||
INTERNAL_SYSCALL_DECL (__err);
|
INTERNAL_SYSCALL_DECL (__err);
|
||||||
|
|
||||||
int e = INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock,
|
int e = INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock,
|
||||||
FUTEX_LOCK_PI, 1, abstime);
|
__lll_private_flag (FUTEX_LOCK_PI,
|
||||||
|
private), 1,
|
||||||
|
abstime);
|
||||||
if (INTERNAL_SYSCALL_ERROR_P (e, __err))
|
if (INTERNAL_SYSCALL_ERROR_P (e, __err))
|
||||||
{
|
{
|
||||||
if (INTERNAL_SYSCALL_ERRNO (e, __err) == ETIMEDOUT)
|
if (INTERNAL_SYSCALL_ERRNO (e, __err) == ETIMEDOUT)
|
||||||
@ -331,7 +336,9 @@ pthread_mutex_timedlock (mutex, abstime)
|
|||||||
|
|
||||||
INTERNAL_SYSCALL_DECL (__err);
|
INTERNAL_SYSCALL_DECL (__err);
|
||||||
INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock,
|
INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock,
|
||||||
FUTEX_UNLOCK_PI, 0, 0);
|
__lll_private_flag (FUTEX_UNLOCK_PI,
|
||||||
|
PTHREAD_ROBUST_MUTEX_PSHARED (mutex)),
|
||||||
|
0, 0);
|
||||||
|
|
||||||
THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL);
|
THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL);
|
||||||
return ENOTRECOVERABLE;
|
return ENOTRECOVERABLE;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
|
/* Copyright (C) 2002, 2003, 2005-2007, 2008 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.
|
||||||
|
|
||||||
@ -231,9 +231,13 @@ __pthread_mutex_trylock (mutex)
|
|||||||
|
|
||||||
/* The mutex owner died. The kernel will now take care of
|
/* The mutex owner died. The kernel will now take care of
|
||||||
everything. */
|
everything. */
|
||||||
|
int private = (robust
|
||||||
|
? PTHREAD_ROBUST_MUTEX_PSHARED (mutex)
|
||||||
|
: PTHREAD_MUTEX_PSHARED (mutex));
|
||||||
INTERNAL_SYSCALL_DECL (__err);
|
INTERNAL_SYSCALL_DECL (__err);
|
||||||
int e = INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock,
|
int e = INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock,
|
||||||
FUTEX_TRYLOCK_PI, 0, 0);
|
__lll_private_flag (FUTEX_TRYLOCK_PI,
|
||||||
|
private), 0, 0);
|
||||||
|
|
||||||
if (INTERNAL_SYSCALL_ERROR_P (e, __err)
|
if (INTERNAL_SYSCALL_ERROR_P (e, __err)
|
||||||
&& INTERNAL_SYSCALL_ERRNO (e, __err) == EWOULDBLOCK)
|
&& INTERNAL_SYSCALL_ERRNO (e, __err) == EWOULDBLOCK)
|
||||||
@ -274,7 +278,9 @@ __pthread_mutex_trylock (mutex)
|
|||||||
|
|
||||||
INTERNAL_SYSCALL_DECL (__err);
|
INTERNAL_SYSCALL_DECL (__err);
|
||||||
INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock,
|
INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock,
|
||||||
FUTEX_UNLOCK_PI, 0, 0);
|
__lll_private_flag (FUTEX_UNLOCK_PI,
|
||||||
|
PTHREAD_ROBUST_MUTEX_PSHARED (mutex)),
|
||||||
|
0, 0);
|
||||||
|
|
||||||
THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL);
|
THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL);
|
||||||
return ENOTRECOVERABLE;
|
return ENOTRECOVERABLE;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
|
/* Copyright (C) 2002, 2003, 2005-2007, 2008 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.
|
||||||
|
|
||||||
@ -196,9 +196,13 @@ __pthread_mutex_unlock_usercnt (mutex, decr)
|
|||||||
THREAD_GETMEM (THREAD_SELF,
|
THREAD_GETMEM (THREAD_SELF,
|
||||||
tid)))
|
tid)))
|
||||||
{
|
{
|
||||||
|
int robust = mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP;
|
||||||
|
int private = (robust
|
||||||
|
? PTHREAD_ROBUST_MUTEX_PSHARED (mutex)
|
||||||
|
: PTHREAD_MUTEX_PSHARED (mutex));
|
||||||
INTERNAL_SYSCALL_DECL (__err);
|
INTERNAL_SYSCALL_DECL (__err);
|
||||||
INTERNAL_SYSCALL (futex, __err, 2, &mutex->__data.__lock,
|
INTERNAL_SYSCALL (futex, __err, 2, &mutex->__data.__lock,
|
||||||
FUTEX_UNLOCK_PI);
|
__lll_private_flag (FUTEX_UNLOCK_PI, private));
|
||||||
}
|
}
|
||||||
|
|
||||||
THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL);
|
THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL);
|
||||||
|
Reference in New Issue
Block a user