]> git.saurik.com Git - apple/xnu.git/blobdiff - iokit/Kernel/IOCommandPool.cpp
xnu-7195.101.1.tar.gz
[apple/xnu.git] / iokit / Kernel / IOCommandPool.cpp
index 345b2b04ccdc8611ca9447147efdf61c532831a5..0dcb24e0f0522e51fa819853498f33ba83bfd092 100644 (file)
@@ -1,23 +1,29 @@
 /*
  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
  *
- * @APPLE_LICENSE_HEADER_START@
- * 
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License").  You may not use this file except in compliance with the
- * License.  Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
- * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * @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
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * 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,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
- * 
- * @APPLE_LICENSE_HEADER_END@
+ * 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);
@@ -48,62 +57,67 @@ OSMetaClassDefineReservedUnused(IOCommandPool, 7);
 //     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);
 }
 
 
@@ -114,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();
 }
 
 
@@ -135,20 +149,21 @@ IOCommandPool::free(void)
 //                     waiting for resources
 //--------------------------------------------------------------------------
 
-IOCommand *
+OSSharedPtr<IOCommand>
 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<IOCommand>(command, OSNoRetain);
+       } else {
+               return NULL;
+       }
 }
 
 
@@ -157,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;
 }
 
 
@@ -178,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(&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;
 }