| OLD | NEW |
| 1 /* Copyright (C) 2003, 2004, 2007, 2008 Free Software Foundation, Inc. | 1 /* Copyright (C) 2003, 2004, 2007, 2008 Free Software Foundation, Inc. |
| 2 This file is part of the GNU C Library. | 2 This file is part of the GNU C Library. |
| 3 Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. | 3 Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. |
| 4 | 4 |
| 5 The GNU C Library is free software; you can redistribute it and/or | 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 | 6 modify it under the terms of the GNU Lesser General Public |
| 7 License as published by the Free Software Foundation; either | 7 License as published by the Free Software Foundation; either |
| 8 version 2.1 of the License, or (at your option) any later version. | 8 version 2.1 of the License, or (at your option) any later version. |
| 9 | 9 |
| 10 The GNU C Library is distributed in the hope that it will be useful, | 10 The GNU C Library is distributed in the hope that it will be useful, |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 #include <sysdep.h> | 24 #include <sysdep.h> |
| 25 #include "pthreadP.h" | 25 #include "pthreadP.h" |
| 26 #include <kernel-features.h> | 26 #include <kernel-features.h> |
| 27 | 27 |
| 28 | 28 |
| 29 int | 29 int |
| 30 pthread_condattr_setclock (attr, clock_id) | 30 pthread_condattr_setclock (attr, clock_id) |
| 31 pthread_condattr_t *attr; | 31 pthread_condattr_t *attr; |
| 32 clockid_t clock_id; | 32 clockid_t clock_id; |
| 33 { | 33 { |
| 34 /* Only a few clocks are allowed. CLOCK_REALTIME is always allowed. | 34 switch (clock_id) |
| 35 CLOCK_MONOTONIC only if the kernel has the necessary support. */ | |
| 36 if (clock_id == CLOCK_MONOTONIC) | |
| 37 { | 35 { |
| 38 #ifndef __ASSUME_POSIX_TIMERS | 36 case CLOCK_REALTIME: |
| 39 # ifdef __NR_clock_getres | 37 /* This is the default state and the only one actually supported. */ |
| 40 /* Check whether the clock is available. */ | 38 return 0; |
| 41 static int avail; | |
| 42 | 39 |
| 43 if (avail == 0) | 40 case CLOCK_MONOTONIC: |
| 44 » { | 41 /* NaCl recognizes CLOCK_MONOTONIC for other purposes, so it is a |
| 45 » struct timespec ts; | 42 "known clock". But NaCl doesn't support it for this purpose. */ |
| 43 return ENOTSUP; |
| 46 | 44 |
| 47 » INTERNAL_SYSCALL_DECL (err); | 45 default: |
| 48 » int val; | 46 /* The only other recognized clocks are CPU-time clocks, |
| 49 » val = INTERNAL_SYSCALL (clock_getres, err, 2, CLOCK_MONOTONIC, &ts); | 47 which POSIX says should get EINVAL. */ |
| 50 » avail = INTERNAL_SYSCALL_ERROR_P (val, err) ? -1 : 1; | 48 return EINVAL; |
| 51 » } | |
| 52 | |
| 53 if (avail < 0) | |
| 54 # endif | |
| 55 » /* Not available. */ | |
| 56 » return EINVAL; | |
| 57 #endif | |
| 58 } | 49 } |
| 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 } | 50 } |
| OLD | NEW |