summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/head/pthread.h40
-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
4 files changed, 62 insertions, 31 deletions
diff --git a/usr/src/head/pthread.h b/usr/src/head/pthread.h
index fe817cc0ce..6f778d02a0 100644
--- a/usr/src/head/pthread.h
+++ b/usr/src/head/pthread.h
@@ -88,14 +88,17 @@ extern "C" {
#define PTHREAD_PRIO_PROTECT 0x20
/*
- * Mutex robustness attribute values. The robustness attribute is a
- * Solaris specific extension to support robust mutexes. Note the _NP suffix
- * to indicate these are not part of the current POSIX spec (POSIX 1003.1 1996),
- * but are platform specific non-portable extensions. Keep these in synch
- * with sys/synch.h lock types.
+ * Mutex robust attribute values.
+ * Keep these in synch with sys/synch.h lock types.
*/
-#define PTHREAD_MUTEX_STALL_NP 0x0
-#define PTHREAD_MUTEX_ROBUST_NP 0x40
+#define PTHREAD_MUTEX_STALLED 0x0
+#define PTHREAD_MUTEX_ROBUST 0x40
+/*
+ * Historical solaris-specific names,
+ * from before pthread_mutexattr_getrobust() became standardized
+ */
+#define PTHREAD_MUTEX_STALL_NP PTHREAD_MUTEX_STALLED
+#define PTHREAD_MUTEX_ROBUST_NP PTHREAD_MUTEX_ROBUST
/*
* macros - default initializers defined as in synch.h
@@ -257,12 +260,12 @@ extern int pthread_mutexattr_getprotocol(
extern int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *, int);
extern int pthread_mutexattr_getprioceiling(
const pthread_mutexattr_t *_RESTRICT_KYWD, int *_RESTRICT_KYWD);
-extern int pthread_mutexattr_setrobust_np(pthread_mutexattr_t *, int);
-extern int pthread_mutexattr_getrobust_np(
+extern int pthread_mutexattr_setrobust(pthread_mutexattr_t *, int);
+extern int pthread_mutexattr_getrobust(
const pthread_mutexattr_t *_RESTRICT_KYWD, int *_RESTRICT_KYWD);
extern int pthread_mutex_init(pthread_mutex_t *_RESTRICT_KYWD,
const pthread_mutexattr_t *_RESTRICT_KYWD);
-extern int pthread_mutex_consistent_np(pthread_mutex_t *);
+extern int pthread_mutex_consistent(pthread_mutex_t *);
extern int pthread_mutex_destroy(pthread_mutex_t *);
extern int pthread_mutex_lock(pthread_mutex_t *);
extern int pthread_mutex_timedlock(pthread_mutex_t *_RESTRICT_KYWD,
@@ -338,6 +341,12 @@ extern int pthread_barrier_init(pthread_barrier_t *_RESTRICT_KYWD,
extern int pthread_barrier_destroy(pthread_barrier_t *);
extern int pthread_barrier_wait(pthread_barrier_t *);
+/* Historical names -- present only for binary compatibility */
+extern int pthread_mutex_consistent_np(pthread_mutex_t *);
+extern int pthread_mutexattr_setrobust_np(pthread_mutexattr_t *, int);
+extern int pthread_mutexattr_getrobust_np(
+ const pthread_mutexattr_t *_RESTRICT_KYWD, int *_RESTRICT_KYWD);
+
#else /* __STDC__ */
/*
@@ -392,10 +401,10 @@ extern int pthread_mutexattr_setprotocol();
extern int pthread_mutexattr_getprotocol();
extern int pthread_mutexattr_setprioceiling();
extern int pthread_mutexattr_getprioceiling();
-extern int pthread_mutexattr_setrobust_np();
-extern int pthread_mutexattr_getrobust_np();
+extern int pthread_mutexattr_setrobust();
+extern int pthread_mutexattr_getrobust();
extern int pthread_mutex_init();
-extern int pthread_mutex_consistent_np();
+extern int pthread_mutex_consistent();
extern int pthread_mutex_destroy();
extern int pthread_mutex_lock();
extern int pthread_mutex_timedlock();
@@ -447,6 +456,11 @@ extern int pthread_barrier_init();
extern int pthread_barrier_destroy();
extern int pthread_barrier_wait();
+/* Historical names -- present only for binary compatibility */
+extern int pthread_mutex_consistent_np();
+extern int pthread_mutexattr_setrobust_np();
+extern int pthread_mutexattr_getrobust_np();
+
#endif /* __STDC__ */
#endif /* _ASM */
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));
}