]>
git.saurik.com Git - apple/xnu.git/blob - iokit/Kernel/IOCommandPool.cpp
   2  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. 
   4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 
   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. 
  15  * Please obtain a copy of the License at 
  16  * http://www.opensource.apple.com/apsl/ and read it before using this file. 
  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 
  20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  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. 
  26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 
  31  *      Copyright (c) 2000 Apple Computer, Inc.  All rights reserved. 
  35  *      2001-01-17      gvdl    Re-implement on IOCommandGate::commandSleep 
  36  *      10/9/2000       CJS     Created IOCommandPool class and implementation 
  40 #include <IOKit/IOCommandPool.h> 
  42 #define super OSObject 
  43 OSDefineMetaClassAndStructors(IOCommandPool
, OSObject
); 
  44 OSMetaClassDefineReservedUnused(IOCommandPool
, 0); 
  45 OSMetaClassDefineReservedUnused(IOCommandPool
, 1); 
  46 OSMetaClassDefineReservedUnused(IOCommandPool
, 2); 
  47 OSMetaClassDefineReservedUnused(IOCommandPool
, 3); 
  48 OSMetaClassDefineReservedUnused(IOCommandPool
, 4); 
  49 OSMetaClassDefineReservedUnused(IOCommandPool
, 5); 
  50 OSMetaClassDefineReservedUnused(IOCommandPool
, 6); 
  51 OSMetaClassDefineReservedUnused(IOCommandPool
, 7); 
  53 //-------------------------------------------------------------------------- 
  54 //      withWorkLoop -  primary initializer and factory method 
  55 //-------------------------------------------------------------------------- 
  59 withWorkLoop(IOWorkLoop 
*inWorkLoop
) 
  61         IOCommandPool 
* me 
= new IOCommandPool
; 
  63         if (me 
&& !me
->initWithWorkLoop(inWorkLoop
)) { 
  74 initWithWorkLoop(IOWorkLoop 
*inWorkLoop
) 
  82         queue_init(&fQueueHead
); 
  84         fSerializer 
= IOCommandGate::commandGate(this); 
  90         if (kIOReturnSuccess 
!= inWorkLoop
->addEventSource(fSerializer
)) { 
  97 //-------------------------------------------------------------------------- 
  98 //      commandPool & init -    obsolete initializer and factory method 
  99 //-------------------------------------------------------------------------- 
 103 commandPool(IOService 
* inOwner
, IOWorkLoop 
*inWorkLoop
, UInt32 inSize
) 
 105         IOCommandPool 
* me 
= new IOCommandPool
; 
 107         if (me 
&& !me
->init(inOwner
, inWorkLoop
, inSize
)) { 
 117 init(IOService */
* inOwner */
, IOWorkLoop 
*inWorkLoop
, UInt32 
/* inSize */) 
 119         return initWithWorkLoop(inWorkLoop
); 
 123 //-------------------------------------------------------------------------- 
 124 //      free -  free all allocated resources 
 125 //-------------------------------------------------------------------------- 
 128 IOCommandPool::free(void) 
 131                 // remove our event source from owner's workloop 
 132                 IOWorkLoop 
*wl 
= fSerializer
->getWorkLoop(); 
 134                         wl
->removeEventSource(fSerializer
); 
 137                 fSerializer
->release(); 
 141         // Tell our superclass to cleanup too 
 146 //-------------------------------------------------------------------------- 
 147 //      getCommand -    Gets a command from the pool. Pass true in 
 148 //                      blockForCommand if you want your thread to sleep 
 149 //                      waiting for resources 
 150 //-------------------------------------------------------------------------- 
 153 IOCommandPool::getCommand(bool blockForCommand
) 
 155         IOReturn     result  
= kIOReturnSuccess
; 
 156         IOCommand 
*command 
= NULL
; 
 158         IOCommandGate::Action func 
= OSMemberFunctionCast( 
 159                 IOCommandGate::Action
, this, &IOCommandPool::gatedGetCommand
); 
 160         result 
= fSerializer
-> 
 161             runAction(func
, (void *) &command
, (void *) blockForCommand
); 
 162         if (kIOReturnSuccess 
== result
) { 
 170 //-------------------------------------------------------------------------- 
 171 //      gatedGetCommand -       Static callthrough function 
 172 //                              (on safe side of command gate) 
 173 //-------------------------------------------------------------------------- 
 177 gatedGetCommand(IOCommand 
**command
, bool blockForCommand
) 
 179         while (queue_empty(&fQueueHead
)) { 
 180                 if (!blockForCommand
) { 
 181                         return kIOReturnNoResources
; 
 185                 fSerializer
->commandSleep(&fSleepers
, THREAD_UNINT
); 
 188         queue_remove_first(&fQueueHead
, 
 189             *command
, IOCommand 
*, fCommandChain
); 
 190         return kIOReturnSuccess
; 
 194 //-------------------------------------------------------------------------- 
 195 //      returnCommand -         Returns command to the pool. 
 196 //-------------------------------------------------------------------------- 
 200 returnCommand(IOCommand 
*command
) 
 202         IOCommandGate::Action func 
= OSMemberFunctionCast( 
 203                 IOCommandGate::Action
, this, &IOCommandPool::gatedReturnCommand
); 
 204         (void) fSerializer
->runAction(func
, (void *) command
); 
 208 //-------------------------------------------------------------------------- 
 209 //      gatedReturnCommand -    Callthrough function 
 210 //                              (on safe side of command gate) 
 211 //-------------------------------------------------------------------------- 
 215 gatedReturnCommand(IOCommand 
*command
) 
 217         queue_enter_first(&fQueueHead
, command
, IOCommand 
*, fCommandChain
); 
 219                 fSerializer
->commandWakeup(&fSleepers
, /* oneThread */ true); 
 222         return kIOReturnSuccess
;