Loading...
--- 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;