public FCgRoutine Start(FCgCoroutinePayload payload) { FECgCoroutineSchedule schedule = payload.Schedule; FCgRoutine r = Allocate_Internal(schedule); if (r == null) { payload.Reset(); return(null); } // If NO Head, Make r the Head if (Heads[schedule] == null) { Heads[schedule] = r; Tails[schedule] = r; } // Add r end of the list, Make r the Tail else { FCgRoutine tail = Tails[schedule]; tail.Next = r; r.Prev = tail; Tails[schedule] = r; } RoutinesRunning[schedule].Add(r); // TODO: get Time from Manager_Time r.Start(payload.Fiber, payload.Stop, payload.Owner, payload.OwnerName, payload.StartTime, payload.Add, payload.Remove, payload.RoutineType); r.State = ECgRoutineState.Running; LogTransaction(ECgCoroutineSchedulerCached.Str.Start, ECgCoroutineTransaction.Start, r); payload.Reset(); r.Run(0.0f); return(r); }
public FCgRoutine Start(FECgCoroutineSchedule schedule, FCgRoutine r) { // If NO Head, Make r the Head if (Heads[schedule] == null) { Heads[schedule] = r; Tails[schedule] = r; } // Add r end of the list, Make r the Tail else { FCgRoutine tail = Tails[schedule]; tail.Next = r; r.Prev = tail; Tails[schedule] = r; } RoutinesRunning[schedule].Add(r); r.State = ECgRoutineState.Running; r.Run(0.0f); return(r); }
public void Update(FECgCoroutineSchedule schedule, float deltaTime) { // Iterate through List FCgRoutine current = Heads[schedule]; while (current != null) { if (current.State == ECgRoutineState.Running) { current.Run(deltaTime); } if (current.State == ECgRoutineState.End) { // Remove from List, Update Linkage. Prev / Next if (current.Prev != null) { current.Prev.Next = current.Next; if (current.Next != null) { current.Next.Prev = current.Prev; } // Update Tail else { Tails[schedule] = current.Prev; } } // Update Head else { if (current.Next != null) { current.Next.Prev = null; Heads[schedule] = current.Next; } // Last node in List else { Heads[schedule] = null; Tails[schedule] = null; } } LogTransaction("FCgRoutine.Update", ECgCoroutineTransaction.End, current); FCgRoutine r = current; current = current.Next; r.Reset(); } else { current = current.Next; } } // Check RoutinesRunning for any Routines that have Ended int count = RoutinesRunning[schedule].Count; for (int i = count - 1; i >= 0; --i) { FCgRoutine r = RoutinesRunning[schedule][i]; if (r.State == ECgRoutineState.Free) { RoutinesRunning[schedule].RemoveAt(i); } else if (r.State == ECgRoutineState.End) { if (r.EndReason == ECgCoroutineEndReason.EndOfExecution || r.EndReason == ECgCoroutineEndReason.Parent) { Debug.LogError("CgCoroutineSchedule.Update: Dangling Routine. Check iteration through List or if Routine was tampered with."); } r.Reset(); RoutinesRunning[schedule].RemoveAt(i); } } }