diff options
author | davidxu <davidxu@FreeBSD.org> | 2006-09-02 02:41:33 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2006-09-02 02:41:33 +0000 |
commit | f41d0bcd975ac6d528d80a76bf336343c34a830c (patch) | |
tree | 1e35c5959e14f1da4105b51b76aeee98043ec3b0 /sys/kern/kern_umtx.c | |
parent | 587bff4653dfd2311fe06e95a1880ad4b67111b7 (diff) | |
download | FreeBSD-src-f41d0bcd975ac6d528d80a76bf336343c34a830c.zip FreeBSD-src-f41d0bcd975ac6d528d80a76bf336343c34a830c.tar.gz |
Make sure we get new m_owner value if we can not unlock it in
uncontested case. Reorder statements in do_unlock_umutex.
Diffstat (limited to 'sys/kern/kern_umtx.c')
-rw-r--r-- | sys/kern/kern_umtx.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c index d2c6334..2c41fe0 100644 --- a/sys/kern/kern_umtx.c +++ b/sys/kern/kern_umtx.c @@ -681,6 +681,7 @@ do_unlock(struct thread *td, struct umtx *umtx, uintptr_t id) return (EFAULT); if (old == owner) return (0); + owner = old; } /* We should only ever be in here for contested locks */ @@ -965,6 +966,7 @@ do_unlock_normal(struct thread *td, struct umutex *m, uint32_t flags) return (EFAULT); if (old == owner) return (0); + owner = old; } /* We should only ever be in here for contested locks */ @@ -1595,6 +1597,7 @@ do_unlock_pi(struct thread *td, struct umutex *m, uint32_t flags) return (EFAULT); if (old == owner) return (0); + owner = old; } /* We should only ever be in here for contested locks */ @@ -2005,20 +2008,21 @@ static int do_unlock_umutex(struct thread *td, struct umutex *m) { uint32_t flags; - int ret; flags = fuword32(&m->m_flags); if (flags == -1) return (EFAULT); - if ((flags & UMUTEX_PRIO_INHERIT) != 0) - ret = do_unlock_pi(td, m, flags); - else if ((flags & UMUTEX_PRIO_PROTECT) != 0) - ret = do_unlock_pp(td, m, flags); - else - ret = do_unlock_normal(td, m, flags); + switch(flags & (UMUTEX_PRIO_INHERIT | UMUTEX_PRIO_PROTECT)) { + case 0: + return (do_unlock_normal(td, m, flags)); + case UMUTEX_PRIO_INHERIT: + return (do_unlock_pi(td, m, flags)); + case UMUTEX_PRIO_PROTECT: + return (do_unlock_pp(td, m, flags)); + } - return (ret); + return (EINVAL); } int |