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