(linenum→info "unix/slp.c:2238")

glibc/2.7/nptl/pthread_condattr_setclock.c

    1: /* Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
    2:    This file is part of the GNU C Library.
    3:    Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
    4: 
    5:    The GNU C Library is free software; you can redistribute it and/or
    6:    modify it under the terms of the GNU Lesser General Public
    7:    License as published by the Free Software Foundation; either
    8:    version 2.1 of the License, or (at your option) any later version.
    9: 
   10:    The GNU C Library is distributed in the hope that it will be useful,
   11:    but WITHOUT ANY WARRANTY; without even the implied warranty of
   12:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   13:    Lesser General Public License for more details.
   14: 
   15:    You should have received a copy of the GNU Lesser General Public
   16:    License along with the GNU C Library; if not, write to the Free
   17:    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   18:    02111-1307 USA.  */
   19: 
   20: #include <assert.h>
   21: #include <errno.h>
   22: #include <stdbool.h>
   23: #include <time.h>
   24: #include <sysdep.h>
   25: #include "pthreadP.h"
   26: #include <kernel-features.h>
   27: 
   28: 
   29: int
   30: pthread_condattr_setclock (attr, clock_id)
   31:      pthread_condattr_t *attr;
   32:      clockid_t clock_id;
   33: {
   34:   /* Only a few clocks are allowed.  CLOCK_REALTIME is always allowed.
   35:      CLOCK_MONOTONIC only if the kernel has the necessary support.  */
   36:   if (clock_id == CLOCK_MONOTONIC)
   37:     {
   38: #ifndef __ASSUME_POSIX_TIMERS
   39: # ifdef __NR_clock_getres
   40:       /* Check whether the clock is available.  */
   41:       static int avail;
   42: 
   43:       if (avail == 0)
   44:         {
   45:           struct timespec ts;
   46: 
   47:           INTERNAL_SYSCALL_DECL (err);
   48:           int val;
   49:           val = INTERNAL_SYSCALL (clock_getres, err, 2, CLOCK_MONOTONIC, &ts);
   50:           avail = INTERNAL_SYSCALL_ERROR_P (val, err) ? -1 : 1;
   51:         }
   52: 
   53:       if (avail < 0)
   54: # endif
   55:         /* Not available.  */
   56:         return EINVAL;
   57: #endif
   58:     }
   59:   else if (clock_id != CLOCK_REALTIME)
   60:     /* If more clocks are allowed some day the storing of the clock ID
   61:        in the pthread_cond_t structure needs to be adjusted.  */
   62:     return EINVAL;
   63: 
   64:   /* Make sure the value fits in the bits we reserved.  */
   65:   assert (clock_id < (1 << COND_NWAITERS_SHIFT));
   66: 
   67:   int *valuep = &((struct pthread_condattr *) attr)->value;
   68: 
   69:   *valuep = ((*valuep & ~(1 << (COND_NWAITERS_SHIFT + 1)) & ~1)
   70:              | (clock_id << 1));
   71: 
   72:   return 0;
   73: }
Syntax (Markdown)