[BACK]Return to time.h CVS log [TXT][DIR] Up to [local] / sys / sys

Annotation of sys/sys/time.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: time.h,v 1.25 2007/05/09 17:42:19 deraadt Exp $       */
                      2: /*     $NetBSD: time.h,v 1.18 1996/04/23 10:29:33 mycroft Exp $        */
                      3:
                      4: /*
                      5:  * Copyright (c) 1982, 1986, 1993
                      6:  *     The Regents of the University of California.  All rights reserved.
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  * 3. Neither the name of the University nor the names of its contributors
                     17:  *    may be used to endorse or promote products derived from this software
                     18:  *    without specific prior written permission.
                     19:  *
                     20:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     21:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     22:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     23:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     24:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     25:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     26:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     27:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     28:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     29:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     30:  * SUCH DAMAGE.
                     31:  *
                     32:  *     @(#)time.h      8.2 (Berkeley) 7/10/94
                     33:  */
                     34:
                     35: #ifndef _SYS_TIME_H_
                     36: #define _SYS_TIME_H_
                     37:
                     38: #include <sys/cdefs.h>
                     39: #include <sys/types.h>
                     40:
                     41: #if __XPG_VISIBLE >= 420 && __XPG_VISIBLE < 600
                     42: #include <sys/select.h>
                     43: #endif
                     44:
                     45: /*
                     46:  * Structure returned by gettimeofday(2) system call,
                     47:  * and used in other calls.
                     48:  */
                     49: struct timeval {
                     50:        long    tv_sec;         /* seconds */
                     51:        long    tv_usec;        /* and microseconds */
                     52: };
                     53:
                     54: #ifndef _TIMESPEC_DECLARED
                     55: #define _TIMESPEC_DECLARED
                     56: /*
                     57:  * Structure defined by POSIX.1b to be like a timeval.
                     58:  */
                     59: struct timespec {
                     60:        time_t  tv_sec;         /* seconds */
                     61:        long    tv_nsec;        /* and nanoseconds */
                     62: };
                     63: #endif
                     64:
                     65: #define        TIMEVAL_TO_TIMESPEC(tv, ts) {                                   \
                     66:        (ts)->tv_sec = (tv)->tv_sec;                                    \
                     67:        (ts)->tv_nsec = (tv)->tv_usec * 1000;                           \
                     68: }
                     69: #define        TIMESPEC_TO_TIMEVAL(tv, ts) {                                   \
                     70:        (tv)->tv_sec = (ts)->tv_sec;                                    \
                     71:        (tv)->tv_usec = (ts)->tv_nsec / 1000;                           \
                     72: }
                     73:
                     74: struct timezone {
                     75:        int     tz_minuteswest; /* minutes west of Greenwich */
                     76:        int     tz_dsttime;     /* type of dst correction */
                     77: };
                     78: #define        DST_NONE        0       /* not on dst */
                     79: #define        DST_USA         1       /* USA style dst */
                     80: #define        DST_AUST        2       /* Australian style dst */
                     81: #define        DST_WET         3       /* Western European dst */
                     82: #define        DST_MET         4       /* Middle European dst */
                     83: #define        DST_EET         5       /* Eastern European dst */
                     84: #define        DST_CAN         6       /* Canada */
                     85:
                     86: /* Operations on timevals. */
                     87: #define        timerclear(tvp)         (tvp)->tv_sec = (tvp)->tv_usec = 0
                     88: #define        timerisset(tvp)         ((tvp)->tv_sec || (tvp)->tv_usec)
                     89: #define        timercmp(tvp, uvp, cmp)                                         \
                     90:        (((tvp)->tv_sec == (uvp)->tv_sec) ?                             \
                     91:            ((tvp)->tv_usec cmp (uvp)->tv_usec) :                       \
                     92:            ((tvp)->tv_sec cmp (uvp)->tv_sec))
                     93: #define        timeradd(tvp, uvp, vvp)                                         \
                     94:        do {                                                            \
                     95:                (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec;          \
                     96:                (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec;       \
                     97:                if ((vvp)->tv_usec >= 1000000) {                        \
                     98:                        (vvp)->tv_sec++;                                \
                     99:                        (vvp)->tv_usec -= 1000000;                      \
                    100:                }                                                       \
                    101:        } while (0)
                    102: #define        timersub(tvp, uvp, vvp)                                         \
                    103:        do {                                                            \
                    104:                (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec;          \
                    105:                (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec;       \
                    106:                if ((vvp)->tv_usec < 0) {                               \
                    107:                        (vvp)->tv_sec--;                                \
                    108:                        (vvp)->tv_usec += 1000000;                      \
                    109:                }                                                       \
                    110:        } while (0)
                    111:
                    112: /* Operations on timespecs. */
                    113: #define        timespecclear(tsp)              (tsp)->tv_sec = (tsp)->tv_nsec = 0
                    114: #define        timespecisset(tsp)              ((tsp)->tv_sec || (tsp)->tv_nsec)
                    115: #define        timespeccmp(tsp, usp, cmp)                                      \
                    116:        (((tsp)->tv_sec == (usp)->tv_sec) ?                             \
                    117:            ((tsp)->tv_nsec cmp (usp)->tv_nsec) :                       \
                    118:            ((tsp)->tv_sec cmp (usp)->tv_sec))
                    119: #define        timespecadd(tsp, usp, vsp)                                      \
                    120:        do {                                                            \
                    121:                (vsp)->tv_sec = (tsp)->tv_sec + (usp)->tv_sec;          \
                    122:                (vsp)->tv_nsec = (tsp)->tv_nsec + (usp)->tv_nsec;       \
                    123:                if ((vsp)->tv_nsec >= 1000000000L) {                    \
                    124:                        (vsp)->tv_sec++;                                \
                    125:                        (vsp)->tv_nsec -= 1000000000L;                  \
                    126:                }                                                       \
                    127:        } while (0)
                    128: #define        timespecsub(tsp, usp, vsp)                                      \
                    129:        do {                                                            \
                    130:                (vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec;          \
                    131:                (vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec;       \
                    132:                if ((vsp)->tv_nsec < 0) {                               \
                    133:                        (vsp)->tv_sec--;                                \
                    134:                        (vsp)->tv_nsec += 1000000000L;                  \
                    135:                }                                                       \
                    136:        } while (0)
                    137:
                    138: /* Time expressed as seconds and fractions of a second + operations on it. */
                    139: struct bintime {
                    140:        time_t  sec;
                    141:        uint64_t frac;
                    142: };
                    143:
                    144: static __inline void
                    145: bintime_addx(struct bintime *bt, uint64_t x)
                    146: {
                    147:        uint64_t u;
                    148:
                    149:        u = bt->frac;
                    150:        bt->frac += x;
                    151:        if (u > bt->frac)
                    152:                bt->sec++;
                    153: }
                    154:
                    155: static __inline void
                    156: bintime_add(struct bintime *bt, struct bintime *bt2)
                    157: {
                    158:        uint64_t u;
                    159:
                    160:        u = bt->frac;
                    161:        bt->frac += bt2->frac;
                    162:        if (u > bt->frac)
                    163:                bt->sec++;
                    164:        bt->sec += bt2->sec;
                    165: }
                    166:
                    167: static __inline void
                    168: bintime_sub(struct bintime *bt, struct bintime *bt2)
                    169: {
                    170:        uint64_t u;
                    171:
                    172:        u = bt->frac;
                    173:        bt->frac -= bt2->frac;
                    174:        if (u < bt->frac)
                    175:                bt->sec--;
                    176:        bt->sec -= bt2->sec;
                    177: }
                    178:
                    179: /*-
                    180:  * Background information:
                    181:  *
                    182:  * When converting between timestamps on parallel timescales of differing
                    183:  * resolutions it is historical and scientific practice to round down rather
                    184:  * than doing 4/5 rounding.
                    185:  *
                    186:  *   The date changes at midnight, not at noon.
                    187:  *
                    188:  *   Even at 15:59:59.999999999 it's not four'o'clock.
                    189:  *
                    190:  *   time_second ticks after N.999999999 not after N.4999999999
                    191:  */
                    192:
                    193: static __inline void
                    194: bintime2timespec(struct bintime *bt, struct timespec *ts)
                    195: {
                    196:
                    197:        ts->tv_sec = bt->sec;
                    198:        ts->tv_nsec = (long)(((uint64_t)1000000000 * (uint32_t)(bt->frac >> 32)) >> 32);
                    199: }
                    200:
                    201: static __inline void
                    202: timespec2bintime(struct timespec *ts, struct bintime *bt)
                    203: {
                    204:
                    205:        bt->sec = ts->tv_sec;
                    206:        /* 18446744073 = int(2^64 / 1000000000) */
                    207:        bt->frac = (uint64_t)ts->tv_nsec * (uint64_t)18446744073ULL;
                    208: }
                    209:
                    210: static __inline void
                    211: bintime2timeval(struct bintime *bt, struct timeval *tv)
                    212: {
                    213:
                    214:        tv->tv_sec = bt->sec;
                    215:        tv->tv_usec = (long)(((uint64_t)1000000 * (uint32_t)(bt->frac >> 32)) >> 32);
                    216: }
                    217:
                    218: static __inline void
                    219: timeval2bintime(struct timeval *tv, struct bintime *bt)
                    220: {
                    221:
                    222:        bt->sec = (time_t)tv->tv_sec;
                    223:        /* 18446744073709 = int(2^64 / 1000000) */
                    224:        bt->frac = (uint64_t)tv->tv_usec * (uint64_t)18446744073709ULL;
                    225: }
                    226:
                    227: /*
                    228:  * Names of the interval timers, and structure
                    229:  * defining a timer setting.
                    230:  */
                    231: #define        ITIMER_REAL     0
                    232: #define        ITIMER_VIRTUAL  1
                    233: #define        ITIMER_PROF     2
                    234:
                    235: struct itimerval {
                    236:        struct  timeval it_interval;    /* timer interval */
                    237:        struct  timeval it_value;       /* current value */
                    238: };
                    239:
                    240: /*
                    241:  * Structure defined by POSIX 1003.1b to be like a itimerval,
                    242:  * but with timespecs. Used in the timer_*() system calls.
                    243:  */
                    244: struct  itimerspec {
                    245:        struct  timespec it_interval;   /* timer interval */
                    246:        struct  timespec it_value;      /* timer expiration */
                    247: };
                    248:
                    249: /*
                    250:  * Getkerninfo clock information structure
                    251:  */
                    252: struct clockinfo {
                    253:        int     hz;             /* clock frequency */
                    254:        int     tick;           /* micro-seconds per hz tick */
                    255:        int     tickadj;        /* clock skew rate for adjtime() */
                    256:        int     stathz;         /* statistics clock frequency */
                    257:        int     profhz;         /* profiling clock frequency */
                    258: };
                    259:
                    260: #define CLOCK_REALTIME 0
                    261: #define CLOCK_VIRTUAL  1
                    262: #define CLOCK_PROF     2
                    263: #define        CLOCK_MONOTONIC 3
                    264:
                    265: #define TIMER_RELTIME  0x0     /* relative timer */
                    266: #define TIMER_ABSTIME  0x1     /* absolute timer */
                    267:
                    268: #if defined(_KERNEL) || defined(_STANDALONE)
                    269: extern volatile time_t time_second;    /* Seconds since epoch, wall time. */
                    270: extern volatile time_t time_uptime;    /* Seconds since reboot. */
                    271:
                    272: /*
                    273:  * Functions for looking at our clock: [get]{bin,nano,micro}[up]time()
                    274:  *
                    275:  * Functions without the "get" prefix returns the best timestamp
                    276:  * we can produce in the given format.
                    277:  *
                    278:  * "bin"   == struct bintime  == seconds + 64 bit fraction of seconds.
                    279:  * "nano"  == struct timespec == seconds + nanoseconds.
                    280:  * "micro" == struct timeval  == seconds + microseconds.
                    281:  *
                    282:  * Functions containing "up" returns time relative to boot and
                    283:  * should be used for calculating time intervals.
                    284:  *
                    285:  * Functions without "up" returns GMT time.
                    286:  *
                    287:  * Functions with the "get" prefix returns a less precise result
                    288:  * much faster than the functions without "get" prefix and should
                    289:  * be used where a precision of 10 msec is acceptable or where
                    290:  * performance is priority. (NB: "precision", _not_ "resolution" !)
                    291:  */
                    292:
                    293: void   bintime(struct bintime *);
                    294: void   nanotime(struct timespec *);
                    295: void   microtime(struct timeval *);
                    296:
                    297: void   getnanotime(struct timespec *);
                    298: void   getmicrotime(struct timeval *);
                    299:
                    300: void   binuptime(struct bintime *);
                    301: void   nanouptime(struct timespec *);
                    302: void   microuptime(struct timeval *);
                    303:
                    304: void   getnanouptime(struct timespec *);
                    305: void   getmicrouptime(struct timeval *);
                    306:
                    307: int    itimerfix(struct timeval *);
                    308: int    itimerdecr(struct itimerval *itp, int usec);
                    309: int    settime(struct timespec *);
                    310: int    ratecheck(struct timeval *, const struct timeval *);
                    311: int    ppsratecheck(struct timeval *, int *, int);
                    312:
                    313: /*
                    314:  * "POSIX time" to/from "YY/MM/DD/hh/mm/ss"
                    315:  */
                    316: struct clock_ymdhms {
                    317:         u_short dt_year;
                    318:         u_char dt_mon;
                    319:         u_char dt_day;
                    320:         u_char dt_wday; /* Day of week */
                    321:         u_char dt_hour;
                    322:         u_char dt_min;
                    323:         u_char dt_sec;
                    324: };
                    325:
                    326: time_t clock_ymdhms_to_secs(struct clock_ymdhms *);
                    327: void clock_secs_to_ymdhms(time_t, struct clock_ymdhms *);
                    328: /*
                    329:  * BCD to decimal and decimal to BCD.
                    330:  */
                    331: #define FROMBCD(x)      (((x) >> 4) * 10 + ((x) & 0xf))
                    332: #define TOBCD(x)        (((x) / 10 * 16) + ((x) % 10))
                    333:
                    334: /* Some handy constants. */
                    335: #define SECDAY          86400L
                    336: #define SECYR           (SECDAY * 365)
                    337:
                    338: /* Traditional POSIX base year */
                    339: #define POSIX_BASE_YEAR 1970
                    340:
                    341: #else /* !_KERNEL */
                    342: #include <time.h>
                    343:
                    344: #if __BSD_VISIBLE || __XPG_VISIBLE
                    345: __BEGIN_DECLS
                    346: #if __BSD_VISIBLE
                    347: int    adjtime(const struct timeval *, struct timeval *);
                    348: int    adjfreq(const int64_t *, int64_t *);
                    349: #endif
                    350: #if __XPG_VISIBLE
                    351: int    clock_getres(clockid_t, struct timespec *);
                    352: int    clock_gettime(clockid_t, struct timespec *);
                    353: int    clock_settime(clockid_t, const struct timespec *);
                    354: int    futimes(int, const struct timeval *);
                    355: int    getitimer(int, struct itimerval *);
                    356: int    gettimeofday(struct timeval *, struct timezone *);
                    357: int    setitimer(int, const struct itimerval *, struct itimerval *);
                    358: int    settimeofday(const struct timeval *, const struct timezone *);
                    359: int    utimes(const char *, const struct timeval *);
                    360: #endif /* __XPG_VISIBLE */
                    361: __END_DECLS
                    362: #endif /* __BSD_VISIBLE || __XPG_VISIBLE */
                    363:
                    364: #endif /* !_KERNEL */
                    365:
                    366: #endif /* !_SYS_TIME_H_ */

CVSweb