]> git.saurik.com Git - apple/xnu.git/blobdiff - iokit/IOKit/IOWorkLoop.h
xnu-2422.90.20.tar.gz
[apple/xnu.git] / iokit / IOKit / IOWorkLoop.h
index c278c9537930e7b067393b8b5a41c2144eefdb85..e248a9b3bd7cabf0fb78de278045c88f1c556d2f 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (c) 1998-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 1998-2009 Apple Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
  * 
  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
  * 
  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
-/*
-Copyright (c) 1998 Apple Computer, Inc.         All rights reserved.
-HISTORY
-    1998-7-13  Godfrey van der Linden(gvdl)
-       Created.
-    1998-10-30 Godfrey van der Linden(gvdl)
-       Converted to C++
-*/
 
 #ifndef __IOKIT_IOWORKLOOP_H
 #define __IOKIT_IOWORKLOOP_H
 
 #ifndef __IOKIT_IOWORKLOOP_H
 #define __IOKIT_IOWORKLOOP_H
@@ -44,6 +36,10 @@ HISTORY
 
 #include <IOKit/system.h>
 
 
 #include <IOKit/system.h>
 
+#if IOKITSTATS
+#include <IOKit/IOStatisticsPrivate.h>
+#endif
+
 class IOEventSource;
 class IOTimerEventSource;
 class IOCommandGate;
 class IOEventSource;
 class IOTimerEventSource;
 class IOCommandGate;
@@ -87,7 +83,14 @@ private:
     @abstract Static function that calls the threadMain function. 
 */
     static void threadMainContinuation(IOWorkLoop *self);
     @abstract Static function that calls the threadMain function. 
 */
     static void threadMainContinuation(IOWorkLoop *self);
-
+       
+/*! @function eventSourcePerformsWork
+       @abstract Checks if the event source passed in overrides checkForWork() to perform any work.
+IOWorkLoop uses this to determine if the event source should be polled in runEventSources() or not.
+       @param inEventSource The event source to check.
+*/
+       bool eventSourcePerformsWork(IOEventSource *inEventSource);
+       
 protected:
 
 /*! @typedef maintCommandEnum
 protected:
 
 /*! @typedef maintCommandEnum
@@ -138,6 +141,15 @@ protected:
 */    
     struct ExpansionData {
        IOOptionBits options;
 */    
     struct ExpansionData {
        IOOptionBits options;
+       IOEventSource *passiveEventChain;
+#if DEBUG
+       void * allocationBacktrace[16];
+#endif /* DEBUG */
+#if IOKITSTATS
+       struct IOWorkLoopCounter *counter;
+#else
+       void *iokitstatsReserved;
+#endif
     };
 
 /*! @var reserved
     };
 
 /*! @var reserved
@@ -237,13 +249,13 @@ public:
 
 /*! @function enableAllInterrupts
     @abstract Calls enable() in all interrupt event sources.
 
 /*! @function enableAllInterrupts
     @abstract Calls enable() in all interrupt event sources.
-    @discussion For all event sources (ES) for which IODynamicCast(IOInterruptEventSource, ES) is valid, in eventChain call enable() function.  See IOEventSource::enable().
+    @discussion For all event sources (ES) for which OSDynamicCast(IOInterruptEventSource, ES) is valid, in eventChain call enable() function.  See IOEventSource::enable().
 */
     virtual void enableAllInterrupts() const;
 
 /*! @function disableAllInterrupts
     @abstract Calls disable() in all interrupt event sources.
 */
     virtual void enableAllInterrupts() const;
 
 /*! @function disableAllInterrupts
     @abstract Calls disable() in all interrupt event sources.
-    @discussion For all event sources (ES) for which IODynamicCast(IOInterruptEventSource, ES) is valid,  in eventChain call disable() function.  See IOEventSource::disable().
+    @discussion For all event sources (ES) for which OSDynamicCast(IOInterruptEventSource, ES) is valid,  in eventChain call disable() function.  See IOEventSource::disable().
 */
     virtual void disableAllInterrupts() const;
 
 */
     virtual void disableAllInterrupts() const;
 
@@ -252,6 +264,9 @@ protected:
     // Internal APIs used by event sources to control the thread
     friend class IOEventSource;
     friend class IOTimerEventSource;
     // Internal APIs used by event sources to control the thread
     friend class IOEventSource;
     friend class IOTimerEventSource;
+#if IOKITSTATS
+    friend class IOStatistics;
+#endif
     virtual void signalWorkAvailable();
     virtual void openGate();
     virtual void closeGate();
     virtual void signalWorkAvailable();
     virtual void openGate();
     virtual void closeGate();
@@ -272,7 +287,6 @@ public:
     @param arg3 Parameter for action parameter, defaults to 0.
     @result Returns the value of the Action callout.
 */
     @param arg3 Parameter for action parameter, defaults to 0.
     @result Returns the value of the Action callout.
 */
-    OSMetaClassDeclareReservedUsed(IOWorkLoop, 0);
     virtual IOReturn runAction(Action action, OSObject *target,
                               void *arg0 = 0, void *arg1 = 0,
                               void *arg2 = 0, void *arg3 = 0);
     virtual IOReturn runAction(Action action, OSObject *target,
                               void *arg0 = 0, void *arg1 = 0,
                               void *arg2 = 0, void *arg3 = 0);
@@ -296,12 +310,22 @@ public:
 
     @result Return false if the work loop is shutting down, true otherwise.
 */
 
     @result Return false if the work loop is shutting down, true otherwise.
 */
-    OSMetaClassDeclareReservedUsed(IOWorkLoop, 1);
     virtual bool runEventSources();
 
 protected:
     virtual bool runEventSources();
 
 protected:
+    // Internal APIs used by event sources to control the thread
+    virtual int sleepGate(void *event, AbsoluteTime deadline, UInt32 interuptibleType);
 
 
+protected:
+#if __LP64__
+    OSMetaClassDeclareReservedUnused(IOWorkLoop, 0);
+    OSMetaClassDeclareReservedUnused(IOWorkLoop, 1);
     OSMetaClassDeclareReservedUnused(IOWorkLoop, 2);
     OSMetaClassDeclareReservedUnused(IOWorkLoop, 2);
+#else
+    OSMetaClassDeclareReservedUsed(IOWorkLoop, 0);
+    OSMetaClassDeclareReservedUsed(IOWorkLoop, 1);
+    OSMetaClassDeclareReservedUsed(IOWorkLoop, 2);
+#endif
     OSMetaClassDeclareReservedUnused(IOWorkLoop, 3);
     OSMetaClassDeclareReservedUnused(IOWorkLoop, 4);
     OSMetaClassDeclareReservedUnused(IOWorkLoop, 5);
     OSMetaClassDeclareReservedUnused(IOWorkLoop, 3);
     OSMetaClassDeclareReservedUnused(IOWorkLoop, 4);
     OSMetaClassDeclareReservedUnused(IOWorkLoop, 5);