* @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;
}
}
}
dataQueue = (IODataQueueMemory *)IOMallocAligned(allocSize, PAGE_SIZE);
- if (dataQueue == 0) {
+ if (dataQueue == NULL) {
return false;
}
bzero(dataQueue, allocSize);
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);
}
IODataQueueEntry *
IOSharedDataQueue::peek()
{
- IODataQueueEntry *entry = 0;
+ IODataQueueEntry *entry = NULL;
UInt32 headOffset;
UInt32 tailOffset;
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;
}
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.
((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
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
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;
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();
// not enough space
return false;
}
- memcpy(data, (void *)entry->data, entrySize);
+ __nochk_memcpy(data, (void *)entry->data, entrySize);
*dataSize = entrySize;
}