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(); } }
/// <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)); } } }
public ExecutionEventQueueItem( PipelineStateInfo pipelineStateInfo, RunspaceAvailability currentAvailability, RunspaceAvailability newAvailability) { this.PipelineStateInfo = pipelineStateInfo; this.CurrentRunspaceAvailability = currentAvailability; this.NewRunspaceAvailability = newAvailability; }
public RunspaceEventQueueItem( RunspaceStateInfo runspaceStateInfo, RunspaceAvailability currentAvailability, RunspaceAvailability newAvailability) { this.RunspaceStateInfo = runspaceStateInfo; this.CurrentRunspaceAvailability = currentAvailability; this.NewRunspaceAvailability = newAvailability; }
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)); } } }
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(); } }
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)); } } }
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(); } }
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; } } } }
internal RunspaceAvailabilityEventArgs(RunspaceAvailability runspaceAvailability) { RunspaceAvailability = runspaceAvailability; }
public ExecutionEventQueueItem(System.Management.Automation.Runspaces.PipelineStateInfo pipelineStateInfo, RunspaceAvailability currentAvailability, RunspaceAvailability newAvailability) { this.PipelineStateInfo = pipelineStateInfo; this.CurrentRunspaceAvailability = currentAvailability; this.NewRunspaceAvailability = newAvailability; }
public RunspaceEventQueueItem(System.Management.Automation.Runspaces.RunspaceStateInfo runspaceStateInfo, RunspaceAvailability currentAvailability, RunspaceAvailability newAvailability) { this.RunspaceStateInfo = runspaceStateInfo; this.CurrentRunspaceAvailability = currentAvailability; this.NewRunspaceAvailability = newAvailability; }
public ExecutionEventQueueItem(PipelineStateInfo pipelineStateInfo, RunspaceAvailability currentAvailability, RunspaceAvailability newAvailability) { this.PipelineStateInfo = pipelineStateInfo; this.CurrentRunspaceAvailability = currentAvailability; this.NewRunspaceAvailability = newAvailability; }
public ExecutionEventQueueItem(System.Management.Automation.Runspaces.PipelineStateInfo pipelineStateInfo, RunspaceAvailability currentAvailability, RunspaceAvailability newAvailability) { this.PipelineStateInfo = pipelineStateInfo; this.CurrentRunspaceAvailability = currentAvailability; this.NewRunspaceAvailability = newAvailability; }
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); } } } }
public RunspaceEventQueueItem(System.Management.Automation.Runspaces.RunspaceStateInfo runspaceStateInfo, RunspaceAvailability currentAvailability, RunspaceAvailability newAvailability) { this.RunspaceStateInfo = runspaceStateInfo; this.CurrentRunspaceAvailability = currentAvailability; this.NewRunspaceAvailability = newAvailability; }
internal RunspaceAvailabilityEventArgs(RunspaceAvailability runspaceAvailability) => this._runspaceAvailability = runspaceAvailability;
public RunspaceEventQueueItem(RunspaceStateInfo runspaceStateInfo, RunspaceAvailability currentAvailability, RunspaceAvailability newAvailability) { this.RunspaceStateInfo = runspaceStateInfo; this.CurrentRunspaceAvailability = currentAvailability; this.NewRunspaceAvailability = newAvailability; }
/// <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(); } }
/// <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)); } }
/// <summary> /// Raises the AvailabilityChanged event /// </summary> internal void RaiseAvailabilityChangedEvent(RunspaceAvailability availability) { OnAvailabilityChanged(new RunspaceAvailabilityEventArgs(availability)); }
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; } } }