* 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
* 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,
* 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@
*/
*
*/
+#define IOKIT_ENABLE_SHARED_PTR
+
#include <IOKit/IOCommandPool.h>
+#include <libkern/c++/OSSharedPtr.h>
#define super OSObject
OSDefineMetaClassAndStructors(IOCommandPool, OSObject);
// withWorkLoop - primary initializer and factory method
//--------------------------------------------------------------------------
-IOCommandPool *IOCommandPool::
+OSSharedPtr<IOCommandPool>
+IOCommandPool::
withWorkLoop(IOWorkLoop *inWorkLoop)
{
- IOCommandPool * me = new IOCommandPool;
-
- if (me && !me->initWithWorkLoop(inWorkLoop)) {
- me->release();
- return 0;
- }
-
- return me;
+ OSSharedPtr<IOCommandPool> me = OSMakeShared<IOCommandPool>();
+
+ 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>
+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<IOCommandPool> me = OSMakeShared<IOCommandPool>();
+
+ 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);
}
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();
}
// waiting for resources
//--------------------------------------------------------------------------
-IOCommand *
+OSSharedPtr<IOCommand>
IOCommandPool::getCommand(bool blockForCommand)
{
- IOReturn result = kIOReturnSuccess;
- IOCommand *command = 0;
-
- result = fSerializer->runAction((IOCommandGate::Action)
- &IOCommandPool::gatedGetCommand,
- (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<IOCommand>(command, OSNoRetain);
+ } else {
+ return NULL;
+ }
}
// (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;
}
// returnCommand - Returns command to the pool.
//--------------------------------------------------------------------------
-void IOCommandPool::
+void
+IOCommandPool::
returnCommand(IOCommand *command)
{
- (void) fSerializer->runAction((IOCommandGate::Action)
- &IOCommandPool::gatedReturnCommand, (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(&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;
}