diff options
Diffstat (limited to 'usr/src/lib')
-rw-r--r-- | usr/src/lib/libc/port/mapfile-vers | 9 | ||||
-rw-r--r-- | usr/src/lib/libc/port/threads/pthr_mutex.c | 26 | ||||
-rw-r--r-- | usr/src/lib/libc/port/threads/synch.c | 18 |
3 files changed, 35 insertions, 18 deletions
diff --git a/usr/src/lib/libc/port/mapfile-vers b/usr/src/lib/libc/port/mapfile-vers index b503857ca8..587ba52bf4 100644 --- a/usr/src/lib/libc/port/mapfile-vers +++ b/usr/src/lib/libc/port/mapfile-vers @@ -107,6 +107,9 @@ SUNW_1.23 { # SunOS 5.11 (Solaris 11) posix_spawnattr_getsigignore_np; posix_spawnattr_setsigignore_np; pthread_key_create_once_np; + pthread_mutexattr_getrobust; + pthread_mutexattr_setrobust; + pthread_mutex_consistent; sched_getparam; sched_get_priority_max; sched_get_priority_min; @@ -409,9 +412,9 @@ SUNW_1.22 { # SunOS 5.10 (Solaris 10) pthread_barrier_wait; pthread_condattr_getclock; pthread_condattr_setclock; - pthread_mutexattr_getrobust_np; - pthread_mutexattr_setrobust_np; - pthread_mutex_consistent_np; + pthread_mutexattr_getrobust_np = NODYNSORT; + pthread_mutexattr_setrobust_np = NODYNSORT; + pthread_mutex_consistent_np = NODYNSORT; pthread_mutex_reltimedlock_np; pthread_mutex_timedlock; pthread_rwlock_reltimedrdlock_np; diff --git a/usr/src/lib/libc/port/threads/pthr_mutex.c b/usr/src/lib/libc/port/threads/pthr_mutex.c index 2451e5e0e8..f8134ef1a4 100644 --- a/usr/src/lib/libc/port/threads/pthr_mutex.c +++ b/usr/src/lib/libc/port/threads/pthr_mutex.c @@ -24,8 +24,6 @@ * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include "lint.h" #include "thr_uberdata.h" #include <pthread.h> @@ -45,7 +43,7 @@ pthread_mutexattr_init(pthread_mutexattr_t *attr) ap->pshared = DEFAULT_TYPE; ap->type = PTHREAD_MUTEX_DEFAULT; ap->protocol = PTHREAD_PRIO_NONE; - ap->robustness = PTHREAD_MUTEX_STALL_NP; + ap->robustness = PTHREAD_MUTEX_STALLED; attr->__pthread_mutexattrp = ap; return (0); } @@ -167,27 +165,29 @@ pthread_mutexattr_getprotocol(const pthread_mutexattr_t *attr, int *protocol) } /* - * pthread_mutexattr_setrobust_np: sets the robustness attribute - * to PTHREAD_MUTEX_ROBUST_NP or PTHREAD_MUTEX_STALL_NP. + * pthread_mutexattr_setrobust: set the mutex robust attribute. + * pthread_mutexattr_setrobust_np: the historical name. */ +#pragma weak pthread_mutexattr_setrobust_np = pthread_mutexattr_setrobust int -pthread_mutexattr_setrobust_np(pthread_mutexattr_t *attr, int robust) +pthread_mutexattr_setrobust(pthread_mutexattr_t *attr, int robust) { mattr_t *ap; if (attr == NULL || (ap = attr->__pthread_mutexattrp) == NULL || - (robust != PTHREAD_MUTEX_ROBUST_NP && - robust != PTHREAD_MUTEX_STALL_NP)) + (robust != PTHREAD_MUTEX_ROBUST && robust != PTHREAD_MUTEX_STALLED)) return (EINVAL); ap->robustness = robust; return (0); } /* - * pthread_mutexattr_getrobust_np: gets the robustness attribute. + * pthread_mutexattr_getrobust: get the mutex robust attribute. + * pthread_mutexattr_getrobust_np: the historical name. */ +#pragma weak pthread_mutexattr_getrobust_np = pthread_mutexattr_getrobust int -pthread_mutexattr_getrobust_np(const pthread_mutexattr_t *attr, int *robust) +pthread_mutexattr_getrobust(const pthread_mutexattr_t *attr, int *robust) { mattr_t *ap; @@ -223,7 +223,7 @@ pthread_mutex_init(pthread_mutex_t *_RESTRICT_KYWD mutex, prioceiling = ap->prioceiling; } else { type = DEFAULT_TYPE | PTHREAD_MUTEX_DEFAULT | - PTHREAD_PRIO_NONE | PTHREAD_MUTEX_STALL_NP; + PTHREAD_PRIO_NONE | PTHREAD_MUTEX_STALLED; } return (mutex_init((mutex_t *)mutex, type, &prioceiling)); @@ -248,11 +248,11 @@ pthread_mutex_setprioceiling(pthread_mutex_t *mutex, int ceil, int *oceil) ceil < pccp->pcc_primin || ceil > pccp->pcc_primax) return (EINVAL); error = mutex_lock_internal(mp, NULL, MUTEX_LOCK | MUTEX_NOCEIL); - if (error == 0) { + if (error == 0 || error == EOWNERDEAD || error == ELOCKUNMAPPED) { if (oceil) *oceil = mp->mutex_ceiling; mp->mutex_ceiling = ceil; - error = mutex_unlock_internal(mp, 0); + error = mutex_unlock_internal(mp, 1); } return (error); } diff --git a/usr/src/lib/libc/port/threads/synch.c b/usr/src/lib/libc/port/threads/synch.c index c8ac97a202..f3eab82f07 100644 --- a/usr/src/lib/libc/port/threads/synch.c +++ b/usr/src/lib/libc/port/threads/synch.c @@ -2404,7 +2404,8 @@ mutex_unlock_internal(mutex_t *mp, int retain_robust_flags) int release_all; lwpid_t lwpid; - if ((mtype & LOCK_ERRORCHECK) && !mutex_held(mp)) + if ((mtype & (LOCK_ERRORCHECK | LOCK_ROBUST)) && + !mutex_held(mp)) return (EPERM); if (self->ul_error_detection && !mutex_held(mp)) @@ -2421,7 +2422,7 @@ mutex_unlock_internal(mutex_t *mp, int retain_robust_flags) if (!retain_robust_flags && !(mtype & LOCK_PRIO_INHERIT) && (mp->mutex_flag & (LOCK_OWNERDEAD | LOCK_UNMAPPED))) { - ASSERT(mp->mutex_type & LOCK_ROBUST); + ASSERT(mtype & LOCK_ROBUST); mp->mutex_flag &= ~(LOCK_OWNERDEAD | LOCK_UNMAPPED); mp->mutex_flag |= LOCK_NOTRECOVERABLE; } @@ -2797,6 +2798,7 @@ mutex_destroy(mutex_t *mp) } #pragma weak pthread_mutex_consistent_np = mutex_consistent +#pragma weak pthread_mutex_consistent = mutex_consistent int mutex_consistent(mutex_t *mp) { @@ -3464,6 +3466,10 @@ __cond_wait(cond_t *cvp, mutex_t *mp) uberdata_t *udp = self->ul_uberdata; uberflags_t *gflags; + if ((mp->mutex_type & (LOCK_ERRORCHECK | LOCK_ROBUST)) && + !mutex_held(mp)) + return (EPERM); + /* * Optimize the common case of USYNC_THREAD plus * no error detection, no lock statistics, and no event tracing. @@ -3518,6 +3524,10 @@ __cond_timedwait(cond_t *cvp, mutex_t *mp, const timespec_t *abstime) timespec_t reltime; int error; + if ((mp->mutex_type & (LOCK_ERRORCHECK | LOCK_ROBUST)) && + !mutex_held(mp)) + return (EPERM); + if (clock_id != CLOCK_REALTIME && clock_id != CLOCK_HIGHRES) clock_id = CLOCK_REALTIME; abstime_to_reltime(clock_id, abstime, &reltime); @@ -3576,6 +3586,10 @@ __cond_reltimedwait(cond_t *cvp, mutex_t *mp, const timespec_t *reltime) { timespec_t tslocal = *reltime; + if ((mp->mutex_type & (LOCK_ERRORCHECK | LOCK_ROBUST)) && + !mutex_held(mp)) + return (EPERM); + return (cond_wait_common(cvp, mp, &tslocal)); } |