X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/89b3af67bb32e691275bf6fa803d1834b2284115..HEAD:/iokit/Kernel/IOCommandPool.cpp diff --git a/iokit/Kernel/IOCommandPool.cpp b/iokit/Kernel/IOCommandPool.cpp index 2a3b6e71b..0dcb24e0f 100644 --- a/iokit/Kernel/IOCommandPool.cpp +++ b/iokit/Kernel/IOCommandPool.cpp @@ -2,7 +2,7 @@ * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * + * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in @@ -11,10 +11,10 @@ * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. - * + * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. - * + * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, @@ -22,7 +22,7 @@ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. - * + * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ @@ -37,7 +37,10 @@ * */ +#define IOKIT_ENABLE_SHARED_PTR + #include +#include #define super OSObject OSDefineMetaClassAndStructors(IOCommandPool, OSObject); @@ -54,62 +57,67 @@ OSMetaClassDefineReservedUnused(IOCommandPool, 7); // withWorkLoop - primary initializer and factory method //-------------------------------------------------------------------------- -IOCommandPool *IOCommandPool:: +OSSharedPtr +IOCommandPool:: withWorkLoop(IOWorkLoop *inWorkLoop) { - IOCommandPool * me = new IOCommandPool; - - if (me && !me->initWithWorkLoop(inWorkLoop)) { - me->release(); - return 0; - } - - return me; + OSSharedPtr me = OSMakeShared(); + + if (me && !me->initWithWorkLoop(inWorkLoop)) { + return nullptr; + } + + return me; } -bool IOCommandPool:: +bool +IOCommandPool:: initWithWorkLoop(IOWorkLoop *inWorkLoop) { - assert(inWorkLoop); - - if (!super::init()) - return false; - - queue_init(&fQueueHead); - - fSerializer = IOCommandGate::commandGate(this); - assert(fSerializer); - if (!fSerializer) - return false; - - if (kIOReturnSuccess != inWorkLoop->addEventSource(fSerializer)) - return false; - - return true; + assert(inWorkLoop); + + if (!super::init()) { + return false; + } + + queue_init(&fQueueHead); + + fSerializer = IOCommandGate::commandGate(this); + assert(fSerializer); + if (!fSerializer) { + return false; + } + + if (kIOReturnSuccess != inWorkLoop->addEventSource(fSerializer.get())) { + return false; + } + + return true; } //-------------------------------------------------------------------------- // commandPool & init - obsolete initializer and factory method //-------------------------------------------------------------------------- -IOCommandPool *IOCommandPool:: +OSSharedPtr +IOCommandPool:: commandPool(IOService * inOwner, IOWorkLoop *inWorkLoop, UInt32 inSize) { - IOCommandPool * me = new IOCommandPool; - - if (me && !me->init(inOwner, inWorkLoop, inSize)) { - me->release(); - return 0; - } - - return me; + OSSharedPtr me = OSMakeShared(); + + if (me && !me->init(inOwner, inWorkLoop, inSize)) { + return nullptr; + } + + return me; } -bool IOCommandPool:: +bool +IOCommandPool:: init(IOService */* inOwner */, IOWorkLoop *inWorkLoop, UInt32 /* inSize */) { - return initWithWorkLoop(inWorkLoop); + return initWithWorkLoop(inWorkLoop); } @@ -120,18 +128,18 @@ init(IOService */* inOwner */, IOWorkLoop *inWorkLoop, UInt32 /* inSize */) void IOCommandPool::free(void) { - if (fSerializer) { - // remove our event source from owner's workloop - IOWorkLoop *wl = fSerializer->getWorkLoop(); - if (wl) - wl->removeEventSource(fSerializer); - - fSerializer->release(); - fSerializer = 0; - } - - // Tell our superclass to cleanup too - super::free(); + if (fSerializer) { + // remove our event source from owner's workloop + IOWorkLoop *wl = fSerializer->getWorkLoop(); + if (wl) { + wl->removeEventSource(fSerializer.get()); + } + + fSerializer.reset(); + } + + // Tell our superclass to cleanup too + super::free(); } @@ -141,20 +149,21 @@ IOCommandPool::free(void) // waiting for resources //-------------------------------------------------------------------------- -IOCommand * +OSSharedPtr IOCommandPool::getCommand(bool blockForCommand) { - IOReturn result = kIOReturnSuccess; - IOCommand *command = 0; - - IOCommandGate::Action func = OSMemberFunctionCast( - IOCommandGate::Action, this, &IOCommandPool::gatedGetCommand); - result = fSerializer-> - runAction(func, (void *) &command, (void *) blockForCommand); - if (kIOReturnSuccess == result) - return command; - else - return 0; + IOReturn result = kIOReturnSuccess; + IOCommand *command = NULL; + + IOCommandGate::Action func = OSMemberFunctionCast( + IOCommandGate::Action, this, &IOCommandPool::gatedGetCommand); + result = fSerializer-> + runAction(func, (void *) &command, (void *) blockForCommand); + if (kIOReturnSuccess == result) { + return OSSharedPtr(command, OSNoRetain); + } else { + return NULL; + } } @@ -163,20 +172,22 @@ IOCommandPool::getCommand(bool blockForCommand) // (on safe side of command gate) //-------------------------------------------------------------------------- -IOReturn IOCommandPool:: +IOReturn +IOCommandPool:: gatedGetCommand(IOCommand **command, bool blockForCommand) { - while (queue_empty(&fQueueHead)) { - if (!blockForCommand) - return kIOReturnNoResources; - - fSleepers++; - fSerializer->commandSleep(&fSleepers, THREAD_UNINT); - } - - queue_remove_first(&fQueueHead, - *command, IOCommand *, fCommandChain); - return kIOReturnSuccess; + while (queue_empty(&fQueueHead)) { + if (!blockForCommand) { + return kIOReturnNoResources; + } + + fSleepers++; + fSerializer->commandSleep(&fSleepers, THREAD_UNINT); + } + + queue_remove_first(&fQueueHead, + *command, IOCommand *, fCommandChain); + return kIOReturnSuccess; } @@ -184,27 +195,29 @@ gatedGetCommand(IOCommand **command, bool blockForCommand) // returnCommand - Returns command to the pool. //-------------------------------------------------------------------------- -void IOCommandPool:: +void +IOCommandPool:: returnCommand(IOCommand *command) { - IOCommandGate::Action func = OSMemberFunctionCast( - IOCommandGate::Action, this, &IOCommandPool::gatedReturnCommand); - (void) fSerializer->runAction(func, (void *) command); + IOCommandGate::Action func = OSMemberFunctionCast( + IOCommandGate::Action, this, &IOCommandPool::gatedReturnCommand); + (void) fSerializer->runAction(func, (void *) command); } //-------------------------------------------------------------------------- // gatedReturnCommand - Callthrough function -// (on safe side of command gate) +// (on safe side of command gate) //-------------------------------------------------------------------------- -IOReturn IOCommandPool:: +IOReturn +IOCommandPool:: gatedReturnCommand(IOCommand *command) { - queue_enter_first(&fQueueHead, command, IOCommand *, fCommandChain); - if (fSleepers) { - fSerializer->commandWakeup(&fSleepers, /* oneThread */ true); - fSleepers--; - } - return kIOReturnSuccess; + queue_enter_first(&fQueueHead, command, IOCommand *, fCommandChain); + if (fSleepers) { + fSerializer->commandWakeup(&fSleepers, /* oneThread */ true); + fSleepers--; + } + return kIOReturnSuccess; }