1*c54f35caSApple OSS Distributions /* 2*c54f35caSApple OSS Distributions * Copyright (c) 1998-2019 Apple Inc. All rights reserved. 3*c54f35caSApple OSS Distributions * 4*c54f35caSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5*c54f35caSApple OSS Distributions * 6*c54f35caSApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code 7*c54f35caSApple OSS Distributions * as defined in and that are subject to the Apple Public Source License 8*c54f35caSApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in 9*c54f35caSApple OSS Distributions * compliance with the License. The rights granted to you under the License 10*c54f35caSApple OSS Distributions * may not be used to create, or enable the creation or redistribution of, 11*c54f35caSApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to 12*c54f35caSApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any 13*c54f35caSApple OSS Distributions * terms of an Apple operating system software license agreement. 14*c54f35caSApple OSS Distributions * 15*c54f35caSApple OSS Distributions * Please obtain a copy of the License at 16*c54f35caSApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file. 17*c54f35caSApple OSS Distributions * 18*c54f35caSApple OSS Distributions * The Original Code and all software distributed under the License are 19*c54f35caSApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20*c54f35caSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21*c54f35caSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22*c54f35caSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23*c54f35caSApple OSS Distributions * Please see the License for the specific language governing rights and 24*c54f35caSApple OSS Distributions * limitations under the License. 25*c54f35caSApple OSS Distributions * 26*c54f35caSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27*c54f35caSApple OSS Distributions */ 28*c54f35caSApple OSS Distributions /* 29*c54f35caSApple OSS Distributions * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. 30*c54f35caSApple OSS Distributions * 31*c54f35caSApple OSS Distributions * IOTimerEventSource.h 32*c54f35caSApple OSS Distributions * 33*c54f35caSApple OSS Distributions * HISTORY 34*c54f35caSApple OSS Distributions * 2-Feb-1999 Joe Liu (jliu) created. 35*c54f35caSApple OSS Distributions * 36*c54f35caSApple OSS Distributions */ 37*c54f35caSApple OSS Distributions 38*c54f35caSApple OSS Distributions #ifndef _IOTIMEREVENTSOURCE 39*c54f35caSApple OSS Distributions #define _IOTIMEREVENTSOURCE 40*c54f35caSApple OSS Distributions 41*c54f35caSApple OSS Distributions #include <sys/cdefs.h> 42*c54f35caSApple OSS Distributions 43*c54f35caSApple OSS Distributions __BEGIN_DECLS 44*c54f35caSApple OSS Distributions #include <kern/clock.h> 45*c54f35caSApple OSS Distributions __END_DECLS 46*c54f35caSApple OSS Distributions 47*c54f35caSApple OSS Distributions #include <libkern/c++/OSPtr.h> 48*c54f35caSApple OSS Distributions #include <IOKit/IOEventSource.h> 49*c54f35caSApple OSS Distributions #include <IOKit/IOTypes.h> 50*c54f35caSApple OSS Distributions 51*c54f35caSApple OSS Distributions /*! 52*c54f35caSApple OSS Distributions * @enum IOTimerEventSource constructor options 53*c54f35caSApple OSS Distributions * @abstract Constants defining behavior of the IOTimerEventSource. 54*c54f35caSApple OSS Distributions * @constant kIOTimerEventSourceOptionsPriorityHigh Importance above everything but realtime. 55*c54f35caSApple OSS Distributions * Thread calls allocated with this priority execute at extremely high priority, 56*c54f35caSApple OSS Distributions * above everything but realtime threads. They are generally executed in serial. 57*c54f35caSApple OSS Distributions * Though they may execute concurrently under some circumstances, no fan-out is implied. 58*c54f35caSApple OSS Distributions * These work items should do very small amounts of work or risk disrupting system 59*c54f35caSApple OSS Distributions * responsiveness. 60*c54f35caSApple OSS Distributions * @constant kIOTimerEventSourceOptionsPriorityKernelHigh Importance higher than most kernel 61*c54f35caSApple OSS Distributions * threads. 62*c54f35caSApple OSS Distributions * @constant kIOTimerEventSourceOptionsPriorityKernel Importance similar to that of normal kernel 63*c54f35caSApple OSS Distributions * threads. 64*c54f35caSApple OSS Distributions * @constant kIOTimerEventSourceOptionsPriorityUser Importance similar to that of normal user threads. 65*c54f35caSApple OSS Distributions * @constant kIOTimerEventSourceOptionsPriorityLow Very low importance. 66*c54f35caSApple OSS Distributions * @constant kIOTimerEventSourceOptionsPriorityWorkLoop Run the callout on the thread of the IOWorkLoop 67*c54f35caSApple OSS Distributions * the event source has been added to. 68*c54f35caSApple OSS Distributions * @constant kIOTimerEventSourceOptionsAllowReenter Allow the callout to be rescheduled and potentially 69*c54f35caSApple OSS Distributions * re-entered, if the IOWorkLoop lock has been released (eg. with commandSleep) during its invocation. 70*c54f35caSApple OSS Distributions * @constant kIOTimerEventSourceOptionsDefault Recommended default options. 71*c54f35caSApple OSS Distributions */ 72*c54f35caSApple OSS Distributions enum{ 73*c54f35caSApple OSS Distributions kIOTimerEventSourceOptionsPriorityMask = 0x000000ff, 74*c54f35caSApple OSS Distributions kIOTimerEventSourceOptionsPriorityHigh = 0x00000000, 75*c54f35caSApple OSS Distributions kIOTimerEventSourceOptionsPriorityKernelHigh = 0x00000001, 76*c54f35caSApple OSS Distributions kIOTimerEventSourceOptionsPriorityKernel = 0x00000002, 77*c54f35caSApple OSS Distributions kIOTimerEventSourceOptionsPriorityUser = 0x00000003, 78*c54f35caSApple OSS Distributions kIOTimerEventSourceOptionsPriorityLow = 0x00000004, 79*c54f35caSApple OSS Distributions kIOTimerEventSourceOptionsPriorityWorkLoop = 0x000000ff, 80*c54f35caSApple OSS Distributions 81*c54f35caSApple OSS Distributions kIOTimerEventSourceOptionsAllowReenter = 0x00000100, 82*c54f35caSApple OSS Distributions 83*c54f35caSApple OSS Distributions kIOTimerEventSourceOptionsDefault = kIOTimerEventSourceOptionsPriorityKernelHigh 84*c54f35caSApple OSS Distributions }; 85*c54f35caSApple OSS Distributions 86*c54f35caSApple OSS Distributions #define IOTIMEREVENTSOURCEOPTIONS_DEFINED 1 87*c54f35caSApple OSS Distributions 88*c54f35caSApple OSS Distributions /*! 89*c54f35caSApple OSS Distributions * @enum IOTimerEventSource setTimeout/wakeAtTime options 90*c54f35caSApple OSS Distributions * @abstract Constants defining behavior of a scheduled call from IOTimerEventSource. 91*c54f35caSApple OSS Distributions * @constant kIOTimeOptionsWithLeeway Use the leeway parameter to the call. 92*c54f35caSApple OSS Distributions * @constant kIOTimeOptionsContinuous Use mach_continuous_time() to generate the callback. 93*c54f35caSApple OSS Distributions */ 94*c54f35caSApple OSS Distributions enum{ 95*c54f35caSApple OSS Distributions kIOTimeOptionsWithLeeway = 0x00000020, 96*c54f35caSApple OSS Distributions kIOTimeOptionsContinuous = 0x00000100, 97*c54f35caSApple OSS Distributions }; 98*c54f35caSApple OSS Distributions 99*c54f35caSApple OSS Distributions /*! 100*c54f35caSApple OSS Distributions * @class IOTimerEventSource : public IOEventSource 101*c54f35caSApple OSS Distributions * @abstract Time based event source mechanism. 102*c54f35caSApple OSS Distributions * @discussion An event source that implements a simple timer. A timeout handler is called once the timeout period expires. This timeout handler will be called by the work-loop that this event source is attached to. 103*c54f35caSApple OSS Distributions * <br><br> 104*c54f35caSApple OSS Distributions * Usually a timer event source will be used to implement a timeout. In general when a driver makes a request it will need to setup a call to keep track of when the I/O doesn't complete. This class is designed to make that somewhat easier. 105*c54f35caSApple OSS Distributions * <br><br> 106*c54f35caSApple OSS Distributions * Remember the system doesn't guarantee the accuracy of the callout. It is possible that a higher priority thread is running which will delay the execution of the action routine. In fact the thread will be made runable at the exact requested time, within the accuracy of the CPU's decrementer based interrupt, but the scheduler will then control execution. 107*c54f35caSApple OSS Distributions */ 108*c54f35caSApple OSS Distributions 109*c54f35caSApple OSS Distributions class IOTimerEventSource : public IOEventSource 110*c54f35caSApple OSS Distributions { 111*c54f35caSApple OSS Distributions OSDeclareDefaultStructors(IOTimerEventSource); 112*c54f35caSApple OSS Distributions 113*c54f35caSApple OSS Distributions protected: 114*c54f35caSApple OSS Distributions /*! @var calloutEntry thread_call entry for preregistered thread callouts */ 115*c54f35caSApple OSS Distributions void *calloutEntry; 116*c54f35caSApple OSS Distributions 117*c54f35caSApple OSS Distributions /*! @var abstime time to wake up next, see enable. */ 118*c54f35caSApple OSS Distributions AbsoluteTime abstime; 119*c54f35caSApple OSS Distributions 120*c54f35caSApple OSS Distributions /*! @struct ExpansionData 121*c54f35caSApple OSS Distributions * @discussion This structure is private to the IOTimerEventSource implementation. 122*c54f35caSApple OSS Distributions */ 123*c54f35caSApple OSS Distributions struct ExpansionData { 124*c54f35caSApple OSS Distributions SInt32 calloutGeneration; 125*c54f35caSApple OSS Distributions SInt32 calloutGenerationSignaled; 126*c54f35caSApple OSS Distributions IOWorkLoop * workLoop; 127*c54f35caSApple OSS Distributions }; 128*c54f35caSApple OSS Distributions 129*c54f35caSApple OSS Distributions /*! @var reserved 130*c54f35caSApple OSS Distributions * Reserved for future use. (Internal use only) */ 131*c54f35caSApple OSS Distributions APPLE_KEXT_WSHADOW_PUSH; 132*c54f35caSApple OSS Distributions ExpansionData *reserved; 133*c54f35caSApple OSS Distributions APPLE_KEXT_WSHADOW_POP; 134*c54f35caSApple OSS Distributions 135*c54f35caSApple OSS Distributions /*! @function timeout 136*c54f35caSApple OSS Distributions * @abstract Function that routes the call from the OS' timeout mechanism into a work-loop context. 137*c54f35caSApple OSS Distributions * @discussion timeout will normally not be called nor overridden by a subclass. If the event source is enabled then close the work-loop's gate and call the action routine. 138*c54f35caSApple OSS Distributions * @param self This argument will be cast to an IOTimerEventSource. */ 139*c54f35caSApple OSS Distributions static void timeout(void *self); 140*c54f35caSApple OSS Distributions 141*c54f35caSApple OSS Distributions /*! @function setTimeoutFunc 142*c54f35caSApple OSS Distributions * @abstract Set's timeout as the function of calloutEntry. 143*c54f35caSApple OSS Distributions * @discussion IOTimerEventSource is based upon the kern/thread_call.h APIs currently. This function allocates the calloutEntry member variable by using thread_call_allocate(timeout, this). If you need to write your own subclass of IOTimerEventSource you probably should override this method to allocate an entry that points to your own timeout routine. */ 144*c54f35caSApple OSS Distributions virtual void setTimeoutFunc(); 145*c54f35caSApple OSS Distributions 146*c54f35caSApple OSS Distributions /*! @function free 147*c54f35caSApple OSS Distributions * @abstract Sub-class implementation of free method, frees calloutEntry */ 148*c54f35caSApple OSS Distributions virtual void free() APPLE_KEXT_OVERRIDE; 149*c54f35caSApple OSS Distributions 150*c54f35caSApple OSS Distributions virtual void setWorkLoop(IOWorkLoop *workLoop) APPLE_KEXT_OVERRIDE; 151*c54f35caSApple OSS Distributions 152*c54f35caSApple OSS Distributions public: 153*c54f35caSApple OSS Distributions 154*c54f35caSApple OSS Distributions /*! @typedef Action 155*c54f35caSApple OSS Distributions * @discussion 'C' Function pointer defining the callout routine of this event source. 156*c54f35caSApple OSS Distributions * @param owner Owning target object. Note by a startling coincidence the first parameter in a C callout is currently used to define the target of a C++ member function. 157*c54f35caSApple OSS Distributions * @param sender The object that timed out. */ 158*c54f35caSApple OSS Distributions typedef void (*Action)(OSObject *owner, IOTimerEventSource *sender); 159*c54f35caSApple OSS Distributions 160*c54f35caSApple OSS Distributions #ifdef __BLOCKS__ 161*c54f35caSApple OSS Distributions typedef void (^ActionBlock)(IOTimerEventSource *sender); 162*c54f35caSApple OSS Distributions #endif /* __BLOCKS__ */ 163*c54f35caSApple OSS Distributions 164*c54f35caSApple OSS Distributions static OSPtr<IOTimerEventSource> 165*c54f35caSApple OSS Distributions timerEventSource(OSObject *owner, Action action = NULL); 166*c54f35caSApple OSS Distributions 167*c54f35caSApple OSS Distributions /*! @function timerEventSource 168*c54f35caSApple OSS Distributions * @abstract Allocates and returns an initialized timer instance. 169*c54f35caSApple OSS Distributions * @param options Mask of kIOTimerEventSourceOptions* options. 170*c54f35caSApple OSS Distributions * @param owner The object that that will be passed to the Action callback. 171*c54f35caSApple OSS Distributions * @param action 'C' Function pointer for the callout routine of this event source. 172*c54f35caSApple OSS Distributions */ 173*c54f35caSApple OSS Distributions static OSPtr<IOTimerEventSource> 174*c54f35caSApple OSS Distributions timerEventSource(uint32_t options, OSObject *owner, Action action = NULL); 175*c54f35caSApple OSS Distributions 176*c54f35caSApple OSS Distributions #ifdef __BLOCKS__ 177*c54f35caSApple OSS Distributions /*! @function timerEventSource 178*c54f35caSApple OSS Distributions * @abstract Allocates and returns an initialized timer instance. 179*c54f35caSApple OSS Distributions * @param options Mask of kIOTimerEventSourceOptions* options. 180*c54f35caSApple OSS Distributions * @param inOwner The object that that will be passed to the Action callback. 181*c54f35caSApple OSS Distributions * @param action Block for the callout routine of this event source. 182*c54f35caSApple OSS Distributions */ 183*c54f35caSApple OSS Distributions static OSPtr<IOTimerEventSource> 184*c54f35caSApple OSS Distributions timerEventSource(uint32_t options, OSObject *inOwner, ActionBlock action); 185*c54f35caSApple OSS Distributions #endif /* __BLOCKS__ */ 186*c54f35caSApple OSS Distributions 187*c54f35caSApple OSS Distributions #if XNU_KERNEL_PRIVATE 188*c54f35caSApple OSS Distributions __inline__ void invokeAction(IOEventSource::Action action, IOTimerEventSource * ts, 189*c54f35caSApple OSS Distributions OSObject * owner, IOWorkLoop * workLoop); 190*c54f35caSApple OSS Distributions #endif /* XNU_KERNEL_PRIVATE */ 191*c54f35caSApple OSS Distributions 192*c54f35caSApple OSS Distributions /*! @function init 193*c54f35caSApple OSS Distributions * @abstract Initializes the timer with an owner, and a handler to call when the timeout expires. 194*c54f35caSApple OSS Distributions */ 195*c54f35caSApple OSS Distributions virtual bool init(OSObject *owner, Action action = NULL); 196*c54f35caSApple OSS Distributions 197*c54f35caSApple OSS Distributions /*! @function enable 198*c54f35caSApple OSS Distributions * @abstract Enables a call to the action. 199*c54f35caSApple OSS Distributions * @discussion Allows the action function to be called. If the timer event source was disabled while a call was outstanding and the call wasn't cancelled then it will be rescheduled. So a disable/enable pair will disable calls from this event source. */ 200*c54f35caSApple OSS Distributions virtual void enable() APPLE_KEXT_OVERRIDE; 201*c54f35caSApple OSS Distributions 202*c54f35caSApple OSS Distributions /*! @function disable 203*c54f35caSApple OSS Distributions * @abstract Disable a timed callout. 204*c54f35caSApple OSS Distributions * @discussion When disable returns the action will not be called until the next time enable(qv) is called. */ 205*c54f35caSApple OSS Distributions virtual void disable() APPLE_KEXT_OVERRIDE; 206*c54f35caSApple OSS Distributions 207*c54f35caSApple OSS Distributions /*! @function checkForWork 208*c54f35caSApple OSS Distributions * @abstract Pure Virtual member function used by IOWorkLoop for issuing a client calls. 209*c54f35caSApple OSS Distributions * @discussion This function called when the work-loop is ready to check for any work to do and then to call out the owner/action. 210*c54f35caSApple OSS Distributions * @result Return true if this function needs to be called again before all its outstanding events have been processed. */ 211*c54f35caSApple OSS Distributions virtual bool checkForWork() APPLE_KEXT_OVERRIDE; 212*c54f35caSApple OSS Distributions 213*c54f35caSApple OSS Distributions /*! @function setTimeoutTicks 214*c54f35caSApple OSS Distributions * @abstract Setup a callback at after the delay in scheduler ticks. See wakeAtTime(AbsoluteTime). 215*c54f35caSApple OSS Distributions * @param ticks Delay from now to wake up, in scheduler ticks, whatever that may be. 216*c54f35caSApple OSS Distributions * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ 217*c54f35caSApple OSS Distributions virtual IOReturn setTimeoutTicks(UInt32 ticks); 218*c54f35caSApple OSS Distributions 219*c54f35caSApple OSS Distributions /*! @function setTimeoutMS 220*c54f35caSApple OSS Distributions * @abstract Setup a callback at after the delay in milliseconds. See wakeAtTime(AbsoluteTime). 221*c54f35caSApple OSS Distributions * @param ms Delay from now to wake up, time in milliseconds. 222*c54f35caSApple OSS Distributions * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ 223*c54f35caSApple OSS Distributions virtual IOReturn setTimeoutMS(UInt32 ms); 224*c54f35caSApple OSS Distributions 225*c54f35caSApple OSS Distributions /*! @function setTimeoutUS 226*c54f35caSApple OSS Distributions * @abstract Setup a callback at after the delay in microseconds. See wakeAtTime(AbsoluteTime). 227*c54f35caSApple OSS Distributions * @param us Delay from now to wake up, time in microseconds. 228*c54f35caSApple OSS Distributions * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ 229*c54f35caSApple OSS Distributions virtual IOReturn setTimeoutUS(UInt32 us); 230*c54f35caSApple OSS Distributions 231*c54f35caSApple OSS Distributions /*! @function setTimeout 232*c54f35caSApple OSS Distributions * @abstract Setup a callback at after the delay in some unit. See wakeAtTime(AbsoluteTime). 233*c54f35caSApple OSS Distributions * @param interval Delay from now to wake up in some defined unit. 234*c54f35caSApple OSS Distributions * @param scale_factor Define the unit of interval, default to nanoseconds. 235*c54f35caSApple OSS Distributions * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ 236*c54f35caSApple OSS Distributions virtual IOReturn setTimeout(UInt32 interval, 237*c54f35caSApple OSS Distributions UInt32 scale_factor = kNanosecondScale); 238*c54f35caSApple OSS Distributions 239*c54f35caSApple OSS Distributions #if !defined(__LP64__) 240*c54f35caSApple OSS Distributions virtual IOReturn setTimeout(mach_timespec_t interval) 241*c54f35caSApple OSS Distributions APPLE_KEXT_DEPRECATED; 242*c54f35caSApple OSS Distributions #endif 243*c54f35caSApple OSS Distributions 244*c54f35caSApple OSS Distributions /*! @function setTimeout 245*c54f35caSApple OSS Distributions * @abstract Setup a callback at after the delay in decrementer ticks. See wakeAtTime(AbsoluteTime). 246*c54f35caSApple OSS Distributions * @param interval Delay from now to wake up in decrementer ticks. 247*c54f35caSApple OSS Distributions * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ 248*c54f35caSApple OSS Distributions virtual IOReturn setTimeout(AbsoluteTime interval); 249*c54f35caSApple OSS Distributions 250*c54f35caSApple OSS Distributions /*! @function wakeAtTimeTicks 251*c54f35caSApple OSS Distributions * @abstract Setup a callback at this absolute time. See wakeAtTime(AbsoluteTime). 252*c54f35caSApple OSS Distributions * @param ticks Time to wake up in scheduler quantums, whatever that is? 253*c54f35caSApple OSS Distributions * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ 254*c54f35caSApple OSS Distributions virtual IOReturn wakeAtTimeTicks(UInt32 ticks); 255*c54f35caSApple OSS Distributions 256*c54f35caSApple OSS Distributions /*! @function wakeAtTimeMS 257*c54f35caSApple OSS Distributions * @abstract Setup a callback at this absolute time. See wakeAtTime(AbsoluteTime). 258*c54f35caSApple OSS Distributions * @param ms Time to wake up in milliseconds. 259*c54f35caSApple OSS Distributions * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ 260*c54f35caSApple OSS Distributions virtual IOReturn wakeAtTimeMS(UInt32 ms); 261*c54f35caSApple OSS Distributions 262*c54f35caSApple OSS Distributions /*! @function wakeAtTimeUS 263*c54f35caSApple OSS Distributions * @abstract Setup a callback at this absolute time. See wakeAtTime(AbsoluteTime). 264*c54f35caSApple OSS Distributions * @param us Time to wake up in microseconds. 265*c54f35caSApple OSS Distributions * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ 266*c54f35caSApple OSS Distributions virtual IOReturn wakeAtTimeUS(UInt32 us); 267*c54f35caSApple OSS Distributions 268*c54f35caSApple OSS Distributions /*! @function wakeAtTime 269*c54f35caSApple OSS Distributions * @abstract Setup a callback at this absolute time. See wakeAtTime(AbsoluteTime). 270*c54f35caSApple OSS Distributions * @param abstime Time to wake up in some unit. 271*c54f35caSApple OSS Distributions * @param scale_factor Define the unit of abstime, default to nanoseconds. 272*c54f35caSApple OSS Distributions * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ 273*c54f35caSApple OSS Distributions virtual IOReturn wakeAtTime(UInt32 abstime, 274*c54f35caSApple OSS Distributions UInt32 scale_factor = kNanosecondScale); 275*c54f35caSApple OSS Distributions 276*c54f35caSApple OSS Distributions #if !defined(__LP64__) 277*c54f35caSApple OSS Distributions virtual IOReturn wakeAtTime(mach_timespec_t abstime) 278*c54f35caSApple OSS Distributions APPLE_KEXT_DEPRECATED; 279*c54f35caSApple OSS Distributions #endif 280*c54f35caSApple OSS Distributions 281*c54f35caSApple OSS Distributions /*! @function wakeAtTime 282*c54f35caSApple OSS Distributions * @abstract Setup a callback at this absolute time. 283*c54f35caSApple OSS Distributions * @discussion Starts the timer, which will expire at abstime. After it expires, the timer will call the 'action' registered in the init() function. This timer is not periodic, a further call is needed to reset and restart the timer after it expires. 284*c54f35caSApple OSS Distributions * @param abstime Absolute Time when to wake up, counted in 'decrementer' units and starts at zero when system boots. 285*c54f35caSApple OSS Distributions * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared by init or IOEventSource::setAction (qqv). */ 286*c54f35caSApple OSS Distributions virtual IOReturn wakeAtTime(AbsoluteTime abstime); 287*c54f35caSApple OSS Distributions 288*c54f35caSApple OSS Distributions /*! @function cancelTimeout 289*c54f35caSApple OSS Distributions * @abstract Disable any outstanding calls to this event source. 290*c54f35caSApple OSS Distributions * @discussion Clear down any oustanding calls. By the time this function completes it is guaranteed that the action will not be called again. */ 291*c54f35caSApple OSS Distributions virtual void cancelTimeout(); 292*c54f35caSApple OSS Distributions 293*c54f35caSApple OSS Distributions /*! @function init 294*c54f35caSApple OSS Distributions * @abstract Initializes the timer with an owner, and a handler to call when the timeout expires. 295*c54f35caSApple OSS Distributions */ 296*c54f35caSApple OSS Distributions virtual bool init(uint32_t options, OSObject *inOwner, Action inAction); 297*c54f35caSApple OSS Distributions 298*c54f35caSApple OSS Distributions /*! @function setTimeout 299*c54f35caSApple OSS Distributions * @abstract Setup a callback at after the delay in decrementer ticks. See wakeAtTime(AbsoluteTime). 300*c54f35caSApple OSS Distributions * @param options see kIOTimeOptionsWithLeeway and kIOTimeOptionsContinuous 301*c54f35caSApple OSS Distributions * @param interval Delay from now to wake up in decrementer ticks. 302*c54f35caSApple OSS Distributions * @param leeway Allowable leeway to wake time, if the kIOTimeOptionsWithLeeway option is set 303*c54f35caSApple OSS Distributions * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared. */ 304*c54f35caSApple OSS Distributions virtual IOReturn setTimeout(uint32_t options, AbsoluteTime interval, AbsoluteTime leeway); 305*c54f35caSApple OSS Distributions 306*c54f35caSApple OSS Distributions /*! @function wakeAtTime 307*c54f35caSApple OSS Distributions * @abstract Setup a callback at this absolute time. 308*c54f35caSApple OSS Distributions * @discussion Starts the timer, which will expire at abstime. After it expires, the timer will call the 'action' registered in the init() function. This timer is not periodic, a further call is needed to reset and restart the timer after it expires. 309*c54f35caSApple OSS Distributions * @param options see kIOTimeOptionsWithLeeway and kIOTimeOptionsContinuous 310*c54f35caSApple OSS Distributions * @param abstime Absolute Time when to wake up, counted in 'decrementer' units and starts at zero when system boots. 311*c54f35caSApple OSS Distributions * @param leeway Allowable leeway to wake time, if the kIOTimeOptionsWithLeeway option is set 312*c54f35caSApple OSS Distributions * @result kIOReturnSuccess if everything is fine, kIOReturnNoResources if action hasn't been declared by init or IOEventSource::setAction (qqv). */ 313*c54f35caSApple OSS Distributions virtual IOReturn wakeAtTime(uint32_t options, AbsoluteTime abstime, AbsoluteTime leeway); 314*c54f35caSApple OSS Distributions 315*c54f35caSApple OSS Distributions private: 316*c54f35caSApple OSS Distributions static void timeoutAndRelease(void *self, void *c); 317*c54f35caSApple OSS Distributions static void timeoutSignaled(void *self, void *c); 318*c54f35caSApple OSS Distributions 319*c54f35caSApple OSS Distributions private: 320*c54f35caSApple OSS Distributions OSMetaClassDeclareReservedUsedX86(IOTimerEventSource, 0); 321*c54f35caSApple OSS Distributions OSMetaClassDeclareReservedUsedX86(IOTimerEventSource, 1); 322*c54f35caSApple OSS Distributions OSMetaClassDeclareReservedUsedX86(IOTimerEventSource, 2); 323*c54f35caSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOTimerEventSource, 3); 324*c54f35caSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOTimerEventSource, 4); 325*c54f35caSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOTimerEventSource, 5); 326*c54f35caSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOTimerEventSource, 6); 327*c54f35caSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOTimerEventSource, 7); 328*c54f35caSApple OSS Distributions }; 329*c54f35caSApple OSS Distributions 330*c54f35caSApple OSS Distributions #endif /* !_IOTIMEREVENTSOURCE */ 331