private int _sceKernelWaitThreadEndCB(int ThreadId, uint* Timeout, bool HandleCallbacks)
{
var ThreadToWaitEnd = GetThreadById(ThreadId);
if (ThreadToWaitEnd.HasAnyStatus(HleThread.Status.Stopped))
{
return 0;
}
if (ThreadToWaitEnd.HasAnyStatus(HleThread.Status.Killed))
{
return 0;
}
bool TimedOut = false;
ThreadManager.Current.SetWaitAndPrepareWakeUp(HleThread.WaitType.None, String.Format("sceKernelWaitThreadEnd('{0}')", ThreadToWaitEnd.Name), ThreadToWaitEnd, WakeUpCallback =>
{
if (Timeout != null)
{
PspRtc.RegisterTimerInOnce(TimeSpanUtils.FromMicroseconds(*Timeout), () =>
{
TimedOut = true;
WakeUpCallback();
});
}
Console.WriteLine("Wait End!");
Action OnTerminate = null;
OnTerminate = () =>
{
ThreadToWaitEnd.OnTerminate -= OnTerminate;
Console.WriteLine("Ended!");
//throw(new Exception("aaaaaaaaaaaa"));
WakeUpCallback();
};
ThreadToWaitEnd.OnTerminate += OnTerminate;
}, HandleCallbacks: HandleCallbacks);
if (TimedOut)
{
return (int)SceKernelErrors.ERROR_KERNEL_WAIT_TIMEOUT;
}
else
{
return 0;
}
}