Пример #1
0
        private void HandleRunspaceAvailabilityChanged(object sender, RunspaceAvailabilityEventArgs e)
        {
            // Ignore nested commands.
            LocalRunspace localRunspace = sender as LocalRunspace;

            if (localRunspace != null)
            {
                var basePowerShell = localRunspace.GetCurrentBasePowerShell();
                if ((basePowerShell != null) && (basePowerShell.IsNested))
                {
                    return;
                }
            }

            RunspaceAvailability prevAvailability = _previousRunspaceAvailability;

            _previousRunspaceAvailability = e.RunspaceAvailability;

            if ((e.RunspaceAvailability == RunspaceAvailability.Available) || (e.RunspaceAvailability == RunspaceAvailability.None))
            {
                _debugBlockingCollection.Complete();
            }
            else if ((e.RunspaceAvailability == RunspaceAvailability.Busy) &&
                     ((prevAvailability == RunspaceAvailability.Available) || (prevAvailability == RunspaceAvailability.None)))
            {
                _newRunningScriptEvent.Set();
            }
        }
Пример #2
0
        /// <summary>
        /// Sets the new execution state.
        /// </summary>
        /// <param name="state">The new state.</param>
        /// <param name="reason">
        /// An exception indicating that state change is the result of an error,
        /// otherwise; null.
        /// </param>
        /// <remarks>
        /// Sets the internal execution state information member variable. It
        /// also adds PipelineStateInfo to a queue. RaisePipelineStateEvents
        /// raises event for each item in this queue.
        /// </remarks>
        protected void SetPipelineState(PipelineState state, Exception reason)
        {
            lock (SyncRoot)
            {
                if (state != PipelineState)
                {
                    _pipelineStateInfo = new PipelineStateInfo(state, reason);

                    // Add _pipelineStateInfo to _executionEventQueue.
                    // RaisePipelineStateEvents will raise event for each item
                    // in this queue.
                    // Note:We are doing clone here instead of passing the member
                    // _pipelineStateInfo because we donot want outside
                    // to change pipeline state.
                    RunspaceAvailability previousAvailability = _runspace.RunspaceAvailability;

                    _runspace.UpdateRunspaceAvailability(_pipelineStateInfo.State, false);

                    _executionEventQueue.Enqueue(
                        new ExecutionEventQueueItem(
                            _pipelineStateInfo.Clone(),
                            previousAvailability,
                            _runspace.RunspaceAvailability));
                }
            }
        }
Пример #3
0
 public ExecutionEventQueueItem(
     PipelineStateInfo pipelineStateInfo,
     RunspaceAvailability currentAvailability,
     RunspaceAvailability newAvailability)
 {
     this.PipelineStateInfo           = pipelineStateInfo;
     this.CurrentRunspaceAvailability = currentAvailability;
     this.NewRunspaceAvailability     = newAvailability;
 }
Пример #4
0
 public RunspaceEventQueueItem(
     RunspaceStateInfo runspaceStateInfo,
     RunspaceAvailability currentAvailability,
     RunspaceAvailability newAvailability)
 {
     this.RunspaceStateInfo           = runspaceStateInfo;
     this.CurrentRunspaceAvailability = currentAvailability;
     this.NewRunspaceAvailability     = newAvailability;
 }
Пример #5
0
 protected void SetPipelineState(System.Management.Automation.Runspaces.PipelineState state, Exception reason)
 {
     lock (this.SyncRoot)
     {
         if (state != this.PipelineState)
         {
             this._pipelineStateInfo = new System.Management.Automation.Runspaces.PipelineStateInfo(state, reason);
             RunspaceAvailability runspaceAvailability = this._runspace.RunspaceAvailability;
             this._runspace.UpdateRunspaceAvailability(this._pipelineStateInfo.State, false);
             this._executionEventQueue.Enqueue(new ExecutionEventQueueItem(this._pipelineStateInfo.Clone(), runspaceAvailability, this._runspace.RunspaceAvailability));
         }
     }
 }
Пример #6
0
        private void SetPipelineState(PipelineState state, Exception reason)
        {
            using (RemotePipeline._trace.TraceMethod("{0} to {1} {2}", (object)this._pipelineStateInfo.State, (object)state, reason != null ? (object)reason.Message : (object)""))
            {
                PipelineState     state1            = state;
                PipelineStateInfo pipelineStateInfo = (PipelineStateInfo)null;
                lock (this._syncRoot)
                {
                    switch (this._pipelineStateInfo.State)
                    {
                    case PipelineState.Running:
                        if (state == PipelineState.Running)
                        {
                            return;
                        }
                        break;

                    case PipelineState.Stopping:
                        if (state == PipelineState.Running || state == PipelineState.Stopping)
                        {
                            return;
                        }
                        state1 = PipelineState.Stopped;
                        break;

                    case PipelineState.Stopped:
                        return;

                    case PipelineState.Completed:
                        return;

                    case PipelineState.Failed:
                        return;
                    }
                    this._pipelineStateInfo = new PipelineStateInfo(state1, reason);
                    pipelineStateInfo       = this._pipelineStateInfo;
                    RunspaceAvailability runspaceAvailability = this._runspace.RunspaceAvailability;
                    this._runspace.UpdateRunspaceAvailability(this._pipelineStateInfo.State, false);
                    this._executionEventQueue.Enqueue(new RemotePipeline.ExecutionEventQueueItem(this._pipelineStateInfo.Clone(), runspaceAvailability, this._runspace.RunspaceAvailability));
                }
                if (pipelineStateInfo.State != PipelineState.Completed && pipelineStateInfo.State != PipelineState.Failed && pipelineStateInfo.State != PipelineState.Stopped)
                {
                    return;
                }
                this.Cleanup();
            }
        }
Пример #7
0
 protected void SetPipelineState(PipelineState state, Exception reason)
 {
     using (PipelineBase._trace.TraceMethod("{0} to {1} {2}", (object)this.PipelineState, (object)state, reason != null ? (object)reason.Message : (object)""))
     {
         lock (this.SyncRoot)
         {
             if (state == this.PipelineState)
             {
                 return;
             }
             this._pipelineStateInfo = new PipelineStateInfo(state, reason);
             RunspaceAvailability runspaceAvailability = this._runspace.RunspaceAvailability;
             this._runspace.UpdateRunspaceAvailability(this._pipelineStateInfo.State, false);
             this._executionEventQueue.Enqueue(new PipelineBase.ExecutionEventQueueItem(this._pipelineStateInfo.Clone(), runspaceAvailability, this._runspace.RunspaceAvailability));
         }
     }
 }
Пример #8
0
        private void SetPipelineState(PipelineState state, Exception reason)
        {
            PipelineState stopped = state;

            System.Management.Automation.Runspaces.PipelineStateInfo info = null;
            lock (this._syncRoot)
            {
                switch (this._pipelineStateInfo.State)
                {
                case PipelineState.Running:
                    if (state != PipelineState.Running)
                    {
                        goto Label_005F;
                    }
                    return;

                case PipelineState.Stopping:
                    if ((state != PipelineState.Running) && (state != PipelineState.Stopping))
                    {
                        break;
                    }
                    return;

                case PipelineState.Stopped:
                case PipelineState.Completed:
                case PipelineState.Failed:
                    return;

                default:
                    goto Label_005F;
                }
                stopped = PipelineState.Stopped;
Label_005F:
                this._pipelineStateInfo = new System.Management.Automation.Runspaces.PipelineStateInfo(stopped, reason);
                info = this._pipelineStateInfo;
                RunspaceAvailability runspaceAvailability = this._runspace.RunspaceAvailability;
                this._runspace.UpdateRunspaceAvailability(this._pipelineStateInfo.State, false);
                this._executionEventQueue.Enqueue(new ExecutionEventQueueItem(this._pipelineStateInfo.Clone(), runspaceAvailability, this._runspace.RunspaceAvailability));
            }
            if (((info.State == PipelineState.Completed) || (info.State == PipelineState.Failed)) || (info.State == PipelineState.Stopped))
            {
                this.Cleanup();
            }
        }
Пример #9
0
        private void OnDebuggerStop(InvocationInfo invocationInfo, List <Breakpoint> breakpoints)
        {
            LocalRunspace currentRunspace = this._context.CurrentRunspace as LocalRunspace;

            if ((currentRunspace.PulsePipeline != null) && (currentRunspace.PulsePipeline == currentRunspace.GetCurrentlyRunningPipeline()))
            {
                this._context.EngineHostInterface.UI.WriteWarningLine((breakpoints.Count > 0) ? string.Format(CultureInfo.CurrentCulture, DebuggerStrings.WarningBreakpointWillNotBeHit, new object[] { breakpoints[0] }) : new InvalidOperationException().Message);
            }
            else
            {
                this._steppingMode = SteppingMode.None;
                EventHandler <DebuggerStopEventArgs> debuggerStop = this.DebuggerStop;
                if (debuggerStop != null)
                {
                    this.InBreakpoint = true;
                    this._context.SetVariable(SpecialVariables.PSDebugContextVarPath, new PSDebugContext(invocationInfo, breakpoints));
                    FunctionInfo baseObject = null;
                    bool         flag       = false;
                    try
                    {
                        Collection <PSObject> collection = this._context.SessionState.InvokeProvider.Item.Get(@"function:\prompt");
                        if ((collection != null) && (collection.Count > 0))
                        {
                            baseObject = collection[0].BaseObject as FunctionInfo;
                            if (string.Equals(baseObject.Definition, InitialSessionState.DefaultPromptString, StringComparison.OrdinalIgnoreCase))
                            {
                                flag = true;
                            }
                        }
                    }
                    catch (ItemNotFoundException)
                    {
                    }
                    if (flag)
                    {
                        string script = "\"[DBG]: PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) \"";
                        baseObject.Update(ScriptBlock.Create(script), true, ScopedItemOptions.Unspecified);
                    }
                    PSLanguageMode languageMode = this._context.LanguageMode;
                    PSLanguageMode?nullable     = null;
                    if (this._context.UseFullLanguageModeInDebugger && (this._context.LanguageMode != PSLanguageMode.FullLanguage))
                    {
                        nullable = new PSLanguageMode?(this._context.LanguageMode);
                        this._context.LanguageMode = PSLanguageMode.FullLanguage;
                    }
                    else if (SystemPolicy.GetSystemLockdownPolicy() == SystemEnforcementMode.Enforce)
                    {
                        nullable = new PSLanguageMode?(this._context.LanguageMode);
                        this._context.LanguageMode = PSLanguageMode.ConstrainedLanguage;
                    }
                    RunspaceAvailability runspaceAvailability = this._context.CurrentRunspace.RunspaceAvailability;
                    this._context.CurrentRunspace.UpdateRunspaceAvailability((this._context.CurrentRunspace.GetCurrentlyRunningPipeline() != null) ? RunspaceAvailability.AvailableForNestedCommand : RunspaceAvailability.Available, true);
                    try
                    {
                        this._context._debuggingMode = -1;
                        if (this._callStack.Any <CallStackInfo>())
                        {
                            this._callStack.Last <CallStackInfo>().TopFrameAtBreakpoint = true;
                        }
                        DebuggerStopEventArgs e = new DebuggerStopEventArgs(invocationInfo, breakpoints);
                        debuggerStop(this, e);
                        this.ResumeExecution(e.ResumeAction);
                    }
                    finally
                    {
                        this._context._debuggingMode = 1;
                        if (this._callStack.Any <CallStackInfo>())
                        {
                            this._callStack.Last <CallStackInfo>().TopFrameAtBreakpoint = false;
                        }
                        this._context.CurrentRunspace.UpdateRunspaceAvailability(runspaceAvailability, true);
                        if (nullable.HasValue)
                        {
                            this._context.LanguageMode = nullable.Value;
                        }
                        this._context.EngineSessionState.RemoveVariable("PSDebugContext");
                        if (flag)
                        {
                            baseObject.Update(ScriptBlock.Create(InitialSessionState.DefaultPromptString), true, ScopedItemOptions.Unspecified);
                        }
                        this.InBreakpoint = false;
                    }
                }
            }
        }
Пример #10
0
 internal RunspaceAvailabilityEventArgs(RunspaceAvailability runspaceAvailability)
 {
     RunspaceAvailability = runspaceAvailability;
 }
Пример #11
0
 public ExecutionEventQueueItem(System.Management.Automation.Runspaces.PipelineStateInfo pipelineStateInfo, RunspaceAvailability currentAvailability, RunspaceAvailability newAvailability)
 {
     this.PipelineStateInfo = pipelineStateInfo;
     this.CurrentRunspaceAvailability = currentAvailability;
     this.NewRunspaceAvailability = newAvailability;
 }
Пример #12
0
 public RunspaceEventQueueItem(System.Management.Automation.Runspaces.RunspaceStateInfo runspaceStateInfo, RunspaceAvailability currentAvailability, RunspaceAvailability newAvailability)
 {
     this.RunspaceStateInfo           = runspaceStateInfo;
     this.CurrentRunspaceAvailability = currentAvailability;
     this.NewRunspaceAvailability     = newAvailability;
 }
Пример #13
0
 public ExecutionEventQueueItem(PipelineStateInfo pipelineStateInfo, RunspaceAvailability currentAvailability, RunspaceAvailability newAvailability)
 {
     this.PipelineStateInfo = pipelineStateInfo;
     this.CurrentRunspaceAvailability = currentAvailability;
     this.NewRunspaceAvailability = newAvailability;
 }
Пример #14
0
 public ExecutionEventQueueItem(System.Management.Automation.Runspaces.PipelineStateInfo pipelineStateInfo, RunspaceAvailability currentAvailability, RunspaceAvailability newAvailability)
 {
     this.PipelineStateInfo           = pipelineStateInfo;
     this.CurrentRunspaceAvailability = currentAvailability;
     this.NewRunspaceAvailability     = newAvailability;
 }
Пример #15
0
        private void SetRemoteDebug(bool remoteDebug, RunspaceAvailability? availability)
        {
            if (_runspace.RunspaceStateInfo.State != RunspaceState.Opened)
            {
                return;
            }

            if (IsRemoteDebug != remoteDebug)
            {
                IsRemoteDebug = remoteDebug;
                _runspace.RunspacePool.RemoteRunspacePoolInternal.IsRemoteDebugStop = remoteDebug;
            }

            if (availability != null)
            {
                RunspaceAvailability newAvailability = availability.Value;

                if ((_runspace.RunspaceAvailability != newAvailability) &&
                    (remoteDebug || (newAvailability != RunspaceAvailability.RemoteDebug)))
                {
                    try
                    {
                        _runspace.UpdateRunspaceAvailability(newAvailability, true);
                    }
                    catch (Exception e)
                    {
                        CommandProcessorBase.CheckForSevereException(e);
                    }
                }
            }
        }
Пример #16
0
 public RunspaceEventQueueItem(System.Management.Automation.Runspaces.RunspaceStateInfo runspaceStateInfo, RunspaceAvailability currentAvailability, RunspaceAvailability newAvailability)
 {
     this.RunspaceStateInfo = runspaceStateInfo;
     this.CurrentRunspaceAvailability = currentAvailability;
     this.NewRunspaceAvailability = newAvailability;
 }
Пример #17
0
 internal RunspaceAvailabilityEventArgs(RunspaceAvailability runspaceAvailability) => this._runspaceAvailability = runspaceAvailability;
Пример #18
0
 public RunspaceEventQueueItem(RunspaceStateInfo runspaceStateInfo, RunspaceAvailability currentAvailability, RunspaceAvailability newAvailability)
 {
     this.RunspaceStateInfo = runspaceStateInfo;
     this.CurrentRunspaceAvailability = currentAvailability;
     this.NewRunspaceAvailability = newAvailability;
 }
Пример #19
0
        /// <summary>
        /// Sets the new execution state.
        /// </summary>
        /// <param name="state">the new state</param>
        /// <param name="reason">
        /// An exception indicating that state change is the result of an error,
        /// otherwise; null.
        /// </param>
        /// <remarks>
        /// Sets the internal execution state information member variable. It
        /// also adds PipelineStateInfo to a queue. RaisePipelineStateEvents
        /// raises event for each item in this queue.
        /// </remarks>
        private void SetPipelineState(PipelineState state, Exception reason)
        {
            PipelineState     copyState     = state;
            PipelineStateInfo copyStateInfo = null;

            lock (_syncRoot)
            {
                switch (_pipelineStateInfo.State)
                {
                case PipelineState.Completed:
                case PipelineState.Failed:
                case PipelineState.Stopped:
                    return;

                case PipelineState.Running:
                {
                    if (state == PipelineState.Running)
                    {
                        return;
                    }
                }
                break;

                case PipelineState.Stopping:
                {
                    if (state == PipelineState.Running || state == PipelineState.Stopping)
                    {
                        return;
                    }
                    else
                    {
                        copyState = PipelineState.Stopped;
                    }
                }
                break;
                }
                _pipelineStateInfo = new PipelineStateInfo(copyState, reason);
                copyStateInfo      = _pipelineStateInfo;

                //Add _pipelineStateInfo to _executionEventQueue.
                //RaisePipelineStateEvents will raise event for each item
                //in this queue.
                //Note:We are doing clone here instead of passing the member
                //_pipelineStateInfo because we donot want outside
                //to change pipeline state.
                RunspaceAvailability previousAvailability = _runspace.RunspaceAvailability;

                Guid?cmdInstanceId = (_powershell != null) ? _powershell.InstanceId : (Guid?)null;
                _runspace.UpdateRunspaceAvailability(_pipelineStateInfo.State, false, cmdInstanceId);

                _executionEventQueue.Enqueue(
                    new ExecutionEventQueueItem(
                        _pipelineStateInfo.Clone(),
                        previousAvailability,
                        _runspace.RunspaceAvailability));
            } // lock...

            // using the copyStateInfo here as this piece of code is
            // outside of lock and _pipelineStateInfo might get changed
            // by two threads running concurrently..so its value is
            // not guaranteed to be the same for this entire method call.
            // copyStateInfo is a local variable.
            if (copyStateInfo.State == PipelineState.Completed ||
                copyStateInfo.State == PipelineState.Failed ||
                copyStateInfo.State == PipelineState.Stopped)
            {
                Cleanup();
            }
        }
Пример #20
0
        /// <summary>
        /// Used to update the runspace availability from Enter/ExitNestedPrompt and the debugger
        /// </summary>
        internal void UpdateRunspaceAvailability(RunspaceAvailability availability, bool raiseEvent)
        {
            RunspaceAvailability oldAvailability = this.RunspaceAvailability;

            this.RunspaceAvailability = availability;

            if (raiseEvent && this.RunspaceAvailability != oldAvailability)
            {
                OnAvailabilityChanged(new RunspaceAvailabilityEventArgs(this.RunspaceAvailability));
            }
        }
Пример #21
0
 /// <summary>
 /// Raises the AvailabilityChanged event
 /// </summary>
 internal void RaiseAvailabilityChangedEvent(RunspaceAvailability availability)
 {
     OnAvailabilityChanged(new RunspaceAvailabilityEventArgs(availability));
 }
Пример #22
0
        private void OnDebuggerStop(InvocationInfo invocationInfo, List <Breakpoint> breakpoints)
        {
            LocalRunspace currentRunspace = this._context.CurrentRunspace as LocalRunspace;

            if (currentRunspace.PulsePipeline != null && currentRunspace.PulsePipeline == currentRunspace.GetCurrentlyRunningPipeline())
            {
                if (breakpoints.Count > 0)
                {
                    this._context.EngineHostInterface.UI.WriteWarningLine(ResourceManagerCache.FormatResourceString("DebuggerStrings", "WarningBreakpointWillNotBeHit", (object)breakpoints[0]));
                }
                else
                {
                    this._context.EngineHostInterface.UI.WriteWarningLine(new InvalidOperationException().Message);
                }
            }
            else
            {
                this._steppingMode = Debugger.SteppingMode.None;
                EventHandler <DebuggerStopEventArgs> debuggerStop = this.DebuggerStop;
                if (debuggerStop == null)
                {
                    return;
                }
                this._inBreakpoint = true;
                if (invocationInfo != null)
                {
                    this._callStack.Push(new Debugger.CallStackInfo()
                    {
                        InvocationInfo = invocationInfo
                    });
                }
                this._context.SetVariable("PSDebugContext", (object)new PSDebugContext(invocationInfo, breakpoints));
                PSLanguageMode languageMode = this._context.LanguageMode;
                bool           flag         = languageMode != PSLanguageMode.FullLanguage && this._context.UseFullLanguageModeInDebugger;
                if (flag)
                {
                    this._context.LanguageMode = PSLanguageMode.FullLanguage;
                }
                RunspaceAvailability runspaceAvailability = this._context.CurrentRunspace.RunspaceAvailability;
                this._context.CurrentRunspace.UpdateRunspaceAvailability(this._context.CurrentRunspace.GetCurrentlyRunningPipeline() != null ? RunspaceAvailability.AvailableForNestedCommand : RunspaceAvailability.Available, true);
                try
                {
                    DebuggerStopEventArgs e = new DebuggerStopEventArgs(invocationInfo, breakpoints);
                    debuggerStop((object)this, e);
                    this.ResumeExecution(e);
                }
                finally
                {
                    this._context.CurrentRunspace.UpdateRunspaceAvailability(runspaceAvailability, true);
                    if (flag)
                    {
                        this._context.LanguageMode = languageMode;
                    }
                    this._context.RemoveVariable("PSDebugContext");
                    if (invocationInfo != null)
                    {
                        this._callStack.Pop();
                    }
                    this._inBreakpoint = false;
                }
            }
        }