|
@@ -275,6 +275,7 @@ libpthread_hidden_def(pthread_cond_broadcast)
|
|
|
|
|
|
int pthread_condattr_init(pthread_condattr_t *attr attribute_unused)
|
|
|
{
|
|
|
+ memset (attr, '\0', sizeof (*attr));
|
|
|
return 0;
|
|
|
}
|
|
|
libpthread_hidden_def(pthread_condattr_init)
|
|
@@ -302,3 +303,50 @@ int pthread_condattr_setpshared (pthread_condattr_t *attr attribute_unused, int
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+int pthread_condattr_getclock (const pthread_condattr_t *attr, clockid_t *clock_id)
|
|
|
+{
|
|
|
+ *clock_id = (((((const struct pthread_condattr *) attr)->value) >> 1)
|
|
|
+ & ((1 << COND_NWAITERS_SHIFT) - 1));
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int pthread_condattr_setclock (pthread_condattr_t *attr, clockid_t clock_id)
|
|
|
+{
|
|
|
+
|
|
|
+ CLOCK_MONOTONIC only if the kernel has the necessary support. */
|
|
|
+ if (clock_id == CLOCK_MONOTONIC)
|
|
|
+ {
|
|
|
+#ifndef __ASSUME_POSIX_TIMERS
|
|
|
+# ifdef __NR_clock_getres
|
|
|
+
|
|
|
+ static int avail;
|
|
|
+
|
|
|
+ if (avail == 0)
|
|
|
+ {
|
|
|
+ struct timespec ts;
|
|
|
+
|
|
|
+ INTERNAL_SYSCALL_DECL (err);
|
|
|
+ int val;
|
|
|
+ val = INTERNAL_SYSCALL (clock_getres, err, 2, CLOCK_MONOTONIC, &ts);
|
|
|
+ avail = INTERNAL_SYSCALL_ERROR_P (val, err) ? -1 : 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (avail < 0)
|
|
|
+# endif
|
|
|
+
|
|
|
+ return EINVAL;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ else if (clock_id != CLOCK_REALTIME)
|
|
|
+
|
|
|
+ in the pthread_cond_t structure needs to be adjusted. */
|
|
|
+ return EINVAL;
|
|
|
+
|
|
|
+ int *valuep = &((struct pthread_condattr *) attr)->value;
|
|
|
+
|
|
|
+ *valuep = ((*valuep & ~(((1 << COND_NWAITERS_SHIFT) - 1) << 1))
|
|
|
+ | (clock_id << 1));
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|