clock_nanosleep()のソースを追う
clock_nanosleepはシステムコールだそうです。
[kernel/posix-timers.c]
1035 SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags, 1036 const struct timespec __user *, rqtp, 1037 struct timespec __user *, rmtp) 1038 { 1039 struct k_clock *kc = clockid_to_kclock(which_clock); 1040 struct timespec t; 1041 1042 if (!kc) 1043 return -EINVAL; 1044 if (!kc->nsleep) 1045 return -ENANOSLEEP_NOTSUP; 1046 1047 if (copy_from_user(&t, rqtp, sizeof (struct timespec))) 1048 return -EFAULT; 1049 1050 if (!timespec_valid(&t)) 1051 return -EINVAL; 1052 1053 return kc->nsleep(which_clock, flags, &t, rmtp); 1054 }
kc->nsleepが定義されているのはここ。
[kernel/posix-timers.c]
225 /* 226 * Initialize everything, well, just everything in Posix clocks/timers ;) 227 */ 228 static __init int init_posix_timers(void) 229 { 230 struct k_clock clock_realtime = { 231 .clock_getres = hrtimer_get_res, 232 .clock_get = posix_clock_realtime_get, 233 .clock_set = posix_clock_realtime_set, 234 .clock_adj = posix_clock_realtime_adj, 235 .nsleep = common_nsleep, 236 .nsleep_restart = hrtimer_nanosleep_restart, 237 .timer_create = common_timer_create, 238 .timer_set = common_timer_set, 239 .timer_get = common_timer_get, 240 .timer_del = common_timer_del, 241 }; 242 struct k_clock clock_monotonic = { 243 .clock_getres = hrtimer_get_res, 244 .clock_get = posix_ktime_get_ts, 245 .nsleep = common_nsleep, 246 .nsleep_restart = hrtimer_nanosleep_restart, 247 .timer_create = common_timer_create, 248 .timer_set = common_timer_set, 249 .timer_get = common_timer_get, 250 .timer_del = common_timer_del, 251 }; ...
そして、common_nsleepはこちら。
[kernel/posix-timers.c]
1024 /* 1025 * nanosleep for monotonic and realtime clocks 1026 */ 1027 static int common_nsleep(const clockid_t which_clock, int flags, 1028 struct timespec *tsave, struct timespec __user *rmtp) 1029 { 1030 return hrtimer_nanosleep(tsave, rmtp, flags & TIMER_ABSTIME ? 1031 HRTIMER_MODE_ABS : HRTIMER_MODE_REL, 1032 which_clock); 1033 }
ここから、高精度カーネルタイマ hrtimerの世界へ!