Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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;
        }
Пример #4
0
 public static SynchronizationBarrier Downgrade(SynchronizationBarrier barrier)
 {
     return(new SynchronizationBarrier(barrier.id, barrier.counter - 1, barrier.maxCounter));
 }