Loading...
iokit/Kernel/IOTimerEventSource.cpp xnu-4903.241.1 xnu-1228
--- xnu/xnu-4903.241.1/iokit/Kernel/IOTimerEventSource.cpp
+++ xnu/xnu-1228/iokit/Kernel/IOTimerEventSource.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998-2000, 2009-2010 Apple Inc. All rights reserved.
+ * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
@@ -25,6 +25,17 @@
  * 
  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
+/*
+ * Copyright (c) 1999 Apple Computer, Inc.  All rights reserved. 
+ *
+ * IOTimerEventSource.cpp
+ *
+ * HISTORY
+ * 2-Feb-1999		Joe Liu (jliu) created.
+ * 1999-10-14		Godfrey van der Linden(gvdl)
+ *		Revamped to use thread_call APIs
+ *
+ */
 
 #include <sys/cdefs.h>
 
@@ -40,92 +51,31 @@
 #include <IOKit/IOWorkLoop.h>
 
 #include <IOKit/IOTimeStamp.h>
-#include <IOKit/IOKitDebug.h>
-#if CONFIG_DTRACE
-#include <mach/sdt.h>
-#endif
-
-#include <libkern/Block.h>
-
 
 #define super IOEventSource
 OSDefineMetaClassAndStructors(IOTimerEventSource, IOEventSource)
-OSMetaClassDefineReservedUsed(IOTimerEventSource, 0);
-OSMetaClassDefineReservedUsed(IOTimerEventSource, 1);
-OSMetaClassDefineReservedUsed(IOTimerEventSource, 2);
+OSMetaClassDefineReservedUnused(IOTimerEventSource, 0);
+OSMetaClassDefineReservedUnused(IOTimerEventSource, 1);
+OSMetaClassDefineReservedUnused(IOTimerEventSource, 2);
 OSMetaClassDefineReservedUnused(IOTimerEventSource, 3);
 OSMetaClassDefineReservedUnused(IOTimerEventSource, 4);
 OSMetaClassDefineReservedUnused(IOTimerEventSource, 5);
 OSMetaClassDefineReservedUnused(IOTimerEventSource, 6);
 OSMetaClassDefineReservedUnused(IOTimerEventSource, 7);
 
-#if IOKITSTATS
-
-#define IOStatisticsInitializeCounter() \
-do { \
-	IOStatistics::setCounterType(IOEventSource::reserved->counter, kIOStatisticsTimerEventSourceCounter); \
-} while (0)
-
-#define IOStatisticsOpenGate() \
-do { \
-	IOStatistics::countOpenGate(me->IOEventSource::reserved->counter); \
-} while (0)
-
-#define IOStatisticsCloseGate() \
-do { \
-	IOStatistics::countCloseGate(me->IOEventSource::reserved->counter); \
-} while (0)
-
-#define IOStatisticsTimeout() \
-do { \
-	IOStatistics::countTimerTimeout(me->IOEventSource::reserved->counter); \
-} while (0)
-
-#else
-
-#define IOStatisticsInitializeCounter()
-#define IOStatisticsOpenGate()
-#define IOStatisticsCloseGate()
-#define IOStatisticsTimeout()
-
-#endif /* IOKITSTATS */
-
 // 
 // reserved != 0 means IOTimerEventSource::timeoutAndRelease is being used,
 // not a subclassed implementation. 
 //
 
+bool IOTimerEventSource::checkForWork() { return false; }
+
 // Timeout handler function. This function is called by the kernel when
 // the timeout interval expires.
 //
-
-__inline__ void
-IOTimerEventSource::invokeAction(IOTimerEventSource::Action action, IOTimerEventSource * ts,
-	     OSObject * owner, IOWorkLoop * workLoop)
-{
-    bool    trace = (gIOKitTrace & kIOTraceTimers) ? true : false;
-
-    if (trace)
-	IOTimeStampStartConstant(IODBG_TIMES(IOTIMES_ACTION),
-				 VM_KERNEL_ADDRHIDE(action), VM_KERNEL_ADDRHIDE(owner));
-
-    if (kActionBlock & flags) ((IOTimerEventSource::ActionBlock) actionBlock)(ts);
-    else                      (*action)(owner, ts);
-
-#if CONFIG_DTRACE
-    DTRACE_TMR3(iotescallout__expire, Action, action, OSObject, owner, void, workLoop);
-#endif
-
-    if (trace)
-	IOTimeStampEndConstant(IODBG_TIMES(IOTIMES_ACTION),
-			       VM_KERNEL_UNSLIDE(action), VM_KERNEL_ADDRHIDE(owner));
-}
-
 void IOTimerEventSource::timeout(void *self)
 {
     IOTimerEventSource *me = (IOTimerEventSource *) self;
-
-    IOStatisticsTimeout();
 
     if (me->enabled && me->action)
     {
@@ -135,27 +85,22 @@
         {
             Action doit;
             wl->closeGate();
-            IOStatisticsCloseGate();
             doit = (Action) me->action;
             if (doit && me->enabled && AbsoluteTime_to_scalar(&me->abstime))
             {
-                me->invokeAction(doit, me, me->owner, me->workLoop);
+                IOTimeStampConstant(IODBG_TIMES(IOTIMES_ACTION),
+                                    (unsigned int) doit, (unsigned int) me->owner);
+                (*doit)(me->owner, me);
             }
-            IOStatisticsOpenGate();
             wl->openGate();
         }
     }
 }
 
-void IOTimerEventSource::timeoutAndRelease(void * self, void * c)
+void IOTimerEventSource::timeoutAndRelease(void * self, void * count)
 {
     IOTimerEventSource *me = (IOTimerEventSource *) self;
-	/* The second parameter (a pointer) gets abused to carry an SInt32, so on LP64, "count"
-	   must be cast to "long" before, in order to tell GCC we're not truncating a pointer. */
-	SInt32 count = (SInt32) (long) c;
-
-    IOStatisticsTimeout();
-	
+
     if (me->enabled && me->action)
     {
         IOWorkLoop *
@@ -164,13 +109,13 @@
         {
             Action doit;
             wl->closeGate();
-            IOStatisticsCloseGate();
             doit = (Action) me->action;
-            if (doit && (me->reserved->calloutGeneration == count))
+            if (doit && (me->reserved->calloutGeneration == (SInt32) count))
             {
-                me->invokeAction(doit, me, me->owner, me->workLoop);
+                IOTimeStampConstant(IODBG_TIMES(IOTIMES_ACTION),
+                                    (unsigned int) doit, (unsigned int) me->owner);
+                (*doit)(me->owner, me);
             }
-            IOStatisticsOpenGate();
             wl->openGate();
         }
     }
@@ -179,99 +124,13 @@
     me->release();
 }
 
-// -- work loop delivery
-
-bool IOTimerEventSource::checkForWork()
-{
-    Action doit;
-
-    if (reserved
-     && (reserved->calloutGenerationSignaled == reserved->calloutGeneration)
-     && enabled && (doit = (Action) action))
-    {
-	reserved->calloutGenerationSignaled = ~reserved->calloutGeneration;
-	invokeAction(doit, this, owner, workLoop);
-    }
-
-    return false;
-}
-
-void IOTimerEventSource::timeoutSignaled(void * self, void * c)
-{
-    IOTimerEventSource *me = (IOTimerEventSource *) self;
-
-    me->reserved->calloutGenerationSignaled = (SInt32)(long) c;
-    if (me->enabled) me->signalWorkAvailable();
-}
-
-// --
-
 void IOTimerEventSource::setTimeoutFunc()
 {
-    thread_call_priority_t pri;
-    uint32_t options;
-
-    if (reserved) panic("setTimeoutFunc already %p, %p", this, reserved);
-
     // reserved != 0 means IOTimerEventSource::timeoutAndRelease is being used,
     // not a subclassed implementation
     reserved = IONew(ExpansionData, 1);
-    reserved->calloutGenerationSignaled = ~reserved->calloutGeneration;
-    options = abstime;
-    abstime = 0;
-
-    thread_call_options_t tcoptions = 0;
-    thread_call_func_t    func      = NULL;
-
-    switch (kIOTimerEventSourceOptionsPriorityMask & options)
-    {
-      case kIOTimerEventSourceOptionsPriorityHigh:
-        pri = THREAD_CALL_PRIORITY_HIGH;
-        func = &IOTimerEventSource::timeoutAndRelease;
-        break;
-
-      case kIOTimerEventSourceOptionsPriorityKernel:
-        pri = THREAD_CALL_PRIORITY_KERNEL;
-        func = &IOTimerEventSource::timeoutAndRelease;
-        break;
-
-      case kIOTimerEventSourceOptionsPriorityKernelHigh:
-        pri = THREAD_CALL_PRIORITY_KERNEL_HIGH;
-        func = &IOTimerEventSource::timeoutAndRelease;
-        break;
-
-      case kIOTimerEventSourceOptionsPriorityUser:
-        pri = THREAD_CALL_PRIORITY_USER;
-        func = &IOTimerEventSource::timeoutAndRelease;
-        break;
-
-      case kIOTimerEventSourceOptionsPriorityLow:
-        pri = THREAD_CALL_PRIORITY_LOW;
-        func = &IOTimerEventSource::timeoutAndRelease;
-        break;
-
-      case kIOTimerEventSourceOptionsPriorityWorkLoop:
-        pri = THREAD_CALL_PRIORITY_KERNEL;
-        tcoptions |= THREAD_CALL_OPTIONS_SIGNAL;
-        if (kIOTimerEventSourceOptionsAllowReenter & options) break;
-        func = &IOTimerEventSource::timeoutSignaled;
-        break;
-
-      default:
-        break;
-    }
-
-    assertf(func, "IOTimerEventSource options 0x%x", options);
-    if (!func) return;		                                     // init will fail
-
-    if (THREAD_CALL_OPTIONS_SIGNAL & tcoptions) flags |= kActive;
-    else                                        flags |= kPassive;
-
-    if (!(kIOTimerEventSourceOptionsAllowReenter & options)) tcoptions |= THREAD_CALL_OPTIONS_ONCE;
-
-    calloutEntry = (void *) thread_call_allocate_with_options(func,
-        (thread_call_param_t) this, pri, tcoptions);
-    assert(calloutEntry);
+    calloutEntry = (void *) thread_call_allocate((thread_call_func_t) &IOTimerEventSource::timeoutAndRelease,
+                                                 (thread_call_param_t) this);
 }
 
 bool IOTimerEventSource::init(OSObject *inOwner, Action inAction)
@@ -283,23 +142,15 @@
     if (!calloutEntry)
         return false;
 
-    IOStatisticsInitializeCounter();
-
     return true;
 }
 
-bool IOTimerEventSource::init(uint32_t options, OSObject *inOwner, Action inAction)
-{
-    abstime = options;
-    return (init(inOwner, inAction));
-}
-
 IOTimerEventSource *
-IOTimerEventSource::timerEventSource(uint32_t inOptions, OSObject *inOwner, Action inAction)
+IOTimerEventSource::timerEventSource(OSObject *inOwner, Action inAction)
 {
     IOTimerEventSource *me = new IOTimerEventSource;
 
-    if (me && !me->init(inOptions, inOwner, inAction)) {
+    if (me && !me->init(inOwner, inAction)) {
         me->release();
         return 0;
     }
@@ -307,35 +158,11 @@
     return me;
 }
 
-IOTimerEventSource *
-IOTimerEventSource::timerEventSource(uint32_t options, OSObject *inOwner, ActionBlock action)
-{
-    IOTimerEventSource * tes;
-    tes = IOTimerEventSource::timerEventSource(options, inOwner, (Action) NULL);
-    if (tes) tes->setActionBlock((IOEventSource::ActionBlock) action);
-
-    return tes;
-}
-
-#define _thread_call_cancel(tc)   ((kActive & flags) ? thread_call_cancel_wait((tc)) : thread_call_cancel((tc)))
-
-IOTimerEventSource *
-IOTimerEventSource::timerEventSource(OSObject *inOwner, Action inAction)
-{
-    return (IOTimerEventSource::timerEventSource(
-                kIOTimerEventSourceOptionsPriorityKernelHigh,
-                inOwner, inAction));
-}
-
 void IOTimerEventSource::free()
 {
     if (calloutEntry) {
-        __assert_only bool freed;
-
         cancelTimeout();
-
-        freed = thread_call_free((thread_call_t) calloutEntry);
-        assert(freed);
+        thread_call_free((thread_call_t) calloutEntry);    
     }
 
     if (reserved)
@@ -348,9 +175,9 @@
 {
     if (reserved)
         reserved->calloutGeneration++;
-    bool active = _thread_call_cancel((thread_call_t) calloutEntry);
+    bool active = thread_call_cancel((thread_call_t) calloutEntry);
     AbsoluteTime_to_scalar(&abstime) = 0;
-    if (active && reserved && (kPassive & flags))
+    if (active && reserved)
     {
         release();
         workLoop->release();
@@ -368,9 +195,9 @@
 {
     if (reserved)
         reserved->calloutGeneration++;
-    bool active = _thread_call_cancel((thread_call_t) calloutEntry);
+    bool active = thread_call_cancel((thread_call_t) calloutEntry);
     super::disable();
-    if (active && reserved && (kPassive & flags))
+    if (active && reserved)
     {
         release();
         workLoop->release();
@@ -400,7 +227,6 @@
     return wakeAtTime(end);
 }
 
-#if !defined(__LP64__)
 IOReturn IOTimerEventSource::setTimeout(mach_timespec_t interval)
 {
     AbsoluteTime end, nsecs;
@@ -413,25 +239,15 @@
 
     return wakeAtTime(end);
 }
-#endif
 
 IOReturn IOTimerEventSource::setTimeout(AbsoluteTime interval)
 {
     AbsoluteTime end;
-    clock_absolutetime_interval_to_deadline(interval, &end);
-    return wakeAtTime(end);
-}
-
-IOReturn IOTimerEventSource::setTimeout(uint32_t options,
-					AbsoluteTime abstime, AbsoluteTime leeway)
-{
-    AbsoluteTime end;
-    if (options & kIOTimeOptionsContinuous)
-        clock_continuoustime_interval_to_deadline(abstime, &end);
-    else
-        clock_absolutetime_interval_to_deadline(abstime, &end);
-
-    return wakeAtTime(options, end, leeway);
+
+    clock_get_uptime(&end);
+    ADD_ABSOLUTETIME(&end, &interval);
+
+    return wakeAtTime(end);
 }
 
 IOReturn IOTimerEventSource::wakeAtTimeTicks(UInt32 ticks)
@@ -457,7 +273,6 @@
     return wakeAtTime(end);
 }
 
-#if !defined(__LP64__)
 IOReturn IOTimerEventSource::wakeAtTime(mach_timespec_t inAbstime)
 {
     AbsoluteTime end, nsecs;
@@ -470,7 +285,6 @@
 
     return wakeAtTime(end);
 }
-#endif
 
 void IOTimerEventSource::setWorkLoop(IOWorkLoop *inWorkLoop)
 {
@@ -481,44 +295,27 @@
 
 IOReturn IOTimerEventSource::wakeAtTime(AbsoluteTime inAbstime)
 {
-    return wakeAtTime(0, inAbstime, 0);
-}
-
-IOReturn IOTimerEventSource::wakeAtTime(uint32_t options, AbsoluteTime inAbstime, AbsoluteTime leeway)
-{
     if (!action)
         return kIOReturnNoResources;
 
     abstime = inAbstime;
-    if ( enabled && AbsoluteTime_to_scalar(&inAbstime) && AbsoluteTime_to_scalar(&abstime) && workLoop )
-    {
-        uint32_t tcoptions = 0;
-
-        if (kIOTimeOptionsWithLeeway & options) tcoptions |= THREAD_CALL_DELAY_LEEWAY;
-        if (kIOTimeOptionsContinuous & options) tcoptions |= THREAD_CALL_CONTINUOUS;
-
+    if ( enabled && AbsoluteTime_to_scalar(&abstime) && workLoop )
+    {
         if (reserved)
         {
-	    if (kPassive & flags)
-	    {
-		retain();
-		workLoop->retain();
-	    }
+            retain();
+            workLoop->retain();
             reserved->workLoop = workLoop;
             reserved->calloutGeneration++;
-            if (thread_call_enter_delayed_with_leeway((thread_call_t) calloutEntry,
-                    (void *)(uintptr_t) reserved->calloutGeneration, inAbstime, leeway, tcoptions)
-              && (kPassive & flags))
+            if (thread_call_enter1_delayed((thread_call_t) calloutEntry, 
+                    (void *) reserved->calloutGeneration, abstime))
             {
                 release();
                 workLoop->release();
             }
         }
         else
-        {
-            thread_call_enter_delayed_with_leeway((thread_call_t) calloutEntry,
-                    NULL, inAbstime, leeway, tcoptions);
-        }
+            thread_call_enter_delayed((thread_call_t) calloutEntry, abstime);
     }
 
     return kIOReturnSuccess;