FiberContinuation.cs
Go to the documentation of this file.
1 using System;
2 
3 namespace SpicyPixel.Threading
4 {
5  class FiberContinuation
6  {
7  Fiber fiber;
9  FiberScheduler scheduler;
10 
11  public FiberContinuation(Fiber fiber, FiberContinuationOptions options, FiberScheduler scheduler)
12  {
13  this.fiber = fiber;
14  this.options = options;
15  this.scheduler = scheduler;
16  }
17 
18  bool ContinuationStateCheck (FiberContinuationOptions options)
19  {
20  if (options == FiberContinuationOptions.None)
21  return true;
22 
23  int optionCode = (int) options;
24  var status = fiber.antecedent.Status;
25 
26  if (optionCode >= ((int) FiberContinuationOptions.NotOnRanToCompletion)) {
27  if (status == FiberStatus.Canceled) {
28  if (options == FiberContinuationOptions.NotOnCanceled)
29  return false;
30  if (options == FiberContinuationOptions.OnlyOnFaulted)
31  return false;
32  if (options == FiberContinuationOptions.OnlyOnRanToCompletion)
33  return false;
34  } else if (status == FiberStatus.Faulted) {
35  if (options == FiberContinuationOptions.NotOnFaulted)
36  return false;
37  if (options == FiberContinuationOptions.OnlyOnCanceled)
38  return false;
39  if (options == FiberContinuationOptions.OnlyOnRanToCompletion)
40  return false;
41  } else if (status == FiberStatus.RanToCompletion) {
42  if (options == FiberContinuationOptions.NotOnRanToCompletion)
43  return false;
44  if (options == FiberContinuationOptions.OnlyOnFaulted)
45  return false;
46  if (options == FiberContinuationOptions.OnlyOnCanceled)
47  return false;
48  }
49  }
50 
51  return true;
52  }
53 
54  public void Execute()
55  {
56  // In case ran, faulted, canceled externally
57  if (fiber.IsCompleted)
58  return;
59 
60  // Cancel the fiber if criteria is not met
61  if (!ContinuationStateCheck (options)) {
62  fiber.CancelContinuation();
63  return;
64  }
65 
66  fiber.Start (scheduler);
67  }
68  }
69 }
70 
FiberContinuationOptions
Specifies the behavior for a fiber that is created by using the Fiber.ContinueWith method...
FiberStatus
Represents the current state of a fiber.
Definition: FiberStatus.cs:34