public void ChangeWakeUpCount(int Increment, HleThread WakeupThread, bool HandleCallbacks = false)
{
var PreviousWakeupCount = Info.WakeupCount;
Info.WakeupCount += Increment;
var CurrentWakeupCount = Info.WakeupCount;
/*
* Console.Error.WriteLine(
* "{0} : ChangeWakeUpCount : {1} -> {2}",
* this, PreviousWakeupCount, CurrentWakeupCount
* );
*/
var ThreadToSleep = this;
// Sleep if sleeping decrement.
if (Increment < 0 && CurrentWakeupCount < 0)
{
ThreadToSleep.SetWaitAndPrepareWakeUp(HleThread.WaitType.None, "sceKernelSleepThread", WakeUpCallback =>
{
ThreadToSleep.WakeUpCallback = () =>
{
WakeUpCallback();
WakeUpCallback = null;
};
}, HandleCallbacks: HandleCallbacks);
}
// Awake
else if (Increment > 0 && PreviousWakeupCount < 0 && CurrentWakeupCount >= 0)
{
Action[] WakeUpListCopy;
lock (WakeUpList)
{
WakeUpListCopy = WakeUpList.ToArray();
WakeUpList.Clear();
}
if (WakeUpCallback != null)
{
WakeUpCallback();
}
else
{
Console.Error.WriteLine("Unexpected!");
}
foreach (var WakeUp in WakeUpListCopy)
{
WakeUp();
}
}
if (Increment > 0)
{
//return;
Console.Error.WriteLine("Increment > 0 - Wakeup");
WakeupThread.SetWaitAndPrepareWakeUp(WaitType.None, "sceKernelWakeupThread", WakeUpCallback =>
{
lock (WakeUpList)
{
WakeUpList.Add(() =>
{
WakeUpCallback();
});
}
}, HandleCallbacks: HandleCallbacks);
//WakeUpList.Add
}
}