Annotation of XNU/osfmk/kern/clock.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: /*
                     23:  * @OSF_COPYRIGHT@
                     24:  */
                     25: /*
                     26:  *     File:           kern/clock.h
                     27:  *     Purpose:        Data structures for the kernel alarm clock
                     28:  *                     facility. This file is used only by kernel
                     29:  *                     level clock facility routines.
                     30:  */
                     31: 
                     32: #ifndef        _KERN_CLOCK_H_
                     33: #define        _KERN_CLOCK_H_
                     34: 
                     35: #include <libkern/OSBase.h>
                     36: 
                     37: #include <mach/message.h>
                     38: #include <mach/clock_types.h>
                     39: #include <mach/mach_types.h>
                     40: 
                     41: #ifdef MACH_KERNEL_PRIVATE
                     42: #include <ipc/ipc_port.h>
                     43: 
                     44: /*
                     45:  * Actual clock alarm structure. Used for user clock_sleep() and
                     46:  * clock_alarm() calls. Alarms are allocated from the alarm free
                     47:  * list and entered in time priority order into the active alarm
                     48:  * chain of the target clock.
                     49:  */
                     50: struct alarm {
                     51:        struct  alarm   *al_next;               /* next alarm in chain */
                     52:        struct  alarm   *al_prev;               /* previous alarm in chain */
                     53:        int                             al_status;              /* alarm status */
                     54:        mach_timespec_t al_time;                /* alarm time */
                     55:        struct {                                /* message alarm data */
                     56:                int                             type;           /* alarm type */
                     57:                ipc_port_t              port;           /* alarm port */
                     58:                mach_msg_type_name_t
                     59:                                                port_type;      /* alarm port type */
                     60:                struct  clock   *clock;         /* alarm clock */
                     61:                void                    *data;          /* alarm data */
                     62:        } al_alrm;
                     63: #define al_type                al_alrm.type
                     64: #define al_port                al_alrm.port
                     65: #define al_port_type   al_alrm.port_type
                     66: #define al_clock       al_alrm.clock
                     67: #define al_data                al_alrm.data
                     68:        int                             al_policy;              /* sched policy to notify */
                     69:        long                    al_seqno;               /* alarm sequence number */
                     70: };
                     71: typedef struct alarm   alarm_data_t;
                     72: 
                     73: /* alarm status */
                     74: #define ALARM_FREE     0               /* alarm is on free list */
                     75: #define        ALARM_SLEEP     1               /* active clock_sleep() */
                     76: #define ALARM_CLOCK    2               /* active clock_alarm() */
                     77: #define ALARM_DONE     4               /* alarm has expired */
                     78: 
                     79: /*
                     80:  * Clock operations list structure. Contains vectors to machine
                     81:  * dependent clock routines. The routines c_config, c_init, and
                     82:  * c_gettime must be implemented for every clock device.
                     83:  */
                     84: struct clock_ops {
                     85:        int             (*c_config)(void);              /* configuration */
                     86: 
                     87:        int             (*c_init)(void);                /* initialize */
                     88: 
                     89:        kern_return_t   (*c_gettime)(   /* get time */
                     90:                                mach_timespec_t                 *cur_time);
                     91: 
                     92:        kern_return_t   (*c_settime)(   /* set time */
                     93:                                mach_timespec_t                 *clock_time);
                     94: 
                     95:        kern_return_t   (*c_getattr)(   /* get attributes */
                     96:                                clock_flavor_t                  flavor,
                     97:                                clock_attr_t                    attr,
                     98:                                mach_msg_type_number_t  *count);
                     99: 
                    100:        kern_return_t   (*c_setattr)(   /* set attributes */
                    101:                                clock_flavor_t                  flavor,
                    102:                                clock_attr_t                    attr,
                    103:                                mach_msg_type_number_t  count);
                    104: 
                    105:        void            (*c_setalrm)(           /* set next alarm */
                    106:                                mach_timespec_t                 *alarm_time);
                    107: };
                    108: typedef struct clock_ops       *clock_ops_t;
                    109: typedef struct clock_ops       clock_ops_data_t;
                    110: 
                    111: /*
                    112:  * Actual clock object data structure. Contains the machine
                    113:  * dependent operations list, clock operations ports, and a
                    114:  * chain of pending alarms.
                    115:  */
                    116: struct clock {
                    117:        clock_ops_t                     cl_ops;                 /* operations list */
                    118:        struct ipc_port         *cl_service;    /* service port */
                    119:        struct ipc_port         *cl_control;    /* control port */
                    120:        struct  {                                                       /* alarm chain head */
                    121:                struct alarm    *al_next;
                    122:        } cl_alarm;
                    123: };
                    124: typedef struct clock           clock_data_t;
                    125: 
                    126: /*
                    127:  * Configure the clock system.
                    128:  */
                    129: extern void            clock_config(void);
                    130: /*
                    131:  * Initialize the clock system.
                    132:  */
                    133: extern void            clock_init(void);
                    134: 
                    135: /*
                    136:  * Initialize the clock ipc service facility.
                    137:  */
                    138: extern void            clock_service_create(void);
                    139: 
                    140: /*
                    141:  * Service clock alarm interrupts. Called from machine dependent
                    142:  * layer at splclock(). The clock_id argument specifies the clock,
                    143:  * and the clock_time argument gives that clock's current time.
                    144:  */
                    145: extern void            clock_alarm_intr(
                    146:                                        clock_id_t              clock_id,
                    147:                                        mach_timespec_t *clock_time);
                    148: 
                    149: /*
                    150:  * Set a clock alarm for a scheduling policy.
                    151:  */
                    152: extern kern_return_t   clock_alarm_sp(
                    153:                                                        alarm_type_t    alarm_type,
                    154:                                                        mach_timespec_t alarm_time,
                    155:                                                        long                    *alarm_id,
                    156:                                                        int                             policy,
                    157:                                                        void                    *alarm_data,
                    158:                                                        alarm_t                 alarm);
                    159: 
                    160: /*
                    161:  * Cancel a clock alarm on behalf of a scheduling policy.
                    162:  */
                    163: extern kern_return_t   clock_alarm_cancel_sp(
                    164:                                                        long                    alarm_id);
                    165: 
                    166: extern kern_return_t   clock_sleep_internal(
                    167:                                                        clock_t                 clock,
                    168:                                                        sleep_type_t    sleep_type,
                    169:                                                        mach_timespec_t *sleep_time);
                    170: 
                    171: typedef void           (*clock_timer_func_t)(
                    172:                                                AbsoluteTime            timestamp);
                    173: 
                    174: extern void                    clock_set_timer_func(
                    175:                                                clock_timer_func_t      func);
                    176: 
                    177: extern void                    clock_set_timer_deadline(
                    178:                                                AbsoluteTime            deadline);
                    179: 
                    180: #endif /* MACH_KERNEL_PRIVATE */
                    181: 
                    182: #define MACH_TIMESPEC_SEC_MAX          (0 - 1)
                    183: #define MACH_TIMESPEC_NSEC_MAX         (NSEC_PER_SEC - 1)
                    184: 
                    185: #define MACH_TIMESPEC_MAX      ((mach_timespec_t) {                            \
                    186:                                                                        MACH_TIMESPEC_SEC_MAX,          \
                    187:                                                                        MACH_TIMESPEC_NSEC_MAX } )
                    188: #define MACH_TIMESPEC_ZERO     ((mach_timespec_t) { 0, 0 } )
                    189: 
                    190: #define ADD_MACH_TIMESPEC_NSEC(t1, nsec)               \
                    191:   do {                                                                                 \
                    192:        (t1)->tv_nsec += (clock_res_t)(nsec);           \
                    193:        if ((clock_res_t)(nsec) > 0 &&                          \
                    194:                        (t1)->tv_nsec >= NSEC_PER_SEC) {        \
                    195:                (t1)->tv_nsec -= NSEC_PER_SEC;                  \
                    196:                (t1)->tv_sec += 1;                                              \
                    197:        }                                                                                       \
                    198:        else if ((clock_res_t)(nsec) < 0 &&                     \
                    199:                                 (t1)->tv_nsec < 0) {                   \
                    200:                (t1)->tv_nsec += NSEC_PER_SEC;                  \
                    201:                (t1)->tv_sec -= 1;                                              \
                    202:        }                                                                                       \
                    203:   } while (0)
                    204: 
                    205: extern mach_timespec_t clock_get_system_value(void);
                    206: 
                    207: extern mach_timespec_t clock_get_calendar_value(void);
                    208: 
                    209: extern void                            clock_set_calendar_value(
                    210:                                                        mach_timespec_t         value);
                    211: 
                    212: extern void                            clock_adjust_calendar(
                    213:                                                        clock_res_t                     nsec);
                    214: 
                    215: extern void                            clock_initialize_calendar(void);
                    216: 
                    217: extern mach_timespec_t clock_get_calendar_offset(void);
                    218: 
                    219: typedef unsigned long long     abstime_scalar_t;
                    220: 
                    221: #define AbsoluteTime_to_scalar(x)      \
                    222:                                                (*(abstime_scalar_t *)(x))
                    223: 
                    224: /* t1 < = > t2 */
                    225: #define CMP_ABSOLUTETIME(t1, t2)                               \
                    226:        (AbsoluteTime_to_scalar(t1) >                           \
                    227:                AbsoluteTime_to_scalar(t2)? (int)+1 :   \
                    228:         (AbsoluteTime_to_scalar(t1) <                          \
                    229:                AbsoluteTime_to_scalar(t2)? (int)-1 : 0))
                    230: 
                    231: /* t1 += t2 */
                    232: #define ADD_ABSOLUTETIME(t1, t2)                               \
                    233:        (AbsoluteTime_to_scalar(t1) +=                          \
                    234:                                AbsoluteTime_to_scalar(t2))
                    235: 
                    236: /* t1 -= t2 */
                    237: #define SUB_ABSOLUTETIME(t1, t2)                               \
                    238:        (AbsoluteTime_to_scalar(t1) -=                          \
                    239:                                AbsoluteTime_to_scalar(t2))
                    240: 
                    241: #define ADD_ABSOLUTETIME_TICKS(t1, ticks)              \
                    242:        (AbsoluteTime_to_scalar(t1) +=                          \
                    243:                                                (integer_t)(ticks))
                    244: 
                    245: extern void                            clock_get_timebase_info(
                    246:                                                        natural_t                       *delta,
                    247:                                                        natural_t                       *abs_to_ns_num,
                    248:                                                        natural_t                       *abs_to_ns_denom,
                    249:                                                        natural_t                       *proc_to_abs_num,
                    250:                                                        natural_t                       *proc_to_abs_denom);
                    251: 
                    252: extern void                            clock_get_uptime(
                    253:                                                        AbsoluteTime            *result);
                    254: 
                    255: extern void                            clock_interval_to_deadline(
                    256:                                                        natural_t                       interval,
                    257:                                                        natural_t                       scale_factor,
                    258:                                                        AbsoluteTime            *result);
                    259: 
                    260: extern void                            clock_interval_to_absolutetime_interval(
                    261:                                                        natural_t                       interval,
                    262:                                                        natural_t                       scale_factor,
                    263:                                                        AbsoluteTime            *result);
                    264: 
                    265: extern void                            clock_absolutetime_interval_to_deadline(
                    266:                                                        AbsoluteTime            abstime,
                    267:                                                        AbsoluteTime            *result);
                    268: 
                    269: extern void                            clock_deadline_for_periodic_event(
                    270:                                                        AbsoluteTime            interval,
                    271:                                                        AbsoluteTime            abstime,
                    272:                                                        AbsoluteTime            *deadline);
                    273: 
                    274: extern void                            clock_delay_for_interval(
                    275:                                                        natural_t                       interval,
                    276:                                                        natural_t                       scale_factor);
                    277: 
                    278: extern void                            clock_delay_until(
                    279:                                                        AbsoluteTime            deadline);
                    280: 
                    281: extern void                            absolutetime_to_nanoseconds(
                    282:                                                        AbsoluteTime            abstime,
                    283:                                                        UInt64                          *result);
                    284: 
                    285: extern void             nanoseconds_to_absolutetime(
                    286:                                                        UInt64                          nanoseconds,
                    287:                                                        AbsoluteTime            *result);
                    288: 
                    289: #endif /* _KERN_CLOCK_H_ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.