svn commit: r214093 - in head/lib: libc/include libthr libthr/thread
David Xu
davidxu at FreeBSD.org
Wed Oct 20 02:34:02 UTC 2010
Author: davidxu
Date: Wed Oct 20 02:34:02 2010
New Revision: 214093
URL: http://svn.freebsd.org/changeset/base/214093
Log:
Revert revision 214007, I realized that MySQL wants to resolve
a silly rwlock deadlock problem, the deadlock is caused by writer
waiters, if a thread has already locked a reader lock, and wants to
acquire another reader lock, it will be blocked by writer waiters,
but we had already fixed it years ago.
Modified:
head/lib/libc/include/namespace.h
head/lib/libc/include/un-namespace.h
head/lib/libthr/pthread.map
head/lib/libthr/thread/thr_private.h
head/lib/libthr/thread/thr_rwlock.c
head/lib/libthr/thread/thr_rwlockattr.c
Modified: head/lib/libc/include/namespace.h
==============================================================================
--- head/lib/libc/include/namespace.h Wed Oct 20 01:22:04 2010 (r214092)
+++ head/lib/libc/include/namespace.h Wed Oct 20 02:34:02 2010 (r214093)
@@ -177,10 +177,8 @@
#define pthread_rwlock_unlock _pthread_rwlock_unlock
#define pthread_rwlock_wrlock _pthread_rwlock_wrlock
#define pthread_rwlockattr_destroy _pthread_rwlockattr_destroy
-#define pthread_rwlockattr_getkind_np _pthread_rwlockattr_getkind_np
#define pthread_rwlockattr_getpshared _pthread_rwlockattr_getpshared
#define pthread_rwlockattr_init _pthread_rwlockattr_init
-#define pthread_rwlockattr_setkind_np _pthread_rwlockattr_setkind_np
#define pthread_rwlockattr_setpshared _pthread_rwlockattr_setpshared
#define pthread_self _pthread_self
#define pthread_set_name_np _pthread_set_name_np
Modified: head/lib/libc/include/un-namespace.h
==============================================================================
--- head/lib/libc/include/un-namespace.h Wed Oct 20 01:22:04 2010 (r214092)
+++ head/lib/libc/include/un-namespace.h Wed Oct 20 02:34:02 2010 (r214093)
@@ -158,10 +158,8 @@
#undef pthread_rwlock_unlock
#undef pthread_rwlock_wrlock
#undef pthread_rwlockattr_destroy
-#undef pthread_rwlockattr_getkind_np
#undef pthread_rwlockattr_getpshared
#undef pthread_rwlockattr_init
-#undef pthread_rwlockattr_setkind_np
#undef pthread_rwlockattr_setpshared
#undef pthread_self
#undef pthread_set_name_np
Modified: head/lib/libthr/pthread.map
==============================================================================
--- head/lib/libthr/pthread.map Wed Oct 20 01:22:04 2010 (r214092)
+++ head/lib/libthr/pthread.map Wed Oct 20 02:34:02 2010 (r214093)
@@ -318,9 +318,7 @@ FBSDprivate_1.0 {
_pthread_rwlock_wrlock;
_pthread_rwlockattr_destroy;
_pthread_rwlockattr_getpshared;
- _pthread_rwlockattr_getkind_np;
_pthread_rwlockattr_init;
- _pthread_rwlockattr_setkind_np;
_pthread_rwlockattr_setpshared;
_pthread_self;
_pthread_set_name_np;
@@ -403,8 +401,6 @@ FBSD_1.1 {
FBSD_1.2 {
openat;
- pthread_rwlockattr_getkind_np;
- pthread_rwlockattr_setkind_np;
setcontext;
swapcontext;
};
Modified: head/lib/libthr/thread/thr_private.h
==============================================================================
--- head/lib/libthr/thread/thr_private.h Wed Oct 20 01:22:04 2010 (r214092)
+++ head/lib/libthr/thread/thr_private.h Wed Oct 20 02:34:02 2010 (r214093)
@@ -285,14 +285,11 @@ struct pthread_prio {
struct pthread_rwlockattr {
int pshared;
- int kind;
};
struct pthread_rwlock {
struct urwlock lock;
struct pthread *owner;
- int recurse;
- int kind;
};
/*
Modified: head/lib/libthr/thread/thr_rwlock.c
==============================================================================
--- head/lib/libthr/thread/thr_rwlock.c Wed Oct 20 01:22:04 2010 (r214092)
+++ head/lib/libthr/thread/thr_rwlock.c Wed Oct 20 02:34:02 2010 (r214093)
@@ -63,19 +63,13 @@ __weak_reference(_pthread_rwlock_timedwr
*/
static int
-rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr)
+rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr __unused)
{
pthread_rwlock_t prwlock;
prwlock = (pthread_rwlock_t)calloc(1, sizeof(struct pthread_rwlock));
if (prwlock == NULL)
return (ENOMEM);
- if (attr != NULL)
- prwlock->kind = (*attr)->kind;
- else
- prwlock->kind = PTHREAD_RWLOCK_DEFAULT_NP;
- if (prwlock->kind == PTHREAD_RWLOCK_PREFER_READER_NP)
- prwlock->lock.rw_flags |= URWLOCK_PREFER_READER;
*rwlock = prwlock;
return (0);
}
@@ -118,7 +112,7 @@ init_static(struct pthread *thread, pthr
}
int
-_pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr)
+_pthread_rwlock_init (pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr)
{
*rwlock = NULL;
return (rwlock_init(rwlock, attr));
@@ -266,14 +260,6 @@ rwlock_wrlock_common (pthread_rwlock_t *
CHECK_AND_INIT_RWLOCK
- if (__predict_false(prwlock->owner == curthread)) {
- if (__predict_false(
- prwlock->kind == PTHREAD_RWLOCK_PREFER_WRITER_NP)) {
- prwlock->recurse++;
- return (0);
- }
- }
-
/*
* POSIX said the validity of the abstimeout parameter need
* not be checked if the lock can be immediately acquired.
@@ -349,13 +335,6 @@ _pthread_rwlock_unlock (pthread_rwlock_t
if (state & URWLOCK_WRITE_OWNER) {
if (__predict_false(prwlock->owner != curthread))
return (EPERM);
- if (__predict_false(
- prwlock->kind == PTHREAD_RWLOCK_PREFER_WRITER_NP)) {
- if (prwlock->recurse > 0) {
- prwlock->recurse--;
- return (0);
- }
- }
prwlock->owner = NULL;
}
Modified: head/lib/libthr/thread/thr_rwlockattr.c
==============================================================================
--- head/lib/libthr/thread/thr_rwlockattr.c Wed Oct 20 01:22:04 2010 (r214092)
+++ head/lib/libthr/thread/thr_rwlockattr.c Wed Oct 20 02:34:02 2010 (r214093)
@@ -36,10 +36,8 @@
__weak_reference(_pthread_rwlockattr_destroy, pthread_rwlockattr_destroy);
__weak_reference(_pthread_rwlockattr_getpshared, pthread_rwlockattr_getpshared);
-__weak_reference(_pthread_rwlockattr_getkind_np, pthread_rwlockattr_getkind_np);
__weak_reference(_pthread_rwlockattr_init, pthread_rwlockattr_init);
__weak_reference(_pthread_rwlockattr_setpshared, pthread_rwlockattr_setpshared);
-__weak_reference(_pthread_rwlockattr_setkind_np, pthread_rwlockattr_setkind_np);
int
_pthread_rwlockattr_destroy(pthread_rwlockattr_t *rwlockattr)
@@ -83,7 +81,6 @@ _pthread_rwlockattr_init(pthread_rwlocka
return(ENOMEM);
prwlockattr->pshared = PTHREAD_PROCESS_PRIVATE;
- prwlockattr->kind = PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP;
*rwlockattr = prwlockattr;
return(0);
@@ -100,22 +97,3 @@ _pthread_rwlockattr_setpshared(pthread_r
return(0);
}
-
-int
-_pthread_rwlockattr_setkind_np(pthread_rwlockattr_t *attr, int kind)
-{
- if (kind != PTHREAD_RWLOCK_PREFER_READER_NP &&
- kind != PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP &&
- kind != PTHREAD_RWLOCK_PREFER_WRITER_NP) {
- return (EINVAL);
- }
- (*attr)->kind = kind;
- return (0);
-}
-
-int
-_pthread_rwlockattr_getkind_np(const pthread_rwlockattr_t *attr, int *kind)
-{
- *kind = (*attr)->kind;
- return (0);
-}
More information about the svn-src-head
mailing list