private static IEnumerator ReleaseSynchronizationBarrier() { SynchronizationBarrier synchronizationBarrier = s_synchronizationBarrier; long barrierId = synchronizationBarrier.id; if (synchronizationBarrier.counter == 0) { Log.Error("Synchronization error: tried to release a barrier but no barrier is currently setup.", 69, "C:\\BuildAgents\\AgentB\\work\\cub_client_win64_develop\\client\\DofusCube.Unity\\Assets\\Core\\Code\\Fight\\FightLogicExecutor.Synchronization.cs"); yield break; } int instanceCount = s_instances.Length; while (s_synchronizationBarrier.maxCounter != instanceCount) { yield return(null); if (!s_running) { break; } } s_synchronizationBarrier = SynchronizationBarrier.Downgrade(s_synchronizationBarrier); do { synchronizationBarrier = s_synchronizationBarrier; if (synchronizationBarrier.id == barrierId && synchronizationBarrier.counter != 0) { yield return(null); continue; } break; }while (s_running); }
private static IEnumerator Run() { Instance[] array = s_instances; int instanceCount = array.Length; IEnumerator[] routines = new IEnumerator[instanceCount]; for (int i = 0; i < instanceCount; i++) { routines[i] = array[i].Tick(); } while (s_running) { for (int j = 0; j < instanceCount; j++) { CollectionsExtensions.MoveNextRecursiveImmediateSafe(routines[j], null); } yield return(null); } for (int k = 0; k < instanceCount; k++) { s_instances[k].Clear(); } s_instances = null; s_synchronizationBarrierId = 0L; s_synchronizationBarrier = default(SynchronizationBarrier); }
private static IEnumerator SetupSynchronizationBarrier() { SynchronizationBarrier synchronizationBarrier = s_synchronizationBarrier; if (synchronizationBarrier.counter == 0) { s_synchronizationBarrier = new SynchronizationBarrier(s_synchronizationBarrierId++); } else if (synchronizationBarrier.maxCounter == s_instances.Length) { Log.Error("Synchronization error: tried to setup a barrier but the current barrier has already reached all instances.", 55, "C:\\BuildAgents\\AgentB\\work\\cub_client_win64_develop\\client\\DofusCube.Unity\\Assets\\Core\\Code\\Fight\\FightLogicExecutor.Synchronization.cs"); } else { s_synchronizationBarrier = SynchronizationBarrier.Upgrade(synchronizationBarrier); } yield break; }
public static SynchronizationBarrier Downgrade(SynchronizationBarrier barrier) { return(new SynchronizationBarrier(barrier.id, barrier.counter - 1, barrier.maxCounter)); }