Loading...
--- xnu/xnu-344.34/iokit/Kernel/IOLocks.cpp
+++ xnu/xnu-201.5/iokit/Kernel/IOLocks.cpp
@@ -149,16 +149,21 @@
assert(lock->thread == IOThreadSelf());
assert(lock->count == 1 || interType == THREAD_UNINT);
+ assert_wait((event_t) event, (int) interType);
lock->count = 0;
lock->thread = 0;
- res = thread_sleep_mutex((event_t) event, lock->mutex, (int) interType);
-
- // Must re-establish the recursive lock no matter why we woke up
- // otherwise we would potentially leave the return path corrupted.
- assert(lock->thread == 0);
- assert(lock->count == 0);
- lock->thread = IOThreadSelf();
- lock->count = count;
+ mutex_unlock(lock->mutex);
+
+ res = thread_block(0);
+
+ if (THREAD_AWAKENED == res) {
+ mutex_lock(lock->mutex);
+ assert(lock->thread == 0);
+ assert(lock->count == 0);
+ lock->thread = IOThreadSelf();
+ lock->count = count;
+ }
+
return res;
}