Moved around some Ki functions
This commit is contained in:
parent
c1df95b324
commit
e80fcd4d07
|
@ -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) { \
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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); \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue