Loading...
--- xnu/xnu-344.23/iokit/Kernel/IOWorkLoop.cpp
+++ xnu/xnu-201.19/iokit/Kernel/IOWorkLoop.cpp
@@ -57,8 +57,6 @@
#define fFlags loopRestart
-extern "C" extern void stack_privilege( thread_t thread);
-
void IOWorkLoop::launchThreadMain(void *self)
{
register thread_t mythread = current_thread();
@@ -300,8 +298,13 @@
assert_wait((void *) &workToDo, false);
IOSimpleLockUnlockEnableInterrupt(workToDoLock, is);
+#if defined (__i386__)
+ thread_block(0);
+ continue;
+#else
thread_set_cont_arg((int) this);
thread_block(&threadMainContinuation);
+#endif
/* NOTREACHED */
}
@@ -318,7 +321,7 @@
exitThread:
workThread = 0; // Say we don't have a loop and free ourselves
free();
- IOExitThread();
+ IOExitThread(0);
}
IOThread IOWorkLoop::getThread() const
@@ -395,48 +398,43 @@
switch (command)
{
case mAddEvent:
- if (!inEvent->getWorkLoop()) {
- SETP(&fFlags, kLoopRestart);
-
- inEvent->retain();
- inEvent->setWorkLoop(this);
- inEvent->setNext(0);
-
- if (!eventChain)
- eventChain = inEvent;
- else {
- IOEventSource *event, *next;
-
- for (event = eventChain; (next = event->getNext()); event = next)
- ;
- event->setNext(inEvent);
- }
+ SETP(&fFlags, kLoopRestart);
+ inEvent->retain();
+ inEvent->setWorkLoop(this);
+ inEvent->setNext(0);
+
+ if (!eventChain)
+ eventChain = inEvent;
+ else {
+ IOEventSource *event, *next;
+
+ for (event = eventChain; (next = event->getNext()); event = next)
+ ;
+ event->setNext(inEvent);
}
break;
case mRemoveEvent:
- if (inEvent->getWorkLoop()) {
- if (eventChain == inEvent)
- eventChain = inEvent->getNext();
- else {
- IOEventSource *event, *next;
-
- event = eventChain;
- while ((next = event->getNext()) && next != inEvent)
- event = next;
-
- if (!next) {
- res = kIOReturnBadArgument;
- break;
- }
- event->setNext(inEvent->getNext());
+ if (eventChain == inEvent)
+ eventChain = inEvent->getNext();
+ else {
+ IOEventSource *event, *next;
+
+ event = eventChain;
+ while ((next = event->getNext()) && next != inEvent)
+ event = next;
+
+ if (!next) {
+ res = kIOReturnBadArgument;
+ break;
}
-
- inEvent->setWorkLoop(0);
- inEvent->setNext(0);
- inEvent->release();
- SETP(&fFlags, kLoopRestart);
+ event->setNext(inEvent->getNext());
}
+
+ inEvent->setWorkLoop(0);
+ inEvent->setNext(0);
+ inEvent->release();
+ SETP(&fFlags, kLoopRestart);
break;
default: