ADC Home > Reference Library > Reference > Darwin > Kernel Framework Reference
|
IOCommandGate |
Inherits from: | |
Declared In: |
Single-threaded work-loop client request mechanism.
An IOCommandGate instance is an extremely lightweight mechanism
that executes an action on the driver's work-loop. 'On the work-loop' is
actually a lie but the work-loop single threaded semantic is maintained for this
event source. Using the work-loop gate rather than execution by the workloop.
The command gate tests for a potential self dead lock by checking if the
runCommand request is made from the work-loop's thread, it doens't check for a
mutual dead lock though where a pair of work loop's dead lock each other.
The IOCommandGate is a lighter weight version of the IOCommandQueue and
should be used in preference. Generally use a command queue whenever you need a
client to submit a request to a work loop. A typical command gate action would
check if the hardware is active, if so it will add the request to a pending
queue internal to the device or the device's family. Otherwise if the hardware
is inactive then this request can be acted upon immediately.
CAUTION: The runAction and runCommand functions can not be called from an interrupt context.
Single thread a call to an action with the target work-loop.
Single thread a command with the target work-loop.
Not used, $link IOEventSource::checkForWork().
Factory method to create and initialise an IOCommandGate, See $link init.
Put a thread that is currently holding the command gate to sleep.
Wakeup one or more threads that are asleep on an event.
Disable the command gate
Enable command gate, this will unblock any blocked Commands and Actions.
Class initialiser.
Single thread a call to an action with the target work-loop.
Single thread a command with the target work-loop.
attemptAction |
Single thread a call to an action with the target work-loop.
public
virtual IOReturn attemptAction( Action action, void *arg0 = 0, void *arg1 = 0, void *arg2 = 0, void *arg3 = 0);
action
Pointer to function to be executed in work-loop context.
arg0
Parameter for action parameter, defaults to 0.
arg1
Parameter for action parameter, defaults to 0.
arg2
Parameter for action parameter, defaults to 0.
arg3
Parameter for action parameter, defaults to 0.
kIOReturnSuccess if successful. kIOReturnBadArgument if action is not defined, kIOReturnNotPermitted if this event source is currently disabled, kIOReturnCannotLock if lock attempt fails.
Client function that causes the given action to be called in a single threaded manner. Beware the work-loop's gate is recursive and command gates can cause direct or indirect re-entrancy. When the executing on a client's thread attemptCommand will fail if the work-loop's gate is open.
attemptCommand |
Single thread a command with the target work-loop.
public
virtual IOReturn attemptCommand( void *arg0 = 0, void *arg1 = 0, void *arg2 = 0, void *arg3 = 0);
arg0
Parameter for action of command gate, defaults to 0.
arg1
Parameter for action of command gate, defaults to 0.
arg2
Parameter for action of command gate, defaults to 0.
arg3
Parameter for action of command gate, defaults to 0.
kIOReturnSuccess if successful. kIOReturnNotPermitted if this event source is currently disabled, kIOReturnNoResources if no action available, kIOReturnCannotLock if lock attempt fails.
Client function that causes the current action to be called in a single threaded manner. Beware the work-loop's gate is recursive and command gates can cause direct or indirect re-entrancy. When the executing on a client's thread attemptCommand will fail if the work-loop's gate is open.
checkForWork |
Not used, $link IOEventSource::checkForWork().
protected
virtual bool checkForWork();
commandGate |
Factory method to create and initialise an IOCommandGate, See $link init.
public
static IOCommandGate *commandGate( OSObject *owner, Action action = 0);
Returns a pointer to the new command gate if sucessful, 0 otherwise.
commandSleep |
Put a thread that is currently holding the command gate to sleep.
public
virtual IOReturn commandSleep( void *event, UInt32 interruptible = THREAD_ABORTSAFE);
event
Pointer to an address.
interruptible
THREAD_UNINT, THREAD_INTERRUPTIBLE or THREAD_ABORTSAFE, defaults to THREAD_ABORTSAFE.
THREAD_AWAKENED - normal wakeup, THREAD_TIMED_OUT - timeout expired, THREAD_INTERRUPTED - interrupted by clear_wait, THREAD_RESTART - restart operation entirely, kIOReturnNotPermitted if the calling thread does not hold the command gate.
Put a thread to sleep waiting for an event but release the gate first. If the event occurs then the commandGate is closed before the returns.
commandWakeup |
Wakeup one or more threads that are asleep on an event.
public
virtual void commandWakeup( void *event, bool oneThread = false);
event
Pointer to an address.
onlyOneThread
true to only wake up at most one thread, false otherwise.
disable |
Disable the command gate
public
virtual void disable();
When a command gate is disabled all future calls to runAction and runCommand will stall until the gate is enable()d later. This can be used to block client threads when a system sleep is requested. The IOWorkLoop thread itself will never stall, even when making runAction/runCommand calls. This call must be made from a gated context, to clear potential race conditions.
enable |
Enable command gate, this will unblock any blocked Commands and Actions.
public
virtual void enable();
Enable the command gate. The attemptAction/attemptCommand calls will now be enabled and can succeeed. Stalled runCommand/runAction calls will be woken up.
init |
Class initialiser.
public
virtual bool init( OSObject *owner, Action action = 0);
owner
Owner of this, newly created, instance of the IOCommandGate. This argument will be used as the first parameter in the action callout.
action
Pointer to a C function that is called whenever a client of the IOCommandGate calls runCommand. NB Can be a C++ member function but caller must cast the member function to $link IOCommandGate::Action and they will get a compiler warning. Defaults to zero, see $link IOEventSource::setAction.
True if inherited classes initialise successfully.
Initialiser for IOCommandGate operates only on newly 'newed' objects. Shouldn't be used to re-init an existing instance.
runAction |
Single thread a call to an action with the target work-loop.
public
virtual IOReturn runAction( Action action, void *arg0 = 0, void *arg1 = 0, void *arg2 = 0, void *arg3 = 0);
action
Pointer to function to be executed in work-loop context.
arg0
Parameter for action parameter, defaults to 0.
arg1
Parameter for action parameter, defaults to 0.
arg2
Parameter for action parameter, defaults to 0.
arg3
Parameter for action parameter, defaults to 0.
kIOReturnSuccess if successful. kIOReturnBadArgument if action is not defined, kIOReturnNotPermitted if this event source is currently disabled.
Client function that causes the given action to be called in a single threaded manner. Beware the work-loop's gate is recursive and command gates can cause direct or indirect re-entrancy. When the executing on a client's thread runAction will sleep until the work-loop's gate opens for execution of client actions, the action is single threaded against all other work-loop event sources.
runCommand |
Single thread a command with the target work-loop.
public
virtual IOReturn runCommand( void *arg0 = 0, void *arg1 = 0, void *arg2 = 0, void *arg3 = 0);
arg0
Parameter for action of command gate, defaults to 0.
arg1
Parameter for action of command gate, defaults to 0.
arg2
Parameter for action of command gate, defaults to 0.
arg3
Parameter for action of command gate, defaults to 0.
kIOReturnSuccess if successful. kIOReturnNotPermitted if this event source is currently disabled, kIOReturnNoResources if no action available.
Client function that causes the current action to be called in a single threaded manner. Beware the work-loop's gate is recursive and command gates can cause direct or indirect re-entrancy. When the executing on a client's thread runCommand will sleep until the work-loop's gate opens for execution of client actions, the action is single threaded against all other work-loop event sources.
Action |
public
typedef IOReturn ( *Action)( OSObject *owner, void *arg0, void *arg1, void *arg2, void *arg3);
owner
Target of the function, can be used as a refcon. The owner is set during initialisation of the IOCommandGate instance. Note if a C++ function was specified this parameter is implicitly the first paramter in the target member function's parameter list.
arg0
Argument to action from run operation.
arg1
Argument to action from run operation.
arg2
Argument to action from run operation.
arg3
Argument to action from run operation.
Type and arguments of callout C function that is used when a runCommand is executed by a client. Cast to this type when you want a C++ member function to be used. Note the arg1 - arg3 parameters are straight pass through from the runCommand to the action callout.
ExpansionData |
protected
struct ExpansionData { };
This structure will be used to expand the capablilties of the IOWorkLoop in the future.
reserved |
protected
ExpansionData *reserved;
Reserved for future use. (Internal use only)
|
Last Updated: 2008-12-19