The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/iokit/IOKit/IOEventSource.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright (c) 1998-2000, 2009 Apple Inc. All rights reserved.
    3  *
    4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
    5  * 
    6  * This file contains Original Code and/or Modifications of Original Code
    7  * as defined in and that are subject to the Apple Public Source License
    8  * Version 2.0 (the 'License'). You may not use this file except in
    9  * compliance with the License. The rights granted to you under the License
   10  * may not be used to create, or enable the creation or redistribution of,
   11  * unlawful or unlicensed copies of an Apple operating system, or to
   12  * circumvent, violate, or enable the circumvention or violation of, any
   13  * terms of an Apple operating system software license agreement.
   14  * 
   15  * Please obtain a copy of the License at
   16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
   17  * 
   18  * The Original Code and all software distributed under the License are
   19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
   20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
   21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
   22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
   23  * Please see the License for the specific language governing rights and
   24  * limitations under the License.
   25  * 
   26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
   27  */
   28 /*
   29 Copyright (c) 1998 Apple Computer, Inc.  All rights reserved.
   30 HISTORY
   31     1998-7-13   Godfrey van der Linden(gvdl)
   32         Created.
   33     1998-10-30  Godfrey van der Linden(gvdl)
   34         Converted to C++
   35 */
   36 #ifndef _IOKIT_IOEVENTSOURCE_H
   37 #define _IOKIT_IOEVENTSOURCE_H
   38 
   39 #include <sys/cdefs.h>
   40 
   41 #include <libkern/c++/OSObject.h>
   42 
   43 #include <IOKit/IOLib.h>
   44 #include <IOKit/system.h>
   45 #include <IOKit/IOWorkLoop.h>
   46 
   47 #if IOKITSTATS
   48 #include <IOKit/IOStatisticsPrivate.h>
   49 #endif
   50 
   51 __BEGIN_DECLS
   52 #include <mach/clock_types.h>
   53 #include <kern/clock.h>
   54 __END_DECLS
   55 
   56 /*!
   57     @class IOEventSource : public OSObject
   58     @abstract Abstract class for all work-loop event sources.
   59     @discussion The IOEventSource declares the abstract super class that all
   60 event sources must inherit from if an IOWorkLoop is to receive events from them.
   61 <br><br>
   62         An event source can represent any event that should cause the work-loop of a
   63 device to wake up and perform work.  Two examples of event sources are the
   64 IOInterruptEventSource which delivers interrupt notifications and IOCommandGate
   65 which delivers command requests.
   66 <br><br>
   67         A kernel module can always use the work-loop model for serialising access to
   68 anything at all.  The IOEventSource is used for communicating events to the
   69 work-loop, and the chain of event sources should be used to walk the possible
   70 event sources and demultipex them.  Note a particular instance of an event
   71 source may only be a member of 1 linked list chain.  If you need to move it
   72 between chains than make sure it is removed from the original chain before
   73 attempting to move it.
   74 <br><br>
   75         The IOEventSource makes no attempt to maintain the consistency of its internal data across multi-threading.  It is assumed that the user of these basic tools will protect the data that these objects represent in some sort of device wide instance lock.     For example the IOWorkLoop maintains the event chain by using an IOCommandGate and thus single threading access to its state.
   76 <br><br>
   77         All subclasses of IOEventSource that wish to perform work on the work-loop thread are expected to implement the checkForWork() member function. As of Mac OS X, 10.7 (Darwin 11), checkForWork is no longer pure virtual, and should not be overridden if there is no work to be done.
   78 
   79 <br><br>
   80         checkForWork() is the key method in this class.  It is called by some work-loop when convienient and is expected to evaluate its internal state and determine if an event has occurred since the last call.  In the case of an event having occurred then the instance defined target(owner)/action will be called.      The action is stored as an ordinary C function pointer but the first parameter is always the owner.  This means that a C++ member function can be used as an action function though this depends on the ABI.
   81 <br><br>
   82         Although the eventChainNext variable contains a reference to the next event source in the chain this reference is not retained.  The list 'owner' i.e. the client that creates the event, not the work-loop, is expected to retain the source.
   83 */
   84 class IOEventSource : public OSObject
   85 {
   86     OSDeclareAbstractStructors(IOEventSource)
   87     friend class IOWorkLoop;
   88 #if IOKITSTATS
   89     friend class IOStatistics;
   90 #endif
   91 
   92 public:
   93 /*!
   94     @typedef Action
   95     @discussion Placeholder type for C++ function overloading discrimination.
   96 As the all event sources require an action and it has to be stored somewhere
   97 and be of some type, this is that type.
   98     @param owner
   99         Target of the function, can be used as a refcon.  The owner is set
  100 during initialisation.   Note if a C++ function was specified this parameter
  101 is implicitly the first paramter in the target member function's parameter list.
  102 */
  103     typedef void (*Action)(OSObject *owner, ...);
  104 
  105 /*! @defined IOEventSourceAction
  106     @discussion Backward compatibilty define for the old non-class scoped type definition.  See $link IOEventSource::Action */
  107  #define IOEventSourceAction IOEventSource::Action
  108 
  109 protected:
  110 /*! @var eventChainNext
  111         The next event source in the event chain. nil at end of chain. */
  112     IOEventSource *eventChainNext;
  113 
  114 /*! @var owner The owner object called when an event has been delivered. */
  115     OSObject *owner;
  116 
  117 /*! @var action
  118         The action method called when an event has been delivered */
  119     Action action;
  120 
  121 /*! @var enabled
  122         Is this event source enabled to deliver requests to the work-loop. */
  123     bool enabled;
  124 
  125 /*! @var workLoop What is the work-loop for this event source. */
  126     IOWorkLoop *workLoop;
  127 
  128 /*! @var refcon What ever the client wants to do, see $link setRefcon. */
  129     void *refcon;
  130 
  131 /*! @struct ExpansionData
  132     @discussion This structure will be used to expand the capablilties of the IOEventSource in the future.
  133     */    
  134     struct ExpansionData {
  135 #if IOKITSTATS
  136             struct IOEventSourceCounter *counter;
  137 #else
  138             void *iokitstatsReserved;
  139 #endif
  140         };
  141 
  142 /*! @var reserved
  143     Reserved for future use.  (Internal use only)  */
  144     ExpansionData *reserved;
  145 
  146 /*! @function init
  147     @abstract Primary initialiser for the IOEventSource class.
  148     @param owner
  149         Owner of this instance of an event source.  Used as the first parameter
  150 of the action callout.  Owner will generally be an OSObject it doesn't have to
  151 be as no member functions will be called directly in it.  It can just be a
  152 refcon for a client routine.
  153     @param action
  154         Pointer to C call out function.  Action is a pointer to a C function
  155 that gets called when this event source has outstanding work.  It will usually
  156 be called by the checkForWork member function.  The first parameter of the
  157 action call out will always be the owner, this allows C++ member functions to
  158 be used as actions.  Defaults to 0.
  159     @result true if the inherited classes and this instance initialise
  160 successfully.
  161 */
  162     virtual bool init(OSObject *owner, IOEventSource::Action action = 0);
  163 
  164     virtual void free( void );
  165 
  166 /*! @function checkForWork
  167     @abstract Virtual member function used by IOWorkLoop for work
  168 scheduling.
  169     @discussion This function will be called to request a subclass to check
  170 its internal state for any work to do and then to call out the owner/action.
  171 If this event source never performs any work (e.g. IOCommandGate), this
  172 method should not be overridden. NOTE: This method is no longer declared pure
  173 virtual. A default implementation is provided in IOEventSource.
  174     @result Return true if this function needs to be called again before all its outstanding events have been processed.
  175         */
  176     virtual bool checkForWork();
  177 
  178 /*! @function setWorkLoop
  179     @abstract Set'ter for $link workLoop variable.
  180     @param workLoop
  181         Target work-loop of this event source instance.  A subclass of
  182 IOWorkLoop that at least reacts to signalWorkAvailable() and onThread functions. 
  183 */
  184     virtual void setWorkLoop(IOWorkLoop *workLoop);
  185 
  186 /*! @function setNext
  187     @abstract Set'ter for $link eventChainNext variable.
  188     @param next
  189         Pointer to another IOEventSource instance.
  190 */
  191     virtual void setNext(IOEventSource *next);
  192 
  193 /*! @function getNext
  194     @abstract Get'ter for $link eventChainNext variable.
  195     @result value of eventChainNext.
  196 */
  197     virtual IOEventSource *getNext() const;
  198 
  199 
  200 protected:
  201     // Methods to access the IOWorkLoop exported fields
  202     void signalWorkAvailable();
  203     void openGate();
  204     void closeGate();
  205     bool tryCloseGate();
  206     int sleepGate(void *event, UInt32 type);
  207         int sleepGate(void *event, AbsoluteTime deadline, UInt32 type);
  208     void wakeupGate(void *event, bool oneThread);
  209 
  210 public:
  211 /*! @function setAction
  212     @abstract Set'ter for $link action variable.
  213     @param action Pointer to a C function of type IOEventSource::Action. */
  214     virtual void setAction(IOEventSource::Action action);
  215 
  216 /*! @function getAction
  217     @abstract Get'ter for $link action variable.
  218     @result value of action. */
  219     virtual IOEventSource::Action getAction() const;
  220 
  221 /*! @function enable
  222     @abstract Enable event source.
  223     @discussion A subclass implementation is expected to respect the enabled
  224 state when checkForWork is called.  Calling this function will cause the
  225 work-loop to be signalled so that a checkForWork is performed. */
  226     virtual void enable();
  227 
  228 /*! @function disable
  229     @abstract Disable event source.
  230     @discussion A subclass implementation is expected to respect the enabled
  231 state when checkForWork is called. */
  232     virtual void disable();
  233 
  234 /*! @function isEnabled
  235     @abstract Get'ter for $link enable variable.
  236     @result true if enabled. */
  237     virtual bool isEnabled() const;
  238 
  239 /*! @function getWorkLoop
  240     @abstract Get'ter for $link workLoop variable.
  241     @result value of workLoop. */
  242     virtual IOWorkLoop *getWorkLoop() const;
  243 
  244 /*! @function onThread
  245     @abstract Convenience function for workLoop->onThread.
  246     @result true if called on the work-loop thread.
  247 */
  248     virtual bool onThread() const;
  249 
  250 private:
  251     OSMetaClassDeclareReservedUnused(IOEventSource, 0);
  252     OSMetaClassDeclareReservedUnused(IOEventSource, 1);
  253     OSMetaClassDeclareReservedUnused(IOEventSource, 2);
  254     OSMetaClassDeclareReservedUnused(IOEventSource, 3);
  255     OSMetaClassDeclareReservedUnused(IOEventSource, 4);
  256     OSMetaClassDeclareReservedUnused(IOEventSource, 5);
  257     OSMetaClassDeclareReservedUnused(IOEventSource, 6);
  258     OSMetaClassDeclareReservedUnused(IOEventSource, 7);
  259 };
  260 
  261 #endif /* !_IOKIT_IOEVENTSOURCE_H */

Cache object: 1a88a01606b33bf6360c8a57c68149a1


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.