internal void SetDisabled(ServiceDisabledReason r) { Debug.Assert(r != ServiceDisabledReason.None); Debug.Assert(_configDisabledReason == ServiceDisabledReason.None); _configDisabledReason = r; for (int i = 0; i < _inheritedServicesWithThis.Length - 1; ++i) { --_inheritedServicesWithThis[i].AvailableServiceCount; } if (Family.Solver.Step > ConfigurationSolverStep.OnAllPluginsAdded) { Debug.Assert(Family.AvailableServices.Contains(this)); Family.AvailableServices.Remove(this); } ServiceData spec = FirstSpecialization; while (spec != null) { if (!spec.Disabled) { spec.SetDisabled(ServiceDisabledReason.GeneralizationIsDisabled); } spec = spec.NextSpecialization; } PluginData plugin = FirstPlugin; while (plugin != null) { if (!plugin.Disabled) { plugin.SetDisabled(PluginDisabledReason.ServiceIsDisabled); } plugin = plugin.NextPluginForService; } foreach (var backRef in _backReferences) { PluginDisabledReason reason = backRef.PluginData.GetDisableReasonForDisabledReference(backRef.Requirement); if (reason != PluginDisabledReason.None && !backRef.PluginData.Disabled) { backRef.PluginData.SetDisabled(reason); } } Debug.Assert(Family.RunningService != this || _inheritedServicesWithThis.All(s => s.Disabled), "If we were the RunningService, no one else is running."); }
void Initialize() { switch (ConfigOriginalStatus) { case ConfigurationStatus.Disabled: _configSolvedStatus = SolvedConfigurationStatus.Disabled; break; case ConfigurationStatus.Running: _configSolvedStatus = SolvedConfigurationStatus.Running; break; default: _configSolvedStatus = SolvedConfigurationStatus.Runnable; break; } _configSolvedStatusReason = ServiceSolvedConfigStatusReason.Config; if (ConfigOriginalStatus == ConfigurationStatus.Disabled) { _configDisabledReason = ServiceDisabledReason.Config; } else if (ServiceInfo.HasError) { _configDisabledReason = ServiceDisabledReason.ServiceInfoHasError; } else if (Generalization != null && Generalization.Disabled) { _configDisabledReason = ServiceDisabledReason.GeneralizationIsDisabledByConfig; } if (Disabled) { _configSolvedStatusReason = ServiceSolvedConfigStatusReason.Config; } else if (ConfigOriginalStatus == ConfigurationStatus.Running) { Family.SetRunningService(this, ServiceSolvedConfigStatusReason.Config); } else if (Family.RunningService != null && !Family.RunningService.IsStrictGeneralizationOf(this)) { _configDisabledReason = ServiceDisabledReason.AnotherServiceIsRunningByConfig; } }
internal void SetDisabled( ServiceDisabledReason r ) { Debug.Assert( r != ServiceDisabledReason.None ); Debug.Assert( _configDisabledReason == ServiceDisabledReason.None ); _configDisabledReason = r; for( int i = 0; i < _inheritedServicesWithThis.Length - 1; ++i ) --_inheritedServicesWithThis[i].AvailableServiceCount; if( Family.Solver.Step > ConfigurationSolverStep.OnAllPluginsAdded ) { Debug.Assert( Family.AvailableServices.Contains( this ) ); Family.AvailableServices.Remove( this ); } ServiceData spec = FirstSpecialization; while( spec != null ) { if( !spec.Disabled ) spec.SetDisabled( ServiceDisabledReason.GeneralizationIsDisabled ); spec = spec.NextSpecialization; } PluginData plugin = FirstPlugin; while( plugin != null ) { if( !plugin.Disabled ) plugin.SetDisabled( PluginDisabledReason.ServiceIsDisabled ); plugin = plugin.NextPluginForService; } foreach( var backRef in _backReferences ) { PluginDisabledReason reason = backRef.PluginData.GetDisableReasonForDisabledReference( backRef.Requirement ); if( reason != PluginDisabledReason.None && !backRef.PluginData.Disabled ) backRef.PluginData.SetDisabled( reason ); } Debug.Assert( Family.RunningService != this || _inheritedServicesWithThis.All( s => s.Disabled ), "If we were the RunningService, no one else is running." ); }
void Initialize() { switch( ConfigOriginalStatus ) { case ConfigurationStatus.Disabled: _configSolvedStatus = SolvedConfigurationStatus.Disabled; break; case ConfigurationStatus.Running: _configSolvedStatus = SolvedConfigurationStatus.Running; break; default: _configSolvedStatus = SolvedConfigurationStatus.Runnable; break; } _configSolvedStatusReason = ServiceSolvedConfigStatusReason.Config; if( ConfigOriginalStatus == ConfigurationStatus.Disabled ) { _configDisabledReason = ServiceDisabledReason.Config; } else if( ServiceInfo.HasError ) { _configDisabledReason = ServiceDisabledReason.ServiceInfoHasError; } else if( Generalization != null && Generalization.Disabled ) { _configDisabledReason = ServiceDisabledReason.GeneralizationIsDisabledByConfig; } if( Disabled ) { _configSolvedStatusReason = ServiceSolvedConfigStatusReason.Config; } else if( ConfigOriginalStatus == ConfigurationStatus.Running ) { Family.SetRunningService( this, ServiceSolvedConfigStatusReason.Config ); } else if( Family.RunningService != null && !Family.RunningService.IsStrictGeneralizationOf( this ) ) { _configDisabledReason = ServiceDisabledReason.AnotherServiceIsRunningByConfig; } }
public bool SetRunningService(ServiceData s, ServiceSolvedConfigStatusReason reason) { Debug.Assert(s != null && s.Family == this); if (s._configSolvedStatus != SolvedConfigurationStatus.Running) { s._configSolvedStatus = SolvedConfigurationStatus.Running; s._configSolvedStatusReason = reason; } if (_runningService == s) { return(!s.Disabled); } if (s.Disabled) { return(false); } if (_runningService != null) { // If there is already a current running service, we ONLY accept a more specialized // running service than the current one: if this service is not a specialization, we reject the change. if (!_runningService.IsStrictGeneralizationOf(s)) { ServiceDisabledReason r = Solver.Step == ConfigurationSolverStep.RegisterServices ? ServiceDisabledReason.AnotherServiceIsRunningByConfig : ServiceDisabledReason.AnotherServiceRunningInFamily; s.SetDisabled(r); if (!Root.Disabled) { Root.SetDisabled(ServiceDisabledReason.AtLeastTwoSpecializationsMustRun); } return(false); } } if (_runningPlugin != null) { if (!s.IsGeneralizationOf(_runningPlugin.Service)) { s.SetDisabled(ServiceDisabledReason.PluginRunningElsewhere); return(false); } } // We first set a running configSolvedStatus from this service up to the root. // We do not propagate anything here since the most specialized service necessarily "contains" // the propagation of its ancestors. var g = s.Generalization; while (g != null) { if (g._configSolvedStatus != SolvedConfigurationStatus.Running) { g._configSolvedStatus = SolvedConfigurationStatus.Running; g._configSolvedStatusReason = ServiceSolvedConfigStatusReason.FromRunningSpecialization; } g = g.Generalization; } var prevRunningService = _runningService; _runningService = s; // We must now disable all sibling services (and plugins) from this up to the currently running one and // when the current one is null, up to the root. g = s.Generalization; var specRunning = s; while (g != null) { var spec = g.FirstSpecialization; while (spec != null) { if (spec != specRunning && !spec.Disabled) { spec.SetDisabled(ServiceDisabledReason.SiblingSpecializationRunning); } spec = spec.NextSpecialization; } PluginData p = g.FirstPlugin; while (p != null) { if (!p.Disabled) { p.SetDisabled(PluginDisabledReason.ServiceSpecializationRunning); } p = p.NextPluginForService; } specRunning = g; g = g.Generalization; if (prevRunningService != null && g == prevRunningService.Generalization) { break; } } return(!s.Disabled); }