Loading...
iokit/Kernel/IOWorkLoop.cpp xnu-1228 xnu-1504.7.4
--- xnu/xnu-1228/iokit/Kernel/IOWorkLoop.cpp
+++ xnu/xnu-1504.7.4/iokit/Kernel/IOWorkLoop.cpp
@@ -32,6 +32,8 @@
     1998-7-13	Godfrey van der Linden(gvdl)
         Created.
 */
+
+#include <pexpert/pexpert.h>
 #include <IOKit/IOWorkLoop.h>
 #include <IOKit/IOEventSource.h>
 #include <IOKit/IOInterruptEventSource.h>
@@ -44,10 +46,15 @@
 OSDefineMetaClassAndStructors(IOWorkLoop, OSObject);
 
 // Block of unused functions intended for future use
+#if __LP64__
+OSMetaClassDefineReservedUnused(IOWorkLoop, 0);
+OSMetaClassDefineReservedUnused(IOWorkLoop, 1);
+OSMetaClassDefineReservedUnused(IOWorkLoop, 2);
+#else
 OSMetaClassDefineReservedUsed(IOWorkLoop, 0);
 OSMetaClassDefineReservedUsed(IOWorkLoop, 1);
-
-OSMetaClassDefineReservedUnused(IOWorkLoop, 2);
+OSMetaClassDefineReservedUsed(IOWorkLoop, 2);
+#endif
 OSMetaClassDefineReservedUnused(IOWorkLoop, 3);
 OSMetaClassDefineReservedUnused(IOWorkLoop, 4);
 OSMetaClassDefineReservedUnused(IOWorkLoop, 5);
@@ -73,6 +80,7 @@
 
 #define fFlags loopRestart
 
+
 bool IOWorkLoop::init()
 {
     // The super init and gateLock allocation MUST be done first
@@ -110,12 +118,11 @@
     }
 
     if ( workThread == NULL ) {
-        IOThreadFunc cptr = OSMemberFunctionCast(
-            IOThreadFunc,
+        thread_continue_t cptr = OSMemberFunctionCast(
+            thread_continue_t,
             this,
             &IOWorkLoop::threadMain);
-        workThread = IOCreateThread(cptr, this);
-        if (!workThread)
+        if (KERN_SUCCESS != kernel_thread_start(cptr, this, &workThread))
             return false;
     }
 
@@ -301,7 +308,10 @@
     bool more;
     do {
 	CLRP(&fFlags, kLoopRestart);
-	workToDo = more = false;
+	more = false;
+	IOInterruptState is = IOSimpleLockLockDisableInterrupt(workToDoLock);
+	workToDo = false;
+	IOSimpleLockUnlockEnableInterrupt(workToDoLock, is);
 	for (IOEventSource *evnt = eventChain; evnt; evnt = evnt->getNext()) {
 
 	    IOTimeClientS();
@@ -352,9 +362,12 @@
     } while(workToDo);
 
 exitThread:
+	thread_t thread = workThread;
     workThread = 0;	// Say we don't have a loop and free ourselves
     free();
-    IOExitThread();
+
+	thread_deallocate(thread);
+    (void) thread_terminate(thread);
 }
 
 IOThread IOWorkLoop::getThread() const
@@ -403,6 +416,11 @@
     return IORecursiveLockSleep(gateLock, event, interuptibleType);
 }
 
+int IOWorkLoop::sleepGate(void *event, AbsoluteTime deadline, UInt32 interuptibleType)
+{
+    return IORecursiveLockSleepDeadline(gateLock, event, deadline, interuptibleType);
+}
+
 void IOWorkLoop::wakeupGate(void *event, bool oneThread)
 {
     IORecursiveLockWakeup(gateLock, event, oneThread);
@@ -424,7 +442,7 @@
 
 IOReturn IOWorkLoop::_maintRequest(void *inC, void *inD, void *, void *)
 {
-    maintCommandEnum command = (maintCommandEnum) (vm_address_t) inC;
+    maintCommandEnum command = (maintCommandEnum) (uintptr_t) inC;
     IOEventSource *inEvent = (IOEventSource *) inD;
     IOReturn res = kIOReturnSuccess;