Exemple #1
0
        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.");
        }
Exemple #2
0
        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;
            }
        }
Exemple #5
0
            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);
            }