]> git.saurik.com Git - apple/xnu.git/blobdiff - iokit/Kernel/IOSharedDataQueue.cpp
xnu-7195.101.1.tar.gz
[apple/xnu.git] / iokit / Kernel / IOSharedDataQueue.cpp
index 797583bf8a79a92cca2c942b27940a1be675c1be..4443e5fa7a75e18fec60261db6932eb010c22ded 100644 (file)
  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 
+#define IOKIT_ENABLE_SHARED_PTR
+
 #include <IOKit/IOSharedDataQueue.h>
 #include <IOKit/IODataQueueShared.h>
 #include <IOKit/IOLib.h>
 #include <IOKit/IOMemoryDescriptor.h>
+#include <libkern/c++/OSSharedPtr.h>
 
 #ifdef enqueue
 #undef enqueue
 
 OSDefineMetaClassAndStructors(IOSharedDataQueue, IODataQueue)
 
-IOSharedDataQueue *IOSharedDataQueue::withCapacity(UInt32 size)
+OSSharedPtr<IOSharedDataQueue>
+IOSharedDataQueue::withCapacity(UInt32 size)
 {
-       IOSharedDataQueue *dataQueue = new IOSharedDataQueue;
+       OSSharedPtr<IOSharedDataQueue> dataQueue = OSMakeShared<IOSharedDataQueue>();
 
        if (dataQueue) {
                if (!dataQueue->initWithCapacity(size)) {
-                       dataQueue->release();
-                       dataQueue = 0;
+                       return nullptr;
                }
        }
 
        return dataQueue;
 }
 
-IOSharedDataQueue *
+OSSharedPtr<IOSharedDataQueue>
 IOSharedDataQueue::withEntries(UInt32 numEntries, UInt32 entrySize)
 {
-       IOSharedDataQueue *dataQueue = new IOSharedDataQueue;
+       OSSharedPtr<IOSharedDataQueue> dataQueue = OSMakeShared<IOSharedDataQueue>();
 
        if (dataQueue) {
                if (!dataQueue->initWithEntries(numEntries, entrySize)) {
-                       dataQueue->release();
-                       dataQueue = 0;
+                       return nullptr;
                }
        }
 
@@ -98,7 +100,7 @@ IOSharedDataQueue::initWithCapacity(UInt32 size)
        }
 
        dataQueue = (IODataQueueMemory *)IOMallocAligned(allocSize, PAGE_SIZE);
-       if (dataQueue == 0) {
+       if (dataQueue == NULL) {
                return false;
        }
        bzero(dataQueue, allocSize);
@@ -147,12 +149,12 @@ IOSharedDataQueue::free()
        super::free();
 }
 
-IOMemoryDescriptor *
+OSSharedPtr<IOMemoryDescriptor>
 IOSharedDataQueue::getMemoryDescriptor()
 {
-       IOMemoryDescriptor *descriptor = 0;
+       OSSharedPtr<IOMemoryDescriptor> descriptor;
 
-       if (dataQueue != 0) {
+       if (dataQueue != NULL) {
                descriptor = IOMemoryDescriptor::withAddress(dataQueue, getQueueSize() + DATA_QUEUE_MEMORY_HEADER_SIZE + DATA_QUEUE_MEMORY_APPENDIX_SIZE, kIODirectionOutIn);
        }
 
@@ -163,7 +165,7 @@ IOSharedDataQueue::getMemoryDescriptor()
 IODataQueueEntry *
 IOSharedDataQueue::peek()
 {
-       IODataQueueEntry *entry      = 0;
+       IODataQueueEntry *entry      = NULL;
        UInt32            headOffset;
        UInt32            tailOffset;
 
@@ -177,12 +179,12 @@ IOSharedDataQueue::peek()
        tailOffset = __c11_atomic_load((_Atomic UInt32 *)&dataQueue->tail, __ATOMIC_ACQUIRE);
 
        if (headOffset != tailOffset) {
-               volatile IODataQueueEntry * head = 0;
+               volatile IODataQueueEntry * head = NULL;
                UInt32              headSize     = 0;
                UInt32              headOffset   = dataQueue->head;
                UInt32              queueSize    = getQueueSize();
 
-               if (headOffset >= queueSize) {
+               if (headOffset > queueSize) {
                        return NULL;
                }
 
@@ -239,7 +241,7 @@ IOSharedDataQueue::enqueue(void * data, UInt32 dataSize)
                        entry = (IODataQueueEntry *)((UInt8 *)dataQueue->queue + tail);
 
                        entry->size = dataSize;
-                       memcpy(&entry->data, data, dataSize);
+                       __nochk_memcpy(&entry->data, data, dataSize);
 
                        // The tail can be out of bound when the size of the new entry
                        // exactly matches the available space at the end of the queue.
@@ -260,7 +262,7 @@ IOSharedDataQueue::enqueue(void * data, UInt32 dataSize)
                                ((IODataQueueEntry *)((UInt8 *)dataQueue->queue + tail))->size = dataSize;
                        }
 
-                       memcpy(&dataQueue->queue->data, data, dataSize);
+                       __nochk_memcpy(&dataQueue->queue->data, data, dataSize);
                        newTail = entrySize;
                } else {
                        return false; // queue is full
@@ -273,7 +275,7 @@ IOSharedDataQueue::enqueue(void * data, UInt32 dataSize)
                        entry = (IODataQueueEntry *)((UInt8 *)dataQueue->queue + tail);
 
                        entry->size = dataSize;
-                       memcpy(&entry->data, data, dataSize);
+                       __nochk_memcpy(&entry->data, data, dataSize);
                        newTail = tail + entrySize;
                } else {
                        return false; // queue is full
@@ -308,7 +310,7 @@ Boolean
 IOSharedDataQueue::dequeue(void *data, UInt32 *dataSize)
 {
        Boolean             retVal          = TRUE;
-       volatile IODataQueueEntry * entry   = 0;
+       volatile IODataQueueEntry *  entry  = NULL;
        UInt32              entrySize       = 0;
        UInt32              headOffset      = 0;
        UInt32              tailOffset      = 0;
@@ -324,7 +326,7 @@ IOSharedDataQueue::dequeue(void *data, UInt32 *dataSize)
        tailOffset = __c11_atomic_load((_Atomic UInt32 *)&dataQueue->tail, __ATOMIC_ACQUIRE);
 
        if (headOffset != tailOffset) {
-               volatile IODataQueueEntry * head = 0;
+               volatile IODataQueueEntry * head = NULL;
                UInt32              headSize     = 0;
                UInt32              queueSize    = getQueueSize();
 
@@ -372,7 +374,7 @@ IOSharedDataQueue::dequeue(void *data, UInt32 *dataSize)
                        // not enough space
                        return false;
                }
-               memcpy(data, (void *)entry->data, entrySize);
+               __nochk_memcpy(data, (void *)entry->data, entrySize);
                *dataSize = entrySize;
        }