summaryrefslogtreecommitdiff
path: root/usr/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib')
-rw-r--r--usr/src/lib/libc/port/mapfile-vers9
-rw-r--r--usr/src/lib/libc/port/threads/pthr_mutex.c26
-rw-r--r--usr/src/lib/libc/port/threads/synch.c18
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));
}