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 |