]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - nptl/pthread_condattr_setclock.c
Add per-thread cache to malloc
[thirdparty/glibc.git] / nptl / pthread_condattr_setclock.c
index a3030e227a660c133500f31487b60eca30819a89..cd941710024ff096488cd71429da365f91242edb 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003, 2004, 2007, 2008 Free Software Foundation, Inc.
+/* Copyright (C) 2003-2017 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
 
 
 #include <assert.h>
 #include <errno.h>
-#include <stdbool.h>
+#include <futex-internal.h>
 #include <time.h>
 #include <sysdep.h>
 #include "pthreadP.h"
-#include <kernel-features.h>
 
 
 int
-pthread_condattr_setclock (attr, clock_id)
-     pthread_condattr_t *attr;
-     clockid_t clock_id;
+pthread_condattr_setclock (pthread_condattr_t *attr, clockid_t clock_id)
 {
-  /* Only a few clocks are allowed.  CLOCK_REALTIME is always allowed.
-     CLOCK_MONOTONIC only if the kernel has the necessary support.  */
-  if (clock_id == CLOCK_MONOTONIC)
-    {
-#ifndef __ASSUME_POSIX_TIMERS
-# ifdef __NR_clock_getres
-      /* Check whether the clock is available.  */
-      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
-       /* Not available.  */
-       return EINVAL;
-#endif
-    }
-  else if (clock_id != CLOCK_REALTIME)
+  /* Only a few clocks are allowed.  */
+  if (clock_id != CLOCK_MONOTONIC && clock_id != CLOCK_REALTIME)
     /* If more clocks are allowed some day the storing of the clock ID
        in the pthread_cond_t structure needs to be adjusted.  */
     return EINVAL;
 
+  /* If we do not support waiting using CLOCK_MONOTONIC, return an error.  */
+  if (clock_id == CLOCK_MONOTONIC
+      && !futex_supports_exact_relative_timeouts())
+    return ENOTSUP;
+
   /* Make sure the value fits in the bits we reserved.  */
-  assert (clock_id < (1 << COND_NWAITERS_SHIFT));
+  assert (clock_id < (1 << COND_CLOCK_BITS));
 
   int *valuep = &((struct pthread_condattr *) attr)->value;
 
-  *valuep = ((*valuep & ~(((1 << COND_NWAITERS_SHIFT) - 1) << 1))
+  *valuep = ((*valuep & ~(((1 << COND_CLOCK_BITS) - 1) << 1))
             | (clock_id << 1));
 
   return 0;