diff --git a/src/core/kernel/exports/EmuKrnlKe.cpp b/src/core/kernel/exports/EmuKrnlKe.cpp index ec8f8e0ad..a3514448e 100644 --- a/src/core/kernel/exports/EmuKrnlKe.cpp +++ b/src/core/kernel/exports/EmuKrnlKe.cpp @@ -87,77 +87,6 @@ xboxkrnl::ULONGLONG LARGE_INTEGER2ULONGLONG(xboxkrnl::LARGE_INTEGER value) return *((PULONGLONG)&value); } -#define KiWaitSatisfyMutant(_Object_, _Thread_) { \ - (_Object_)->Header.SignalState -= 1; \ - if ((_Object_)->Header.SignalState == 0) { \ - (_Object_)->OwnerThread = (_Thread_); \ - if ((_Object_)->Abandoned == TRUE) { \ - (_Object_)->Abandoned = FALSE; \ - (_Thread_)->WaitStatus = STATUS_ABANDONED; \ - } \ - \ - InsertHeadList((_Thread_)->MutantListHead.Blink, \ - &(_Object_)->MutantListEntry); \ - } \ -} - -#define KiWaitSatisfyOther(_Object_) { \ - if (((_Object_)->Header.Type & DISPATCHER_OBJECT_TYPE_MASK) == EventSynchronizationObject) { \ - (_Object_)->Header.SignalState = 0; \ - \ - } else if ((_Object_)->Header.Type == SemaphoreObject) { \ - (_Object_)->Header.SignalState -= 1; \ - \ - } \ -} - -#define KiWaitSatisfyAny(_Object_, _Thread_) { \ - if (((_Object_)->Header.Type & DISPATCHER_OBJECT_TYPE_MASK) == EventSynchronizationObject) { \ - (_Object_)->Header.SignalState = 0; \ - \ - } else if ((_Object_)->Header.Type == SemaphoreObject) { \ - (_Object_)->Header.SignalState -= 1; \ - \ - } else if ((_Object_)->Header.Type == MutantObject) { \ - (_Object_)->Header.SignalState -= 1; \ - if ((_Object_)->Header.SignalState == 0) { \ - (_Object_)->OwnerThread = (_Thread_); \ - if ((_Object_)->Abandoned == TRUE) { \ - (_Object_)->Abandoned = FALSE; \ - (_Thread_)->WaitStatus = STATUS_ABANDONED; \ - } \ - \ - InsertHeadList((_Thread_)->MutantListHead.Blink, \ - &(_Object_)->MutantListEntry); \ - } \ - } \ -} - -void FASTCALL KiWaitSatisfyAll -( - IN xboxkrnl::PKWAIT_BLOCK WaitBlock -) -{ - using namespace xboxkrnl; - - PKMUTANT Object; - PRKTHREAD Thread; - PKWAIT_BLOCK WaitBlock1; - - WaitBlock1 = WaitBlock; - Thread = WaitBlock1->Thread; - do { - if (WaitBlock1->WaitKey != (CSHORT)STATUS_TIMEOUT) { - Object = (PKMUTANT)WaitBlock1->Object; - KiWaitSatisfyAny(Object, Thread); - } - - WaitBlock1 = WaitBlock1->NextWaitBlock; - } while (WaitBlock1 != WaitBlock); - - return; -} - #define TestForAlertPending(Alertable) \ if (Alertable) { \ if (Thread->Alerted[WaitMode] != FALSE) { \ diff --git a/src/core/kernel/exports/EmuKrnlKi.cpp b/src/core/kernel/exports/EmuKrnlKi.cpp index c429400a5..b0e4b3958 100644 --- a/src/core/kernel/exports/EmuKrnlKi.cpp +++ b/src/core/kernel/exports/EmuKrnlKi.cpp @@ -829,3 +829,28 @@ xboxkrnl::VOID FASTCALL xboxkrnl::KiTimerListExpire( KiTimerUnlock(); } } + +xboxkrnl::VOID FASTCALL xboxkrnl::KiWaitSatisfyAll +( + IN xboxkrnl::PKWAIT_BLOCK WaitBlock +) +{ + using namespace xboxkrnl; + + PKMUTANT Object; + PRKTHREAD Thread; + PKWAIT_BLOCK WaitBlock1; + + WaitBlock1 = WaitBlock; + Thread = WaitBlock1->Thread; + do { + if (WaitBlock1->WaitKey != (CSHORT)STATUS_TIMEOUT) { + Object = (PKMUTANT)WaitBlock1->Object; + KiWaitSatisfyAny(Object, Thread); + } + + WaitBlock1 = WaitBlock1->NextWaitBlock; + } while (WaitBlock1 != WaitBlock); + + return; +} diff --git a/src/core/kernel/exports/EmuKrnlKi.h b/src/core/kernel/exports/EmuKrnlKi.h index b61094d39..7fffe7db6 100644 --- a/src/core/kernel/exports/EmuKrnlKi.h +++ b/src/core/kernel/exports/EmuKrnlKi.h @@ -134,6 +134,10 @@ namespace xboxkrnl IN PLIST_ENTRY ExpiredListHead, IN KIRQL OldIrql ); + + VOID FASTCALL KiWaitSatisfyAll( + IN PKWAIT_BLOCK WaitBlock + ); }; #define KiLockDispatcherDatabase(OldIrql) \ @@ -153,3 +157,49 @@ namespace xboxkrnl _ListHead = &KiWaitInListHead; \ InsertTailList(_ListHead, &(_Thread)->WaitListEntry); \ } + +#define KiWaitSatisfyMutant(_Object_, _Thread_) { \ + (_Object_)->Header.SignalState -= 1; \ + if ((_Object_)->Header.SignalState == 0) { \ + (_Object_)->OwnerThread = (_Thread_); \ + if ((_Object_)->Abandoned == TRUE) { \ + (_Object_)->Abandoned = FALSE; \ + (_Thread_)->WaitStatus = STATUS_ABANDONED; \ + } \ + \ + InsertHeadList((_Thread_)->MutantListHead.Blink, \ + &(_Object_)->MutantListEntry); \ + } \ +} + +#define KiWaitSatisfyOther(_Object_) { \ + if (((_Object_)->Header.Type & DISPATCHER_OBJECT_TYPE_MASK) == EventSynchronizationObject) { \ + (_Object_)->Header.SignalState = 0; \ + \ + } else if ((_Object_)->Header.Type == SemaphoreObject) { \ + (_Object_)->Header.SignalState -= 1; \ + \ + } \ +} + +#define KiWaitSatisfyAny(_Object_, _Thread_) { \ + if (((_Object_)->Header.Type & DISPATCHER_OBJECT_TYPE_MASK) == EventSynchronizationObject) { \ + (_Object_)->Header.SignalState = 0; \ + \ + } else if ((_Object_)->Header.Type == SemaphoreObject) { \ + (_Object_)->Header.SignalState -= 1; \ + \ + } else if ((_Object_)->Header.Type == MutantObject) { \ + (_Object_)->Header.SignalState -= 1; \ + if ((_Object_)->Header.SignalState == 0) { \ + (_Object_)->OwnerThread = (_Thread_); \ + if ((_Object_)->Abandoned == TRUE) { \ + (_Object_)->Abandoned = FALSE; \ + (_Thread_)->WaitStatus = STATUS_ABANDONED; \ + } \ + \ + InsertHeadList((_Thread_)->MutantListHead.Blink, \ + &(_Object_)->MutantListEntry); \ + } \ + } \ +}