X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/2d21ac55c334faf3a56e5634905ed6987fc787d4..e8c3f78193f1895ea514044358b93b1add9322f3:/iokit/Kernel/IOEventSource.cpp?ds=sidebyside diff --git a/iokit/Kernel/IOEventSource.cpp b/iokit/Kernel/IOEventSource.cpp index 0e0dbc8f8..76c2d5032 100644 --- a/iokit/Kernel/IOEventSource.cpp +++ b/iokit/Kernel/IOEventSource.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * Copyright (c) 1998-2000, 2009 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -36,10 +36,12 @@ HISTORY #include #include +#include #define super OSObject OSDefineMetaClassAndAbstractStructors(IOEventSource, OSObject) + OSMetaClassDefineReservedUnused(IOEventSource, 0); OSMetaClassDefineReservedUnused(IOEventSource, 1); OSMetaClassDefineReservedUnused(IOEventSource, 2); @@ -49,15 +51,88 @@ OSMetaClassDefineReservedUnused(IOEventSource, 5); OSMetaClassDefineReservedUnused(IOEventSource, 6); OSMetaClassDefineReservedUnused(IOEventSource, 7); +bool IOEventSource::checkForWork() { return false; } + /* inline function implementations */ -void IOEventSource::signalWorkAvailable() { workLoop->signalWorkAvailable(); } -void IOEventSource::openGate() { workLoop->openGate(); } -void IOEventSource::closeGate() { workLoop->closeGate(); } -bool IOEventSource::tryCloseGate() { return workLoop->tryCloseGate(); } + +#if IOKITSTATS + +#define IOStatisticsRegisterCounter() \ +do { \ + reserved->counter = IOStatistics::registerEventSource(inOwner); \ +} while (0) + +#define IOStatisticsUnregisterCounter() \ +do { \ + if (reserved) \ + IOStatistics::unregisterEventSource(reserved->counter); \ +} while (0) + +#define IOStatisticsOpenGate() \ +do { \ + IOStatistics::countOpenGate(reserved->counter); \ +} while (0) + +#define IOStatisticsCloseGate() \ +do { \ + IOStatistics::countCloseGate(reserved->counter); \ +} while (0) + +#else + +#define IOStatisticsRegisterCounter() +#define IOStatisticsUnregisterCounter() +#define IOStatisticsOpenGate() +#define IOStatisticsCloseGate() + +#endif /* IOKITSTATS */ + +void IOEventSource::signalWorkAvailable() +{ + workLoop->signalWorkAvailable(); +} + +void IOEventSource::openGate() +{ + IOStatisticsOpenGate(); + workLoop->openGate(); +} + +void IOEventSource::closeGate() +{ + workLoop->closeGate(); + IOStatisticsCloseGate(); +} + +bool IOEventSource::tryCloseGate() +{ + bool res; + if ((res = workLoop->tryCloseGate())) { + IOStatisticsCloseGate(); + } + return res; +} + int IOEventSource::sleepGate(void *event, UInt32 type) - { return workLoop->sleepGate(event, type); } -void IOEventSource::wakeupGate(void *event, bool oneThread) - { workLoop->wakeupGate(event, oneThread); } +{ + int res; + IOStatisticsOpenGate(); + res = workLoop->sleepGate(event, type); + IOStatisticsCloseGate(); + return res; +} + +int IOEventSource::sleepGate(void *event, AbsoluteTime deadline, UInt32 type) +{ + int res; + IOStatisticsOpenGate(); + res = workLoop->sleepGate(event, deadline, type); + IOStatisticsCloseGate(); + return res; +} + +void IOEventSource::wakeupGate(void *event, bool oneThread) { workLoop->wakeupGate(event, oneThread); } + bool IOEventSource::init(OSObject *inOwner, Action inAction) @@ -73,16 +148,65 @@ bool IOEventSource::init(OSObject *inOwner, (void) setAction(inAction); enabled = true; + if(!reserved) { + reserved = IONew(ExpansionData, 1); + if (!reserved) { + return false; + } + } + + IOStatisticsRegisterCounter(); + return true; } -IOEventSource::Action IOEventSource::getAction () const { return action; }; +void IOEventSource::free( void ) +{ + IOStatisticsUnregisterCounter(); + + if ((kActionBlock & flags) && actionBlock) Block_release(actionBlock); + + if (reserved) + IODelete(reserved, ExpansionData, 1); + + super::free(); +} + +void IOEventSource::setRefcon(void *newrefcon) +{ + refcon = newrefcon; +} + +void * IOEventSource::getRefcon() const +{ + return refcon; +} + +IOEventSource::Action IOEventSource::getAction() const +{ + if (kActionBlock & flags) return NULL; + return (action); +} + +IOEventSource::ActionBlock IOEventSource::getActionBlock(ActionBlock) const +{ + if (kActionBlock & flags) return actionBlock; + return (NULL); +} void IOEventSource::setAction(Action inAction) { + if ((kActionBlock & flags) && actionBlock) Block_release(actionBlock); action = inAction; } +void IOEventSource::setActionBlock(ActionBlock block) +{ + if ((kActionBlock & flags) && actionBlock) Block_release(actionBlock); + actionBlock = Block_copy(block); + flags |= kActionBlock; +} + IOEventSource *IOEventSource::getNext() const { return eventChainNext; }; void IOEventSource::setNext(IOEventSource *inNext)