/*
- * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 1998-2000, 2009-2010 Apple Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
#include <IOKit/IOWorkLoop.h>
#include <IOKit/IOReturn.h>
#include <IOKit/IOTimeStamp.h>
+#include <IOKit/IOKitDebug.h>
#define super IOEventSource
OSDefineMetaClassAndStructors(IOCommandGate, IOEventSource)
+#if __LP64__
OSMetaClassDefineReservedUnused(IOCommandGate, 0);
+#else
+OSMetaClassDefineReservedUsed(IOCommandGate, 0);
+#endif
OSMetaClassDefineReservedUnused(IOCommandGate, 1);
OSMetaClassDefineReservedUnused(IOCommandGate, 2);
OSMetaClassDefineReservedUnused(IOCommandGate, 3);
OSMetaClassDefineReservedUnused(IOCommandGate, 6);
OSMetaClassDefineReservedUnused(IOCommandGate, 7);
-bool IOCommandGate::checkForWork() { return false; }
+#if IOKITSTATS
+
+#define IOStatisticsInitializeCounter() \
+do { \
+ IOStatistics::setCounterType(IOEventSource::reserved->counter, kIOStatisticsCommandGateCounter); \
+} while (0)
+
+#define IOStatisticsActionCall() \
+do { \
+ IOStatistics::countCommandGateActionCall(IOEventSource::reserved->counter); \
+} while (0)
+
+#else
+
+#define IOStatisticsInitializeCounter()
+#define IOStatisticsActionCall()
+
+#endif /* IOKITSTATS */
bool IOCommandGate::init(OSObject *inOwner, Action inAction)
{
- return super::init(inOwner, (IOEventSource::Action) inAction);
+ bool res = super::init(inOwner, (IOEventSource::Action) inAction);
+ if (res) {
+ IOStatisticsInitializeCounter();
+ }
+
+ return res;
}
IOCommandGate *
if (!inAction)
return kIOReturnBadArgument;
- IOTimeStampConstant(IODBG_CMDQ(IOCMDQ_ACTION),
- (unsigned int) inAction, (unsigned int) owner);
-
// closeGate is recursive needn't worry if we already hold the lock.
closeGate();
}
}
+ bool trace = ( gIOKitTrace & kIOTraceCommandGates ) ? true : false;
+
+ if (trace)
+ IOTimeStampStartConstant(IODBG_CMDQ(IOCMDQ_ACTION),
+ VM_KERNEL_UNSLIDE(inAction), (uintptr_t) owner);
+
+ IOStatisticsActionCall();
+
// Must be gated and on the work loop or enabled
res = (*inAction)(owner, arg0, arg1, arg2, arg3);
+
+ if (trace)
+ IOTimeStampEndConstant(IODBG_CMDQ(IOCMDQ_ACTION),
+ VM_KERNEL_UNSLIDE(inAction), (uintptr_t) owner);
+
openGate();
-
+
return res;
}
if (!workLoop->onThread() && !enabled)
res = kIOReturnNotPermitted;
else {
- IOTimeStampConstant(IODBG_CMDQ(IOCMDQ_ACTION),
- (unsigned int) inAction, (unsigned int) owner);
-
- res = (*inAction)(owner, arg0, arg1, arg2, arg3);
+
+ bool trace = ( gIOKitTrace & kIOTraceCommandGates ) ? true : false;
+
+ if (trace)
+ IOTimeStampStartConstant(IODBG_CMDQ(IOCMDQ_ACTION),
+ VM_KERNEL_UNSLIDE(inAction), (uintptr_t) owner);
+
+ IOStatisticsActionCall();
+
+ res = (*inAction)(owner, arg0, arg1, arg2, arg3);
+
+ if (trace)
+ IOTimeStampEndConstant(IODBG_CMDQ(IOCMDQ_ACTION),
+ VM_KERNEL_UNSLIDE(inAction), (uintptr_t) owner);
}
openGate();
return sleepGate(event, interruptible);
}
+IOReturn IOCommandGate::commandSleep(void *event, AbsoluteTime deadline, UInt32 interruptible)
+{
+ if (!workLoop->inGate())
+ return kIOReturnNotPermitted;
+
+ return sleepGate(event, deadline, interruptible);
+}
+
void IOCommandGate::commandWakeup(void *event, bool oneThread)
{
wakeupGate(event, oneThread);