Annotation of XNU/osfmk/kern/ipc_clock.c, 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/ipc_clock.c
                     27:  *     Purpose:        Routines to support ipc semantics of new kernel
                     28:  *                     alarm clock facility.
                     29:  */
                     30: 
                     31: #include <mach/message.h>
                     32: #include <kern/host.h>
                     33: #include <kern/processor.h>
                     34: #include <kern/task.h>
                     35: #include <kern/thread.h>
                     36: #include <kern/ipc_host.h>
                     37: #include <kern/ipc_kobject.h>
                     38: #include <kern/clock.h>
                     39: #include <kern/misc_protos.h>
                     40: #include <ipc/ipc_port.h>
                     41: #include <ipc/ipc_space.h>
                     42: 
                     43: /*
                     44:  *     Routine:        ipc_clock_init
                     45:  *     Purpose:
                     46:  *             Initialize ipc control of a clock.
                     47:  */
                     48: void
                     49: ipc_clock_init(
                     50:        clock_t         clock)
                     51: {
                     52:        ipc_port_t      port;
                     53: 
                     54:        port = ipc_port_alloc_kernel();
                     55:        if (port == IP_NULL)
                     56:                panic("ipc_clock_init");
                     57:        clock->cl_service = port;
                     58: 
                     59:        port = ipc_port_alloc_kernel();
                     60:        if (port == IP_NULL)
                     61:                panic("ipc_clock_init");
                     62:        clock->cl_control = port;
                     63: }
                     64: 
                     65: /*
                     66:  *     Routine:        ipc_clock_enable
                     67:  *     Purpose:
                     68:  *             Enable ipc access to a clock.
                     69:  */
                     70: void
                     71: ipc_clock_enable(
                     72:        clock_t         clock)
                     73: {
                     74:        ipc_kobject_set(clock->cl_service,
                     75:                        (ipc_kobject_t) clock, IKOT_CLOCK);
                     76:        ipc_kobject_set(clock->cl_control,
                     77:                        (ipc_kobject_t) clock, IKOT_CLOCK_CTRL);
                     78: }
                     79: 
                     80: /*
                     81:  *     Routine:        convert_port_to_clock
                     82:  *     Purpose:
                     83:  *             Convert from a port to a clock.
                     84:  *             Doesn't consume the port ref; produces a clock ref,
                     85:  *             which may be null.
                     86:  *     Conditions:
                     87:  *             Nothing locked.
                     88:  */
                     89: clock_t
                     90: convert_port_to_clock(
                     91:        ipc_port_t      port)
                     92: {
                     93:        clock_t         clock = CLOCK_NULL;
                     94: 
                     95:        if (IP_VALID(port)) {
                     96:                ip_lock(port);
                     97:                if (ip_active(port) &&
                     98:                    ((ip_kotype(port) == IKOT_CLOCK) ||
                     99:                     (ip_kotype(port) == IKOT_CLOCK_CTRL))) {
                    100:                        clock = (clock_t) port->ip_kobject;
                    101:                }
                    102:                ip_unlock(port);
                    103:        }
                    104:        return (clock);
                    105: }
                    106: 
                    107: /*
                    108:  *     Routine:        convert_port_to_clock_ctrl
                    109:  *     Purpose:
                    110:  *             Convert from a port to a clock.
                    111:  *             Doesn't consume the port ref; produces a clock ref,
                    112:  *             which may be null.
                    113:  *     Conditions:
                    114:  *             Nothing locked.
                    115:  */
                    116: clock_t
                    117: convert_port_to_clock_ctrl(
                    118:        ipc_port_t      port)
                    119: {
                    120:        clock_t         clock = CLOCK_NULL;
                    121: 
                    122:        if (IP_VALID(port)) {
                    123:                ip_lock(port);
                    124:                if (ip_active(port) &&
                    125:                    (ip_kotype(port) == IKOT_CLOCK_CTRL)) {
                    126:                        clock = (clock_t) port->ip_kobject;
                    127:                }
                    128:                ip_unlock(port);
                    129:        }
                    130:        return (clock);
                    131: }
                    132: 
                    133: /*
                    134:  *     Routine:        convert_clock_to_port
                    135:  *     Purpose:
                    136:  *             Convert from a clock to a port.
                    137:  *             Produces a naked send right which may be invalid.
                    138:  *     Conditions:
                    139:  *             Nothing locked.
                    140:  */
                    141: ipc_port_t
                    142: convert_clock_to_port(
                    143:        clock_t         clock)
                    144: {
                    145:        ipc_port_t      port;
                    146: 
                    147:        port = ipc_port_make_send(clock->cl_service);
                    148:        return (port);
                    149: }
                    150: 
                    151: /*
                    152:  *     Routine:        convert_clock_ctrl_to_port
                    153:  *     Purpose:
                    154:  *             Convert from a clock to a port.
                    155:  *             Produces a naked send right which may be invalid.
                    156:  *     Conditions:
                    157:  *             Nothing locked.
                    158:  */
                    159: ipc_port_t
                    160: convert_clock_ctrl_to_port(
                    161:        clock_t         clock)
                    162: {
                    163:        ipc_port_t      port;
                    164: 
                    165:        port = ipc_port_make_send(clock->cl_control);
                    166:        return (port);
                    167: }
                    168: 
                    169: /*
                    170:  *     Routine:        port_name_to_clock
                    171:  *     Purpose:
                    172:  *             Convert from a clock name to a clock pointer.
                    173:  */
                    174: clock_t
                    175: port_name_to_clock(
                    176:        mach_port_name_t clock_name)
                    177: {
                    178:        clock_t         clock = CLOCK_NULL;
                    179:        ipc_space_t     space;
                    180:        ipc_port_t      port;
                    181: 
                    182:        if (clock_name == 0)
                    183:                return (clock);
                    184:        space = current_space();
                    185:        if (ipc_port_translate_send(space, clock_name, &port) != KERN_SUCCESS)
                    186:                return (clock);
                    187:        if (ip_active(port) && (ip_kotype(port) == IKOT_CLOCK))
                    188:                clock = (clock_t) port->ip_kobject;
                    189:        ip_unlock(port);
                    190:        return (clock);
                    191: }

unix.superglobalmegacorp.com

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