Annotation of XNU/iokit/IOKit/IOCommandGate.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1998-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:     1999-8-10  Godfrey van der Linden(gvdl)
        !            24:        Created.
        !            25: ]*/
        !            26: /*! @language embedded-c++ */
        !            27: 
        !            28: #ifndef _IOKIT_IOCOMMANDGATE_H
        !            29: #define _IOKIT_IOCOMMANDGATE_H
        !            30: 
        !            31: #include <IOKit/IOEventSource.h>
        !            32: 
        !            33: /*!
        !            34:     @class IOCommandGate : public IOEventSource
        !            35:     @abstract Single-threaded work-loop client request mechanism.
        !            36:     @discussion An IOCommandGate instance is an extremely light way mechanism
        !            37: that executes an action on the driver's work-loop.  'On the work-loop' is
        !            38: actually a lie but the work-loop single threaded semantic is maintained for this
        !            39: event source.  Using the work-loop gate rather than execution by the workloop.
        !            40: The command gate tests for a potential self dead lock by checking if the
        !            41: runCommand request is made from the work-loop's thread, it doens't check for a
        !            42: mutual dead lock though where a pair of work loop's dead lock each other.
        !            43: <br><br>
        !            44:        The IOCommandGate is a lighter weight version of the IOCommandQueue and
        !            45: should be used in preference.  Generally use a command queue whenever you need a
        !            46: client to submit a request to a work loop.  A typical command gate action would
        !            47: check if the hardware is active, if so it will add the request to a pending
        !            48: queue internal to the device or the device's family.  Otherwise if the hardware
        !            49: is inactive then this request can be acted upon immediately.
        !            50: <br><br>
        !            51:        CAUTION: The runAction and runCommand functions can not be called from an interrupt context.
        !            52: 
        !            53: */
        !            54: class IOCommandGate : public IOEventSource
        !            55: {
        !            56:     OSDeclareDefaultStructors(IOCommandGate)
        !            57: 
        !            58: public:
        !            59: /*!
        !            60:     @typedef Action
        !            61:     @discussion Type and arguments of callout C function that is used when
        !            62: a runCommand is executed by a client.  Cast to this type when you want a C++
        !            63: member function to be used.  Note the arg1 - arg3 parameters are straight pass
        !            64: through from the runCommand to the action callout.
        !            65:     @param owner
        !            66:        Target of the function, can be used as a refcon.  The owner is set
        !            67: during initialisation of the IOCommandGate instance.    Note if a C++ function
        !            68: was specified this parameter is implicitly the first paramter in the target
        !            69: member function's parameter list.
        !            70:     @param arg0 Argument to action from run operation.
        !            71:     @param arg1 Argument to action from run operation.
        !            72:     @param arg2 Argument to action from run operation.
        !            73:     @param arg3 Argument to action from run operation.
        !            74: */
        !            75:     typedef IOReturn (*Action)(OSObject *owner,
        !            76:                               void *arg0, void *arg1,
        !            77:                               void *arg2, void *arg3);
        !            78: 
        !            79: protected:
        !            80: /*!
        !            81:     @function checkForWork
        !            82:     @abstract Not used, $link IOEventSource::checkForWork(). */
        !            83:     virtual bool checkForWork();
        !            84: 
        !            85: public:
        !            86: /*! @function commandGate
        !            87:     @abstract Factory method to create and initialise an IOCommandGate, See $link init.
        !            88:     @result Returns a pointer to the new command gate if sucessful, 0 otherwise. */
        !            89:     static IOCommandGate *commandGate(OSObject *owner, Action action = 0);
        !            90: 
        !            91: /*! @function init
        !            92:     @abstract Class initialiser.
        !            93:     @discussion Initialiser for IOCommandGate operates only on newly 'newed'
        !            94: objects.  Shouldn't be used to re-init an existing instance.
        !            95:     @param owner       Owner of this, newly created, instance of the IOCommandGate.  This argument will be used as the first parameter in the action callout.
        !            96:     @param action
        !            97:        Pointer to a C function that is called whenever a client of the
        !            98: IOCommandGate calls runCommand.         NB Can be a C++ member function but caller
        !            99: must cast the member function to $link IOCommandGate::Action and they will get a
        !           100: compiler warning.  Defaults to zero, see $link IOEventSource::setAction.
        !           101:     @result True if inherited classes initialise successfully. */
        !           102:     virtual bool init(OSObject *owner, Action action = 0);
        !           103: 
        !           104: /*! @function runCommand
        !           105:     @abstract Single thread a command with the target work-loop.
        !           106:     @discussion Client function that causes the current action to be called in
        !           107: a single threaded manner.  Beware the work-loop's gate is recursive and command
        !           108: gates can cause direct or indirect re-entrancy.         When the executing on a
        !           109: client's thread runCommand will sleep until the work-loop's gate opens for
        !           110: execution of client actions, the action is single threaded against all other
        !           111: work-loop event sources.
        !           112:     @param arg0 Parameter for action of command gate, defaults to 0.
        !           113:     @param arg1 Parameter for action of command gate, defaults to 0.
        !           114:     @param arg2 Parameter for action of command gate, defaults to 0.
        !           115:     @param arg3 Parameter for action of command gate, defaults to 0.
        !           116:     @result kIOReturnSuccess if successful. kIOReturnNotPermitted if this
        !           117: event source is currently disabled, kIOReturnNoResources if no action available.
        !           118: */
        !           119:     virtual IOReturn runCommand(void *arg0 = 0, void *arg1 = 0,
        !           120:                                void *arg2 = 0, void *arg3 = 0);
        !           121: 
        !           122: /*! @function runAction
        !           123:     @abstract Single thread a call to an action with the target work-loop.
        !           124:     @discussion Client function that causes the given action to be called in
        !           125: a single threaded manner.  Beware the work-loop's gate is recursive and command
        !           126: gates can cause direct or indirect re-entrancy.         When the executing on a
        !           127: client's thread runCommand will sleep until the work-loop's gate opens for
        !           128: execution of client actions, the action is single threaded against all other
        !           129: work-loop event sources.
        !           130:     @param action Pointer to function to be executed in work-loop context.
        !           131:     @param arg0 Parameter for action of command gate, defaults to 0.
        !           132:     @param arg1 Parameter for action of command gate, defaults to 0.
        !           133:     @param arg2 Parameter for action of command gate, defaults to 0.
        !           134:     @param arg3 Parameter for action of command gate, defaults to 0.
        !           135:     @result kIOReturnSuccess if successful. kIOReturnBadArgument if action is not defined, kIOReturnNoResources if no action available.
        !           136: */
        !           137:     virtual IOReturn runAction(Action action,
        !           138:                               void *arg0 = 0, void *arg1 = 0,
        !           139:                               void *arg2 = 0, void *arg3 = 0);
        !           140: };
        !           141: 
        !           142: #endif /* !_IOKIT_IOCOMMANDGATE_H */

unix.superglobalmegacorp.com

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