CSPspEmu.Hle.Modules.threadman.ThreadManForUser._sceKernelWaitEventFlagCB C# (CSharp) Метод

_sceKernelWaitEventFlagCB() публичный Метод

Wait for an event flag for a given bit pattern with callback.
public _sceKernelWaitEventFlagCB ( HleEventFlag EventFlag, uint Bits, EventFlagWaitTypeSet Wait, uint OutBits, uint Timeout, bool HandleCallbacks ) : int
EventFlag HleEventFlag
Bits uint The bit pattern to poll for.
Wait EventFlagWaitTypeSet Wait type, one or more of PspEventFlagWaitTypes or'ed together
OutBits uint The bit pattern that was matched.
Timeout uint Timeout in microseconds
HandleCallbacks bool
Результат int
        public int _sceKernelWaitEventFlagCB(HleEventFlag EventFlag, uint Bits, EventFlagWaitTypeSet Wait, uint* OutBits, uint* Timeout, bool HandleCallbacks)
        {
            if ((Wait & ~(EventFlagWaitTypeSet.MaskValidBits)) != 0) throw (new SceKernelException(SceKernelErrors.ERROR_KERNEL_ILLEGAL_MODE));
            if (Bits == 0) throw (new SceKernelException(SceKernelErrors.ERROR_KERNEL_EVENT_FLAG_ILLEGAL_WAIT_PATTERN));
            bool TimedOut = false;

            var PreviousPattern = EventFlag.Info.CurrentPattern;

            ThreadManager.Current.SetWaitAndPrepareWakeUp(
                HleThread.WaitType.Semaphore,
                String.Format("_sceKernelWaitEventFlagCB(EventId={0}, Bits={1:X}, Wait={2})", EventFlag.GetUidIndex(InjectContext), Bits, Wait),
                EventFlag,
                WakeUpCallback =>
            {
                if (Timeout != null)
                {
                    PspRtc.RegisterTimerInOnce(TimeSpanUtils.FromMicroseconds(*Timeout), () =>
                    {
                        TimedOut = true;
                        *Timeout = 0;
                        WakeUpCallback();
                    });
                }

                EventFlag.AddWaitingThread(new HleEventFlag.WaitThread()
                {
                    HleThread = ThreadManager.Current,
                    BitsToMatch = Bits,
                    WaitType = Wait,
                    WakeUpCallback = () => { WakeUpCallback(); },
                    OutBits = OutBits,
                });
            }, HandleCallbacks: HandleCallbacks);

            if (OutBits != null)
            {
                *OutBits = PreviousPattern;
            }

            if (TimedOut)
            {
                throw(new SceKernelException(SceKernelErrors.ERROR_KERNEL_WAIT_TIMEOUT));
            }

            //throw(new NotImplementedException());
            return 0;
        }
ThreadManForUser