public void ExecuteQueued(CpuThreadState BaseCpuThreadState) { if (Enabled) { HleCallback[] HleCallbackListCopy; lock (HleCallbackList) { HleCallbackListCopy = HleCallbackList.ToArray(); HleCallbackList.Clear(); } foreach (var HleCallback in HleCallbackListCopy) { var FakeCpuThreadState = new CpuThreadState(CpuProcessor); FakeCpuThreadState.CopyRegistersFrom(BaseCpuThreadState); HleCallback.SetArgumentsToCpuThreadState(FakeCpuThreadState); HleInterop.Execute(FakeCpuThreadState); //Console.Error.WriteLine("Execute queued"); // Execute just one! break; } } }
public int ExecuteQueued(CpuThreadState CpuThreadState, bool MustReschedule) { int ExecutedCount = 0; if (HasScheduledCallbacks) { //Console.Error.WriteLine("STARTED CALLBACKS"); while (HasScheduledCallbacks) { var HleCallback = DequeueScheduledCallback(); var FakeCpuThreadState = new CpuThreadState(CpuProcessor); FakeCpuThreadState.CopyRegistersFrom(CpuThreadState); HleCallback.SetArgumentsToCpuThreadState(FakeCpuThreadState); try { HleInterop.Execute(FakeCpuThreadState); } finally { ExecutedCount++; } //Console.Error.WriteLine(" CALLBACK ENDED : " + HleCallback); if (MustReschedule) { //Console.Error.WriteLine(" RESCHEDULE"); break; } } //Console.Error.WriteLine("ENDED CALLBACKS"); } return(ExecutedCount); }