IOFilterInterruptEventSource.cpp [plain text]
#include <IOKit/IOFilterInterruptEventSource.h>
#include <IOKit/IOService.h>
#include <IOKit/IOTimeStamp.h>
#include <IOKit/IOWorkLoop.h>
#if KDEBUG
#define IOTimeTypeStampS(t) \
do { \
IOTimeStampStart(IODBG_INTES(t), \
(unsigned int) this, (unsigned int) owner); \
} while(0)
#define IOTimeTypeStampE(t) \
do { \
IOTimeStampEnd(IODBG_INTES(t), \
(unsigned int) this, (unsigned int) owner); \
} while(0)
#define IOTimeStampLatency() \
do { \
IOTimeStampEnd(IODBG_INTES(IOINTES_LAT), \
(unsigned int) this, (unsigned int) owner); \
} while(0)
#else
#define IOTimeTypeStampS(t)
#define IOTimeTypeStampE(t)
#define IOTimeStampLatency()
#endif
#define super IOInterruptEventSource
OSDefineMetaClassAndStructors
(IOFilterInterruptEventSource, IOInterruptEventSource)
OSMetaClassDefineReservedUnused(IOFilterInterruptEventSource, 0);
OSMetaClassDefineReservedUnused(IOFilterInterruptEventSource, 1);
OSMetaClassDefineReservedUnused(IOFilterInterruptEventSource, 2);
OSMetaClassDefineReservedUnused(IOFilterInterruptEventSource, 3);
OSMetaClassDefineReservedUnused(IOFilterInterruptEventSource, 4);
OSMetaClassDefineReservedUnused(IOFilterInterruptEventSource, 5);
OSMetaClassDefineReservedUnused(IOFilterInterruptEventSource, 6);
OSMetaClassDefineReservedUnused(IOFilterInterruptEventSource, 7);
bool IOFilterInterruptEventSource::init(OSObject *inOwner,
Action inAction,
IOService *inProvider,
int inIntIndex)
{
return false;
}
IOInterruptEventSource *
IOFilterInterruptEventSource::interruptEventSource(OSObject *inOwner,
Action inAction,
IOService *inProvider,
int inIntIndex)
{
return 0;
}
bool
IOFilterInterruptEventSource::init(OSObject *inOwner,
Action inAction,
Filter inFilterAction,
IOService *inProvider,
int inIntIndex)
{
if ( !super::init(inOwner, inAction, inProvider, inIntIndex) )
return false;
if (!inFilterAction)
return false;
filterAction = inFilterAction;
return true;
}
IOFilterInterruptEventSource *IOFilterInterruptEventSource
::filterInterruptEventSource(OSObject *inOwner,
Action inAction,
Filter inFilterAction,
IOService *inProvider,
int inIntIndex)
{
IOFilterInterruptEventSource *me = new IOFilterInterruptEventSource;
if (me
&& !me->init(inOwner, inAction, inFilterAction, inProvider, inIntIndex)) {
me->release();
return 0;
}
return me;
}
void IOFilterInterruptEventSource::signalInterrupt()
{
IOTimeStampLatency();
producerCount++;
IOTimeTypeStampS(IOINTES_SEMA);
signalWorkAvailable();
IOTimeTypeStampE(IOINTES_SEMA);
}
IOFilterInterruptEventSource::Filter
IOFilterInterruptEventSource::getFilterAction() const
{
return filterAction;
}
void IOFilterInterruptEventSource::normalInterruptOccurred
(void *, IOService *, int )
{
bool filterRes;
IOTimeTypeStampS(IOINTES_INTCTXT);
IOTimeTypeStampS(IOINTES_INTFLTR);
IOTimeStampConstant(IODBG_INTES(IOINTES_FILTER),
(unsigned int) filterAction, (unsigned int) owner);
filterRes = (*filterAction)(owner, this);
IOTimeTypeStampE(IOINTES_INTFLTR);
if (filterRes)
signalInterrupt();
IOTimeTypeStampE(IOINTES_INTCTXT);
}
void IOFilterInterruptEventSource::disableInterruptOccurred
(void *, IOService *prov, int source)
{
bool filterRes;
IOTimeTypeStampS(IOINTES_INTCTXT);
IOTimeTypeStampS(IOINTES_INTFLTR);
IOTimeStampConstant(IODBG_INTES(IOINTES_FILTER),
(unsigned int) filterAction, (unsigned int) owner);
filterRes = (*filterAction)(owner, this);
IOTimeTypeStampE(IOINTES_INTFLTR);
if (filterRes) {
prov->disableInterrupt(source);
signalInterrupt();
}
IOTimeTypeStampE(IOINTES_INTCTXT);
}