Home | History | Annotate | Download | only in linux
      1 #ifndef _LINUX_TIME_H
      2 #define _LINUX_TIME_H
      3 
      4 #include <linux/types.h>
      5 
      6 #ifdef __KERNEL__
      7 # include <linux/seqlock.h>
      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 };
     16 #endif
     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 
     30 /* Parameters used to convert the timespec values: */
     31 #define MSEC_PER_SEC	1000L
     32 #define USEC_PER_MSEC	1000L
     33 #define NSEC_PER_USEC	1000L
     34 #define NSEC_PER_MSEC	1000000L
     35 #define USEC_PER_SEC	1000000L
     36 #define NSEC_PER_SEC	1000000000L
     37 #define FSEC_PER_SEC	1000000000000000L
     38 
     39 static inline int timespec_equal(struct timespec *a, struct timespec *b)
     40 {
     41 	return (a->tv_sec == b->tv_sec) && (a->tv_nsec == b->tv_nsec);
     42 }
     43 
     44 /*
     45  * lhs < rhs:  return <0
     46  * lhs == rhs: return 0
     47  * lhs > rhs:  return >0
     48  */
     49 static inline int timespec_compare(struct timespec *lhs, struct timespec *rhs)
     50 {
     51 	if (lhs->tv_sec < rhs->tv_sec)
     52 		return -1;
     53 	if (lhs->tv_sec > rhs->tv_sec)
     54 		return 1;
     55 	return lhs->tv_nsec - rhs->tv_nsec;
     56 }
     57 
     58 static inline int timeval_compare(struct timeval *lhs, struct timeval *rhs)
     59 {
     60 	if (lhs->tv_sec < rhs->tv_sec)
     61 		return -1;
     62 	if (lhs->tv_sec > rhs->tv_sec)
     63 		return 1;
     64 	return lhs->tv_usec - rhs->tv_usec;
     65 }
     66 
     67 extern unsigned long mktime(const unsigned int year, const unsigned int mon,
     68 			    const unsigned int day, const unsigned int hour,
     69 			    const unsigned int min, const unsigned int sec);
     70 
     71 extern void set_normalized_timespec(struct timespec *ts, time_t sec, long nsec);
     72 
     73 /*
     74  * sub = lhs - rhs, in normalized form
     75  */
     76 static inline struct timespec timespec_sub(struct timespec lhs,
     77 						struct timespec rhs)
     78 {
     79 	struct timespec ts_delta;
     80 	set_normalized_timespec(&ts_delta, lhs.tv_sec - rhs.tv_sec,
     81 				lhs.tv_nsec - rhs.tv_nsec);
     82 	return ts_delta;
     83 }
     84 
     85 /*
     86  * Returns true if the timespec is norm, false if denorm:
     87  */
     88 #define timespec_valid(ts) \
     89 	(((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC))
     90 
     91 extern struct timespec xtime;
     92 extern struct timespec wall_to_monotonic;
     93 extern seqlock_t xtime_lock;
     94 
     95 void timekeeping_init(void);
     96 
     97 static inline unsigned long get_seconds(void)
     98 {
     99 	return xtime.tv_sec;
    100 }
    101 
    102 struct timespec current_kernel_time(void);
    103 
    104 #define CURRENT_TIME		(current_kernel_time())
    105 #define CURRENT_TIME_SEC	((struct timespec) { xtime.tv_sec, 0 })
    106 
    107 extern void do_gettimeofday(struct timeval *tv);
    108 extern int do_settimeofday(struct timespec *tv);
    109 extern int do_sys_settimeofday(struct timespec *tv, struct timezone *tz);
    110 #define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts)
    111 extern long do_utimes(int dfd, char __user *filename, struct timeval *times);
    112 struct itimerval;
    113 extern int do_setitimer(int which, struct itimerval *value,
    114 			struct itimerval *ovalue);
    115 extern unsigned int alarm_setitimer(unsigned int seconds);
    116 extern int do_getitimer(int which, struct itimerval *value);
    117 extern void getnstimeofday(struct timespec *tv);
    118 
    119 extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
    120 extern int timekeeping_is_continuous(void);
    121 
    122 /**
    123  * timespec_to_ns - Convert timespec to nanoseconds
    124  * @ts:		pointer to the timespec variable to be converted
    125  *
    126  * Returns the scalar nanosecond representation of the timespec
    127  * parameter.
    128  */
    129 static inline s64 timespec_to_ns(const struct timespec *ts)
    130 {
    131 	return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec;
    132 }
    133 
    134 /**
    135  * timeval_to_ns - Convert timeval to nanoseconds
    136  * @ts:		pointer to the timeval variable to be converted
    137  *
    138  * Returns the scalar nanosecond representation of the timeval
    139  * parameter.
    140  */
    141 static inline s64 timeval_to_ns(const struct timeval *tv)
    142 {
    143 	return ((s64) tv->tv_sec * NSEC_PER_SEC) +
    144 		tv->tv_usec * NSEC_PER_USEC;
    145 }
    146 
    147 /**
    148  * ns_to_timespec - Convert nanoseconds to timespec
    149  * @nsec:	the nanoseconds value to be converted
    150  *
    151  * Returns the timespec representation of the nsec parameter.
    152  */
    153 extern struct timespec ns_to_timespec(const s64 nsec);
    154 
    155 /**
    156  * ns_to_timeval - Convert nanoseconds to timeval
    157  * @nsec:	the nanoseconds value to be converted
    158  *
    159  * Returns the timeval representation of the nsec parameter.
    160  */
    161 extern struct timeval ns_to_timeval(const s64 nsec);
    162 
    163 /**
    164  * timespec_add_ns - Adds nanoseconds to a timespec
    165  * @a:		pointer to timespec to be incremented
    166  * @ns:		unsigned nanoseconds value to be added
    167  */
    168 static inline void timespec_add_ns(struct timespec *a, u64 ns)
    169 {
    170 	ns += a->tv_nsec;
    171 	while(unlikely(ns >= NSEC_PER_SEC)) {
    172 		ns -= NSEC_PER_SEC;
    173 		a->tv_sec++;
    174 	}
    175 	a->tv_nsec = ns;
    176 }
    177 #endif /* __KERNEL__ */
    178 
    179 #define NFDBITS			__NFDBITS
    180 
    181 #define FD_SETSIZE		__FD_SETSIZE
    182 #define FD_SET(fd,fdsetp)	__FD_SET(fd,fdsetp)
    183 #define FD_CLR(fd,fdsetp)	__FD_CLR(fd,fdsetp)
    184 #define FD_ISSET(fd,fdsetp)	__FD_ISSET(fd,fdsetp)
    185 #define FD_ZERO(fdsetp)		__FD_ZERO(fdsetp)
    186 
    187 /*
    188  * Names of the interval timers, and structure
    189  * defining a timer setting:
    190  */
    191 #define	ITIMER_REAL		0
    192 #define	ITIMER_VIRTUAL		1
    193 #define	ITIMER_PROF		2
    194 
    195 struct itimerspec {
    196 	struct timespec it_interval;	/* timer period */
    197 	struct timespec it_value;	/* timer expiration */
    198 };
    199 
    200 struct itimerval {
    201 	struct timeval it_interval;	/* timer interval */
    202 	struct timeval it_value;	/* current value */
    203 };
    204 
    205 /*
    206  * The IDs of the various system clocks (for POSIX.1b interval timers):
    207  */
    208 #define CLOCK_REALTIME			0
    209 #define CLOCK_MONOTONIC			1
    210 #define CLOCK_PROCESS_CPUTIME_ID	2
    211 #define CLOCK_THREAD_CPUTIME_ID		3
    212 
    213 /*
    214  * The IDs of various hardware clocks:
    215  */
    216 #define CLOCK_SGI_CYCLE			10
    217 #define MAX_CLOCKS			16
    218 #define CLOCKS_MASK			(CLOCK_REALTIME | CLOCK_MONOTONIC)
    219 #define CLOCKS_MONO			CLOCK_MONOTONIC
    220 
    221 /*
    222  * The various flags for setting POSIX.1b interval timers:
    223  */
    224 #define TIMER_ABSTIME			0x01
    225 
    226 #endif
    227