Code drop from //branches/cupcake/...@124589
diff --git a/libc/bionic/pthread.c b/libc/bionic/pthread.c
index 67fc519..2fd740e 100644
--- a/libc/bionic/pthread.c
+++ b/libc/bionic/pthread.c
@@ -767,6 +767,25 @@
     return EINVAL;
 }
 
+/* process-shared mutexes are not supported at the moment */
+
+int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int  pshared)
+{
+    if (!attr)
+        return EINVAL;
+
+    return (pshared == PTHREAD_PROCESS_PRIVATE) ? 0 : ENOTSUP;
+}
+
+int pthread_mutexattr_getpshared(pthread_mutexattr_t *attr, int *pshared)
+{
+    if (!attr)
+        return EINVAL;
+
+    *pshared = PTHREAD_PROCESS_PRIVATE;
+    return 0;
+}
+
 int pthread_mutex_init(pthread_mutex_t *mutex,
                        const pthread_mutexattr_t *attr)
 {
@@ -1120,17 +1139,31 @@
     return pthread_cond_timedwait(cond, mutex, NULL);
 }
 
-int pthread_cond_timedwait(pthread_cond_t *cond,
-                           pthread_mutex_t * mutex,
-                           const struct timespec *abstime)
+int __pthread_cond_timedwait_relative(pthread_cond_t *cond,
+                                      pthread_mutex_t * mutex,
+                                      const struct timespec *reltime)
 {
-    int oldvalue;
+    int  status;
+    int  oldvalue = cond->value;
+
+    pthread_mutex_unlock(mutex);
+    status = __futex_wait(&cond->value, oldvalue, reltime);
+    pthread_mutex_lock(mutex);
+
+    if (status == (-ETIMEDOUT)) return ETIMEDOUT;
+    return 0;
+}
+
+int __pthread_cond_timedwait(pthread_cond_t *cond,
+                             pthread_mutex_t * mutex,
+                             const struct timespec *abstime,
+                             clockid_t clock)
+{
     struct timespec ts;
     struct timespec * tsp;
-    int status;
 
     if (abstime != NULL) {
-        clock_gettime(CLOCK_REALTIME, &ts);
+        clock_gettime(clock, &ts);
         ts.tv_sec = abstime->tv_sec - ts.tv_sec;
         ts.tv_nsec = abstime->tv_nsec - ts.tv_nsec;
         if (ts.tv_nsec < 0) {
@@ -1145,15 +1178,14 @@
         tsp = NULL;
     }
 
-    oldvalue = cond->value;
+    return __pthread_cond_timedwait_relative(cond, mutex, tsp);
+}
 
-    pthread_mutex_unlock(mutex);
-    status = __futex_wait(&cond->value, oldvalue, tsp);
-    pthread_mutex_lock(mutex);
-
-    if(status == (-ETIMEDOUT)) return ETIMEDOUT;
-
-    return 0;
+int pthread_cond_timedwait(pthread_cond_t *cond,
+                           pthread_mutex_t * mutex,
+                           const struct timespec *abstime)
+{
+    return __pthread_cond_timedwait(cond, mutex, abstime, CLOCK_REALTIME);
 }
 
 
@@ -1161,36 +1193,7 @@
                                      pthread_mutex_t * mutex,
                                      const struct timespec *abstime)
 {
-    int oldvalue;
-    struct timespec ts;
-    struct timespec * tsp;
-    int status;
-
-    if (abstime != NULL) {
-        clock_gettime(CLOCK_MONOTONIC, &ts);
-        ts.tv_sec = abstime->tv_sec - ts.tv_sec;
-        ts.tv_nsec = abstime->tv_nsec - ts.tv_nsec;
-        if (ts.tv_nsec < 0) {
-            ts.tv_sec--;
-            ts.tv_nsec += 1000000000;
-        }
-        if((ts.tv_nsec < 0) || (ts.tv_sec < 0)) {
-            return ETIMEDOUT;
-        }
-        tsp = &ts;
-    } else {
-        tsp = NULL;
-    }
-
-    oldvalue = cond->value;
-
-    pthread_mutex_unlock(mutex);
-    status = __futex_wait(&cond->value, oldvalue, tsp);
-    pthread_mutex_lock(mutex);
-
-    if(status == (-ETIMEDOUT)) return ETIMEDOUT;
-
-    return 0;
+    return __pthread_cond_timedwait(cond, mutex, abstime, CLOCK_MONOTONIC);
 }
 
 int pthread_cond_timeout_np(pthread_cond_t *cond,