]> git.saurik.com Git - apple/xnu.git/blame - iokit/IOKit/IOEventSource.h
xnu-3789.70.16.tar.gz
[apple/xnu.git] / iokit / IOKit / IOEventSource.h
CommitLineData
1c79356b 1/*
6d2010ae 2 * Copyright (c) 1998-2000, 2009 Apple Inc. All rights reserved.
1c79356b 3 *
2d21ac55 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
1c79356b 5 *
2d21ac55
A
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.
8f6c56a5 14 *
2d21ac55
A
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
8f6c56a5
A
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
2d21ac55
A
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.
8f6c56a5 25 *
2d21ac55 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
1c79356b
A
27 */
28/*
29Copyright (c) 1998 Apple Computer, Inc. All rights reserved.
30HISTORY
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
6d2010ae
A
47#if IOKITSTATS
48#include <IOKit/IOStatisticsPrivate.h>
49#endif
1c79356b
A
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
60event 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
63device to wake up and perform work. Two examples of event sources are the
64IOInterruptEventSource which delivers interrupt notifications and IOCommandGate
65which delivers command requests.
66<br><br>
67 A kernel module can always use the work-loop model for serialising access to
68anything at all. The IOEventSource is used for communicating events to the
69work-loop, and the chain of event sources should be used to walk the possible
70event sources and demultipex them. Note a particular instance of an event
71source may only be a member of 1 linked list chain. If you need to move it
72between chains than make sure it is removed from the original chain before
73attempting to move it.
74<br><br>
6d2010ae 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.
1c79356b 76<br><br>
6d2010ae 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.
1c79356b
A
78
79<br><br>
6d2010ae 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.
1c79356b
A
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*/
84class IOEventSource : public OSObject
85{
86 OSDeclareAbstractStructors(IOEventSource)
87 friend class IOWorkLoop;
6d2010ae
A
88#if IOKITSTATS
89 friend class IOStatistics;
90#endif
1c79356b
A
91
92public:
93/*!
94 @typedef Action
95 @discussion Placeholder type for C++ function overloading discrimination.
96As the all event sources require an action and it has to be stored somewhere
97and 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
100during initialisation. Note if a C++ function was specified this parameter
101is 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
109protected:
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 */
6d2010ae
A
134 struct ExpansionData {
135#if IOKITSTATS
136 struct IOEventSourceCounter *counter;
137#else
138 void *iokitstatsReserved;
139#endif
140 };
1c79356b
A
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
150of the action callout. Owner will generally be an OSObject it doesn't have to
151be as no member functions will be called directly in it. It can just be a
152refcon for a client routine.
153 @param action
154 Pointer to C call out function. Action is a pointer to a C function
155that gets called when this event source has outstanding work. It will usually
156be called by the checkForWork member function. The first parameter of the
157action call out will always be the owner, this allows C++ member functions to
158be used as actions. Defaults to 0.
159 @result true if the inherited classes and this instance initialise
160successfully.
161*/
162 virtual bool init(OSObject *owner, IOEventSource::Action action = 0);
163
3e170ce0 164 virtual void free( void ) APPLE_KEXT_OVERRIDE;
6d2010ae 165
1c79356b 166/*! @function checkForWork
6d2010ae 167 @abstract Virtual member function used by IOWorkLoop for work
1c79356b
A
168scheduling.
169 @discussion This function will be called to request a subclass to check
6d2010ae
A
170its internal state for any work to do and then to call out the owner/action.
171If this event source never performs any work (e.g. IOCommandGate), this
172method should not be overridden. NOTE: This method is no longer declared pure
173virtual. A default implementation is provided in IOEventSource.
1c79356b
A
174 @result Return true if this function needs to be called again before all its outstanding events have been processed.
175 */
6d2010ae 176 virtual bool checkForWork();
1c79356b
A
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
182IOWorkLoop 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
200protected:
201 // Methods to access the IOWorkLoop exported fields
b0d623f7
A
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);
1c79356b
A
209
210public:
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
224state when checkForWork is called. Calling this function will cause the
225work-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
231state 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
250private:
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 */