Annotation of XNU/osfmk/kern/clock.h, revision 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.