@@ -28,7 +28,6 @@ private class InitializationTracker : IDisposable
2828
2929 private bool _initializersRemain ;
3030 private bool _synchronizersRemain ;
31- private bool _fallbackRemain ;
3231
3332 private enum State
3433 {
@@ -46,6 +45,11 @@ private enum State
4645 /// The tracker has been informed that initializers are exhausted.
4746 /// </summary>
4847 InitializersExhausted ,
48+
49+ /// <summary>
50+ /// State entered when we have been informed that we are falling back to FDv1.
51+ /// </summary>
52+ FallingBack ,
4953
5054 /// <summary>
5155 /// The tracker is initialized and is no longer processing updates.
@@ -84,11 +88,16 @@ private enum Action
8488 /// We have received a selector.
8589 /// </summary>
8690 SelectorReceived ,
91+
92+ /// <summary>
93+ /// We are attempting to fallback to FDv1.
94+ /// </summary>
95+ FallingBack ,
8796 }
8897
89- public InitializationTracker ( bool hasInitializers , bool hasSynchronizers , bool hasFallback )
98+ public InitializationTracker ( bool hasInitializers , bool hasSynchronizers )
9099 {
91- if ( ! ( hasInitializers || hasSynchronizers || hasFallback ) )
100+ if ( ! ( hasInitializers || hasSynchronizers ) )
92101 {
93102 // If we have no data sources, then we are immediately initialized.
94103 _state = State . Initialized ;
@@ -98,7 +107,6 @@ public InitializationTracker(bool hasInitializers, bool hasSynchronizers, bool h
98107
99108 _initializersRemain = hasInitializers ;
100109 _synchronizersRemain = hasSynchronizers ;
101- _fallbackRemain = hasFallback ;
102110
103111 if ( ! hasInitializers )
104112 {
@@ -108,11 +116,10 @@ public InitializationTracker(bool hasInitializers, bool hasSynchronizers, bool h
108116
109117 public Task < bool > Task => _taskCompletionSource . Task ;
110118
111- private bool RemainingSources => _initializersRemain || _synchronizersRemain || _fallbackRemain ;
112-
113119 private void HandleRemainingSources ( )
114120 {
115- if ( ! RemainingSources )
121+ // We only consider fallback if we have transitioned to fallback.
122+ if ( ! _initializersRemain && ! _synchronizersRemain )
116123 {
117124 _state = State . Failed ;
118125 }
@@ -145,8 +152,9 @@ private void DetermineState(Action action)
145152 HandleRemainingSources ( ) ;
146153 break ;
147154 case Action . FallbackExhausted :
148- _fallbackRemain = false ;
149- HandleRemainingSources ( ) ;
155+ // This would indicate that we skipped going through the fallback
156+ // process. So this generally shouldn't be an achievable state.
157+ _state = State . Failed ;
150158 break ;
151159 }
152160
@@ -160,6 +168,7 @@ private void DetermineState(Action action)
160168 case Action . FallbackExhausted :
161169 case Action . InitializersExhausted :
162170 case Action . SelectorReceived :
171+ case Action . FallingBack :
163172 _state = State . Initialized ;
164173 break ;
165174 }
@@ -175,8 +184,30 @@ private void DetermineState(Action action)
175184 HandleRemainingSources ( ) ;
176185 break ;
177186 case Action . FallbackExhausted :
178- _fallbackRemain = false ;
179- HandleRemainingSources ( ) ;
187+ // This would indicate that we skipped going through the fallback
188+ // process. So this generally shouldn't be an achievable state.
189+ _state = State . Failed ;
190+ break ;
191+
192+ case Action . FallingBack :
193+ _state = State . FallingBack ;
194+ break ;
195+ case Action . DataReceived :
196+ case Action . SelectorReceived :
197+ _state = State . Initialized ;
198+ break ;
199+ }
200+
201+ break ;
202+ case State . FallingBack :
203+ switch ( action )
204+ {
205+ case Action . FallingBack :
206+ case Action . InitializersExhausted :
207+ case Action . SynchronizersExhausted :
208+ break ;
209+ case Action . FallbackExhausted :
210+ _state = State . Failed ;
180211 break ;
181212 case Action . DataReceived :
182213 case Action . SelectorReceived :
@@ -231,8 +262,11 @@ public void UpdateStatus(DataSourceState newState, DataSourceStatus.ErrorInfo? n
231262 DetermineState ( Action . FallbackExhausted ) ;
232263 break ;
233264 }
234- default :
265+ case DataSourceCategory . FallbackSynchronizers when newState == DataSourceState . Initializing :
266+ {
267+ DetermineState ( Action . FallingBack ) ;
235268 break ;
269+ }
236270 }
237271 }
238272
0 commit comments