| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | #ifndef _LINUX_TIME_H | 
 | 2 | #define _LINUX_TIME_H | 
 | 3 |  | 
 | 4 | #include <linux/types.h> | 
 | 5 |  | 
 | 6 | #ifdef __KERNEL__ | 
| Ingo Molnar | 57a5587 | 2006-01-09 20:52:26 -0800 | [diff] [blame] | 7 | # include <linux/seqlock.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 8 | #endif | 
 | 9 |  | 
 | 10 | #ifndef _STRUCT_TIMESPEC | 
 | 11 | #define _STRUCT_TIMESPEC | 
 | 12 | struct timespec { | 
 | 13 | 	time_t	tv_sec;		/* seconds */ | 
 | 14 | 	long	tv_nsec;	/* nanoseconds */ | 
 | 15 | }; | 
| Ingo Molnar | 57a5587 | 2006-01-09 20:52:26 -0800 | [diff] [blame] | 16 | #endif | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 17 |  | 
 | 18 | struct timeval { | 
 | 19 | 	time_t		tv_sec;		/* seconds */ | 
 | 20 | 	suseconds_t	tv_usec;	/* microseconds */ | 
 | 21 | }; | 
 | 22 |  | 
 | 23 | struct timezone { | 
 | 24 | 	int	tz_minuteswest;	/* minutes west of Greenwich */ | 
 | 25 | 	int	tz_dsttime;	/* type of dst correction */ | 
 | 26 | }; | 
 | 27 |  | 
 | 28 | #ifdef __KERNEL__ | 
 | 29 |  | 
| Ingo Molnar | 57a5587 | 2006-01-09 20:52:26 -0800 | [diff] [blame] | 30 | /* Parameters used to convert the timespec values: */ | 
 | 31 | #define MSEC_PER_SEC		1000L | 
 | 32 | #define USEC_PER_SEC		1000000L | 
 | 33 | #define NSEC_PER_SEC		1000000000L | 
 | 34 | #define NSEC_PER_USEC		1000L | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 35 |  | 
| Ingo Molnar | 57a5587 | 2006-01-09 20:52:26 -0800 | [diff] [blame] | 36 | static __inline__ int timespec_equal(struct timespec *a, struct timespec *b) | 
 | 37 | { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 38 | 	return (a->tv_sec == b->tv_sec) && (a->tv_nsec == b->tv_nsec); | 
| Ingo Molnar | 57a5587 | 2006-01-09 20:52:26 -0800 | [diff] [blame] | 39 | } | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 40 |  | 
| Ingo Molnar | f481890 | 2006-01-09 20:52:23 -0800 | [diff] [blame] | 41 | extern unsigned long mktime(const unsigned int year, const unsigned int mon, | 
 | 42 | 			    const unsigned int day, const unsigned int hour, | 
 | 43 | 			    const unsigned int min, const unsigned int sec); | 
 | 44 |  | 
 | 45 | extern void set_normalized_timespec(struct timespec *ts, time_t sec, long nsec); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 46 |  | 
| Thomas Gleixner | 5f82b2b | 2006-01-09 20:52:29 -0800 | [diff] [blame] | 47 | /* | 
 | 48 |  * Returns true if the timespec is norm, false if denorm: | 
 | 49 |  */ | 
 | 50 | #define timespec_valid(ts) \ | 
 | 51 | 	(((ts)->tv_sec >= 0) && (((unsigned) (ts)->tv_nsec) < NSEC_PER_SEC)) | 
 | 52 |  | 
| Thomas Gleixner | f8f46da | 2006-01-09 20:52:30 -0800 | [diff] [blame] | 53 | /* | 
 | 54 |  * 64-bit nanosec type. Large enough to span 292+ years in nanosecond | 
 | 55 |  * resolution. Ought to be enough for a while. | 
 | 56 |  */ | 
 | 57 | typedef s64 nsec_t; | 
 | 58 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 59 | extern struct timespec xtime; | 
 | 60 | extern struct timespec wall_to_monotonic; | 
 | 61 | extern seqlock_t xtime_lock; | 
 | 62 |  | 
 | 63 | static inline unsigned long get_seconds(void) | 
| Ingo Molnar | 57a5587 | 2006-01-09 20:52:26 -0800 | [diff] [blame] | 64 | { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 65 | 	return xtime.tv_sec; | 
 | 66 | } | 
 | 67 |  | 
 | 68 | struct timespec current_kernel_time(void); | 
 | 69 |  | 
| Ingo Molnar | 57a5587 | 2006-01-09 20:52:26 -0800 | [diff] [blame] | 70 | #define CURRENT_TIME		(current_kernel_time()) | 
 | 71 | #define CURRENT_TIME_SEC	((struct timespec) { xtime.tv_sec, 0 }) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 72 |  | 
 | 73 | extern void do_gettimeofday(struct timeval *tv); | 
 | 74 | extern int do_settimeofday(struct timespec *tv); | 
 | 75 | extern int do_sys_settimeofday(struct timespec *tv, struct timezone *tz); | 
| Thomas Gleixner | becf8b5 | 2006-01-09 20:52:38 -0800 | [diff] [blame] | 76 | #define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts) | 
| Ingo Molnar | 57a5587 | 2006-01-09 20:52:26 -0800 | [diff] [blame] | 77 | extern long do_utimes(char __user *filename, struct timeval *times); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 78 | struct itimerval; | 
| Ingo Molnar | 57a5587 | 2006-01-09 20:52:26 -0800 | [diff] [blame] | 79 | extern int do_setitimer(int which, struct itimerval *value, | 
 | 80 | 			struct itimerval *ovalue); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 81 | extern int do_getitimer(int which, struct itimerval *value); | 
| Ingo Molnar | 57a5587 | 2006-01-09 20:52:26 -0800 | [diff] [blame] | 82 | extern void getnstimeofday(struct timespec *tv); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 83 |  | 
 | 84 | extern struct timespec timespec_trunc(struct timespec t, unsigned gran); | 
 | 85 |  | 
| Thomas Gleixner | f8f46da | 2006-01-09 20:52:30 -0800 | [diff] [blame] | 86 | /** | 
 | 87 |  * timespec_to_ns - Convert timespec to nanoseconds | 
 | 88 |  * @ts:		pointer to the timespec variable to be converted | 
 | 89 |  * | 
 | 90 |  * Returns the scalar nanosecond representation of the timespec | 
 | 91 |  * parameter. | 
 | 92 |  */ | 
 | 93 | static inline nsec_t timespec_to_ns(const struct timespec *ts) | 
 | 94 | { | 
 | 95 | 	return ((nsec_t) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec; | 
 | 96 | } | 
 | 97 |  | 
 | 98 | /** | 
 | 99 |  * timeval_to_ns - Convert timeval to nanoseconds | 
 | 100 |  * @ts:		pointer to the timeval variable to be converted | 
 | 101 |  * | 
 | 102 |  * Returns the scalar nanosecond representation of the timeval | 
 | 103 |  * parameter. | 
 | 104 |  */ | 
 | 105 | static inline nsec_t timeval_to_ns(const struct timeval *tv) | 
 | 106 | { | 
 | 107 | 	return ((nsec_t) tv->tv_sec * NSEC_PER_SEC) + | 
 | 108 | 		tv->tv_usec * NSEC_PER_USEC; | 
 | 109 | } | 
 | 110 |  | 
 | 111 | /** | 
 | 112 |  * ns_to_timespec - Convert nanoseconds to timespec | 
 | 113 |  * @nsec:	the nanoseconds value to be converted | 
 | 114 |  * | 
 | 115 |  * Returns the timespec representation of the nsec parameter. | 
 | 116 |  */ | 
 | 117 | extern struct timespec ns_to_timespec(const nsec_t nsec); | 
 | 118 |  | 
 | 119 | /** | 
 | 120 |  * ns_to_timeval - Convert nanoseconds to timeval | 
 | 121 |  * @nsec:	the nanoseconds value to be converted | 
 | 122 |  * | 
 | 123 |  * Returns the timeval representation of the nsec parameter. | 
 | 124 |  */ | 
 | 125 | extern struct timeval ns_to_timeval(const nsec_t nsec); | 
 | 126 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 127 | #endif /* __KERNEL__ */ | 
 | 128 |  | 
 | 129 | #define NFDBITS			__NFDBITS | 
 | 130 |  | 
 | 131 | #define FD_SETSIZE		__FD_SETSIZE | 
 | 132 | #define FD_SET(fd,fdsetp)	__FD_SET(fd,fdsetp) | 
 | 133 | #define FD_CLR(fd,fdsetp)	__FD_CLR(fd,fdsetp) | 
 | 134 | #define FD_ISSET(fd,fdsetp)	__FD_ISSET(fd,fdsetp) | 
 | 135 | #define FD_ZERO(fdsetp)		__FD_ZERO(fdsetp) | 
 | 136 |  | 
 | 137 | /* | 
 | 138 |  * Names of the interval timers, and structure | 
| Ingo Molnar | 57a5587 | 2006-01-09 20:52:26 -0800 | [diff] [blame] | 139 |  * defining a timer setting: | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 140 |  */ | 
| Ingo Molnar | 57a5587 | 2006-01-09 20:52:26 -0800 | [diff] [blame] | 141 | #define	ITIMER_REAL		0 | 
 | 142 | #define	ITIMER_VIRTUAL		1 | 
 | 143 | #define	ITIMER_PROF		2 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 144 |  | 
| Ingo Molnar | 57a5587 | 2006-01-09 20:52:26 -0800 | [diff] [blame] | 145 | struct itimerspec { | 
 | 146 | 	struct timespec it_interval;	/* timer period */ | 
 | 147 | 	struct timespec it_value;	/* timer expiration */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 148 | }; | 
 | 149 |  | 
| Ingo Molnar | 57a5587 | 2006-01-09 20:52:26 -0800 | [diff] [blame] | 150 | struct itimerval { | 
 | 151 | 	struct timeval it_interval;	/* timer interval */ | 
 | 152 | 	struct timeval it_value;	/* current value */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 153 | }; | 
 | 154 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 155 | /* | 
| Ingo Molnar | 57a5587 | 2006-01-09 20:52:26 -0800 | [diff] [blame] | 156 |  * The IDs of the various system clocks (for POSIX.1b interval timers): | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 157 |  */ | 
| Ingo Molnar | 1ad106c | 2006-01-09 20:52:25 -0800 | [diff] [blame] | 158 | #define CLOCK_REALTIME			0 | 
 | 159 | #define CLOCK_MONOTONIC			1 | 
 | 160 | #define CLOCK_PROCESS_CPUTIME_ID	2 | 
 | 161 | #define CLOCK_THREAD_CPUTIME_ID		3 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 162 |  | 
 | 163 | /* | 
| Ingo Molnar | 57a5587 | 2006-01-09 20:52:26 -0800 | [diff] [blame] | 164 |  * The IDs of various hardware clocks: | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 165 |  */ | 
| Ingo Molnar | 1ad106c | 2006-01-09 20:52:25 -0800 | [diff] [blame] | 166 | #define CLOCK_SGI_CYCLE			10 | 
 | 167 | #define MAX_CLOCKS			16 | 
 | 168 | #define CLOCKS_MASK			(CLOCK_REALTIME | CLOCK_MONOTONIC) | 
 | 169 | #define CLOCKS_MONO			CLOCK_MONOTONIC | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 170 |  | 
 | 171 | /* | 
| Ingo Molnar | 57a5587 | 2006-01-09 20:52:26 -0800 | [diff] [blame] | 172 |  * The various flags for setting POSIX.1b interval timers: | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 173 |  */ | 
| Ingo Molnar | 1ad106c | 2006-01-09 20:52:25 -0800 | [diff] [blame] | 174 | #define TIMER_ABSTIME			0x01 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 175 |  | 
 | 176 | #endif |