10 public partial class Fiber {
12 public readonly Fifo<Worker>
Workers = Fifo<Worker>.Instance;
15 public abstract class Worker : IDisposable {
21 private protected static void Deactivate(LinkedList<Fiber>.Node node) => node.MoveTo(node.Item.Workers.Top.From);
23 private protected static int Compare(LinkedList<Fiber>.Node left, LinkedList<Fiber>.Node right) =>
24 left.Item.
Workers.Top?.CompareTo(right.Item.Workers.Top) ?? ((right.Item.Workers.Top == null) ? 0 : -1);
33 public virtual void Step() { }
39 public override string ToString() => Name;
42 protected abstract bool Prepare();
45 protected abstract void Recycle();
49 Fiber.node.MoveTo(From);
65 Name = $
"{GetType()}-{Uid += 1}";
73 private protected static int Uid;
78 fiber.Workers.Push(
this);
79 From = (Queue) fiber.node.Owner;
80 fiber.node.MoveTo(Queue);
83 internal static readonly Queue Queue =
new Queue {CompareItem = Compare, DeactivateItem = Deactivate};
89 private static readonly
Action onUpdate = (fiber) => {
90 var node = Queue.First;
91 while (node?.Item.Workers.Top?.NoMore ==
false) {
93 node.Item.Workers.Top.Step();
virtual bool NoMore
Implement to stop scanning based on sort order
abstract void Recycle()
Implement anything needed before worker is placed in recycle bin
Abstract code to implement a worker
lightweight cooperative multi-tasking
override string ToString()
Return Fiber contents and current state
virtual void Dispose()
Move Fiber back to queue it came from
string Name
Name from worker class name
Fiber Load(Fiber fiber, T data)
Load happens when we are building up a list of actions
Fiber Fiber
Fiber that owns this worker instance
Fiber Go()
Start a fiber if it is not already running
readonly Fifo< Worker > Workers
List of workers associated with Fiber actions
virtual void Step()
Implement on processing worker (usually calls dispose)
static bool NeedsUpdates
Set to false for workers that do not need calls on frame update
static Fiber Instance
Precompile an instance of a fiber command
virtual int CompareTo(Worker other)
Implement for worker queue order
abstract bool Prepare()
Do any preparation to payload here
void ActivateWorker(Fiber fiber)
Move fiber to worker queue and start processing
delegate void Action(Fiber fiber)
Method signature for Do(Action) methods