AppleRAIDEventSource.cpp [plain text]
#include "AppleRAID.h"
#undef super
#define super IOEventSource
OSDefineMetaClassAndStructors(AppleRAIDEventSource, IOEventSource);
AppleRAIDEventSource *AppleRAIDEventSource::withAppleRAIDSet(AppleRAIDSet *appleRAID, Action action)
{
AppleRAIDEventSource *eventSource = new AppleRAIDEventSource;
if (eventSource != 0) {
if (!eventSource->initWithAppleRAIDSet(appleRAID, action)) {
eventSource->release();
eventSource = 0;
}
}
return eventSource;
}
bool AppleRAIDEventSource::initWithAppleRAIDSet(AppleRAIDSet *appleRAID, Action action)
{
if (!super::init(appleRAID, (IOEventSource::Action)action)) return false;
queue_init(&fCompletedHead);
return true;
}
void AppleRAIDEventSource::memberCompleteRequest(AppleRAIDMemoryDescriptor *memoryDescriptor,
IOReturn status, UInt64 actualByteCount)
{
UInt32 memberIndex = memoryDescriptor->mdMemberIndex;
AppleRAIDStorageRequest *storageRequest = memoryDescriptor->mdStorageRequest;
closeGate();
storageRequest->srCompletedCount++;
storageRequest->srMemberStatus[memberIndex] = status;
storageRequest->srMemberByteCounts[memberIndex] = actualByteCount;
if (storageRequest->srCompletedCount == storageRequest->srMemberCount) {
queue_enter(&fCompletedHead, storageRequest, AppleRAIDStorageRequest *, fCommandChain);
signalWorkAvailable();
}
openGate();
}
bool AppleRAIDEventSource::checkForWork(void)
{
AppleRAIDSet *appleRAID = (AppleRAIDSet *)owner;
AppleRAIDStorageRequest *storageRequest;
if (!queue_empty(&fCompletedHead)) {
queue_remove_first(&fCompletedHead, storageRequest, AppleRAIDStorageRequest *, fCommandChain);
(*(Action)action)(appleRAID, storageRequest);
}
return !queue_empty(&fCompletedHead);
}
IOStorageCompletionAction AppleRAIDEventSource::getStorageCompletionAction(void)
{
return OSMemberFunctionCast(IOStorageCompletionAction, this, &AppleRAIDEventSource::memberCompleteRequest);
}