예제 #1
0
        /// <summary>
        /// Called after Service DynamicResetState.
        /// </summary>
        public void DynamicResetState()
        {
            switch (FinalConfigSolvedStatus)
            {
            case SolvedConfigurationStatus.Disabled:
            {
                _dynamicReason = PluginRunningStatusReason.StoppedByConfig;
                _dynamicStatus = RunningStatus.Disabled;
                break;
            }

            case SolvedConfigurationStatus.Running:
            {
                Debug.Assert(Service == null || (Service.Family.RunningPlugin == this));
                _dynamicReason = PluginRunningStatusReason.StartedByConfig;
                _dynamicStatus = RunningStatus.RunningLocked;
                break;
            }

            default:
            {
                Debug.Assert(Service == null || !Service.Disabled);
                _dynamicReason = PluginRunningStatusReason.None;
                _dynamicStatus = null;
                break;
            }
            }
        }
예제 #2
0
 /// <summary>
 /// Called after Service DynamicResetState.
 /// </summary>
 public void DynamicResetState()
 {
     switch( FinalConfigSolvedStatus )
     {
         case SolvedConfigurationStatus.Disabled:
             {
                 _dynamicReason = PluginRunningStatusReason.StoppedByConfig;
                 _dynamicStatus = RunningStatus.Disabled;
                 break;
             }
         case SolvedConfigurationStatus.Running:
             {
                 Debug.Assert( Service == null || (Service.Family.RunningPlugin == this) );
                 _dynamicReason = PluginRunningStatusReason.StartedByConfig;
                 _dynamicStatus = RunningStatus.RunningLocked;
                 break;
             }
         default:
             {
                 Debug.Assert( Service == null || !Service.Disabled );
                 _dynamicReason = PluginRunningStatusReason.None;
                 _dynamicStatus = null;
                 break;
             }
     }
 }
예제 #3
0
 public bool DynamicStartByCommand( StartDependencyImpact impact )
 {
     if( _dynamicStatus != null ) return _dynamicStatus.Value >= RunningStatus.Running;
     if( impact == StartDependencyImpact.Unknown ) impact = ConfigSolvedImpact;
     if( !DynTestCanStart( impact ) ) return false;
     _dynamicStatus = RunningStatus.Running;
     _dynamicReason = PluginRunningStatusReason.StartedByCommand;
     DynamicStartBy( impact, PluginRunningStatusReason.StartedByCommand );
     return true;
 }
예제 #4
0
 internal void DynamicStopBy(PluginRunningStatusReason reason)
 {
     Debug.Assert(_dynamicStatus == null);
     Debug.Assert(reason != PluginRunningStatusReason.None);
     _dynamicStatus = RunningStatus.Stopped;
     _dynamicReason = reason;
     if (Service != null)
     {
         Service.OnPluginStopped(true);
         Service.OnPostPluginStopped();
     }
 }
예제 #5
0
 public bool DynamicStartByCommand(StartDependencyImpact impact)
 {
     if (_dynamicStatus != null)
     {
         return(_dynamicStatus.Value >= RunningStatus.Running);
     }
     if (impact == StartDependencyImpact.Unknown)
     {
         impact = ConfigSolvedImpact;
     }
     if (!DynTestCanStart(impact))
     {
         return(false);
     }
     _dynamicStatus = RunningStatus.Running;
     _dynamicReason = PluginRunningStatusReason.StartedByCommand;
     DynamicStartBy(impact, PluginRunningStatusReason.StartedByCommand);
     return(true);
 }
예제 #6
0
        internal void DynamicStartBy(StartDependencyImpact impact, PluginRunningStatusReason reason)
        {
            Debug.Assert(_dynamicStatus == null || _dynamicStatus.Value >= RunningStatus.Running);
            if (_dynamicStatus == null)
            {
                _dynamicStatus = RunningStatus.Running;
                _dynamicReason = reason;
            }
            if (Service != null)
            {
                Service.OnDirectPluginStarted(this);
            }

            foreach (var sRef in PluginInfo.ServiceReferences)
            {
                ServiceData s = _solver.FindExistingService(sRef.Reference.ServiceFullName);
                s.DynamicStartByDependency(impact, sRef.Requirement);
            }
        }
예제 #7
0
        internal void DynamicStopBy(ServiceRunningStatusReason reason)
        {
            Debug.Assert(_dynamicStatus == null);
            Debug.Assert(reason == ServiceRunningStatusReason.StoppedByGeneralization ||
                         reason == ServiceRunningStatusReason.StoppedByCommand ||
                         reason == ServiceRunningStatusReason.StoppedByPluginStopped ||
                         reason == ServiceRunningStatusReason.StoppedBySiblingRunningService ||
                         reason == ServiceRunningStatusReason.StoppedByOptionalReference ||
                         reason == ServiceRunningStatusReason.StoppedByOptionalRecommendedReference ||
                         reason == ServiceRunningStatusReason.StoppedByRunnableReference ||
                         reason == ServiceRunningStatusReason.StoppedByRunnableRecommendedReference ||
                         reason == ServiceRunningStatusReason.StoppedByFinalDecision);

            _dynamicStatus = RunningStatus.Stopped;
            _dynamicReason = reason;
            for (int i = 0; i < _inheritedServicesWithThis.Length - 1; ++i)
            {
                --_inheritedServicesWithThis[i]._dynamicAvailableServicesCount;
            }

            if (_dynamicTotalAvailablePluginsCount > 0)
            {
                // Stops the specialized services.
                ServiceData child = FirstSpecialization;
                while (child != null)
                {
                    Debug.Assert(child.DynamicStatus == null || child.DynamicStatus.Value <= RunningStatus.Stopped);
                    if (child.DynamicStatus == null)
                    {
                        child.DynamicStopBy(ServiceRunningStatusReason.StoppedByGeneralization);
                    }
                    child = child.NextSpecialization;
                }
                // Stops the plugins.
                PluginData p = FirstPlugin;
                while (p != null)
                {
                    Debug.Assert(p.DynamicStatus == null || p.DynamicStatus.Value <= RunningStatus.Stopped);
                    if (p.DynamicStatus == null)
                    {
                        p.DynamicStopBy(PluginRunningStatusReason.StoppedByStoppedService);
                    }
                    p = p.NextPluginForService;
                }
                Debug.Assert(_dynamicTotalAvailablePluginsCount == 0);
            }
            foreach (var backRef in _backReferences)
            {
                Debug.Assert(backRef.PluginData.DynamicStatus == null ||
                             backRef.PluginData.DynamicStatus.Value <= RunningStatus.Stopped ||
                             ((backRef.Requirement == DependencyRequirement.Optional || backRef.Requirement == DependencyRequirement.Runnable) && backRef.PluginData.ConfigSolvedImpact != StartDependencyImpact.FullStart) ||
                             ((backRef.Requirement == DependencyRequirement.OptionalRecommended || backRef.Requirement == DependencyRequirement.RunnableRecommended) && backRef.PluginData.ConfigSolvedImpact < StartDependencyImpact.StartRecommended));
                if (backRef.PluginData.DynamicStatus == null)
                {
                    PluginRunningStatusReason r = backRef.PluginData.GetStoppedReasonForStoppedReference(backRef.Requirement);
                    if (r != PluginRunningStatusReason.None)
                    {
                        backRef.PluginData.DynamicStopBy(r);
                    }
                }
            }
        }
예제 #8
0
 internal void DynamicStopBy( PluginRunningStatusReason reason )
 {
     Debug.Assert( _dynamicStatus == null );
     Debug.Assert( reason != PluginRunningStatusReason.None );
     _dynamicStatus = RunningStatus.Stopped;
     _dynamicReason = reason;
     if( Service != null )
     {
         Service.OnPluginStopped( true );
         Service.OnPostPluginStopped();
     }
 }
예제 #9
0
        internal void DynamicStartBy( StartDependencyImpact impact, PluginRunningStatusReason reason )
        {
            Debug.Assert( _dynamicStatus == null || _dynamicStatus.Value >= RunningStatus.Running );
            if( _dynamicStatus == null )
            {
                _dynamicStatus = RunningStatus.Running;
                _dynamicReason = reason;
            }
            if( Service != null ) Service.OnDirectPluginStarted( this );

            foreach( var sRef in PluginInfo.ServiceReferences )
            {
                ServiceData s = _solver.FindExistingService( sRef.Reference.ServiceFullName );
                s.DynamicStartByDependency( impact, sRef.Requirement );
            }
        }