IOHIDEventQueue.cpp [plain text]
#include <IOKit/IODataQueueShared.h>
#include "IOHIDEventQueue.h"
#define super IODataQueue
OSDefineMetaClassAndStructors( IOHIDEventQueue, IODataQueue )
IOHIDEventQueue * IOHIDEventQueue::withCapacity( UInt32 size )
{
IOHIDEventQueue * queue = new IOHIDEventQueue;
if ( queue && !queue->initWithCapacity(size) )
{
queue->release();
queue = 0;
}
queue->_started = false;
return queue;
}
IOHIDEventQueue * IOHIDEventQueue::withEntries( UInt32 numEntries,
UInt32 entrySize )
{
IOHIDEventQueue * queue = new IOHIDEventQueue;
if ( queue && !queue->initWithEntries(numEntries, entrySize) )
{
queue->release();
queue = 0;
}
queue->_started = false;
return queue;
}
Boolean IOHIDEventQueue::enqueue( void * data, UInt32 dataSize )
{
const UInt32 head = dataQueue->head;
const UInt32 tail = dataQueue->tail;
const UInt32 entrySize = dataSize + DATA_QUEUE_ENTRY_HEADER_SIZE;
IODataQueueEntry * entry;
if (!_started)
return true;
if ( tail >= head )
{
if ( (tail + entrySize) < dataQueue->queueSize )
{
entry = (IODataQueueEntry *)((char *)dataQueue->queue + tail);
entry->size = dataSize;
memcpy(&entry->data, data, dataSize);
dataQueue->tail += entrySize;
}
else if ( head > entrySize )
{
dataQueue->queue->size = dataSize;
((IODataQueueEntry *)((char *)dataQueue->queue + tail))->size = dataSize;
memcpy(&dataQueue->queue->data, data, dataSize);
dataQueue->tail = entrySize;
}
else
{
return false; }
}
else
{
if ( (head - tail) > entrySize )
{
entry = (IODataQueueEntry *)((char *)dataQueue->queue + tail);
entry->size = dataSize;
memcpy(&entry->data, data, dataSize);
dataQueue->tail += entrySize;
}
else
{
return false; }
}
if ( ( head == tail )
|| ( dataQueue->head == tail ) )
{
sendDataAvailableNotification();
}
return true;
}
OSMetaClassDefineReservedUnused(IOHIDEventQueue, 0);
OSMetaClassDefineReservedUnused(IOHIDEventQueue, 1);
OSMetaClassDefineReservedUnused(IOHIDEventQueue, 2);
OSMetaClassDefineReservedUnused(IOHIDEventQueue, 3);
OSMetaClassDefineReservedUnused(IOHIDEventQueue, 4);
OSMetaClassDefineReservedUnused(IOHIDEventQueue, 5);
OSMetaClassDefineReservedUnused(IOHIDEventQueue, 6);
OSMetaClassDefineReservedUnused(IOHIDEventQueue, 7);
OSMetaClassDefineReservedUnused(IOHIDEventQueue, 8);
OSMetaClassDefineReservedUnused(IOHIDEventQueue, 9);
OSMetaClassDefineReservedUnused(IOHIDEventQueue, 10);
OSMetaClassDefineReservedUnused(IOHIDEventQueue, 11);
OSMetaClassDefineReservedUnused(IOHIDEventQueue, 12);
OSMetaClassDefineReservedUnused(IOHIDEventQueue, 13);
OSMetaClassDefineReservedUnused(IOHIDEventQueue, 14);
OSMetaClassDefineReservedUnused(IOHIDEventQueue, 15);