Hold a handle on a tracked process - #814
Merged
Merged
Conversation
Process.GetProcessById holds no OS handle, so Kill, HasExited and MainWindowHandle each re-open the id at the moment they are called. A tracked move outlives its diff tool by design - HandleScanMove keeps it while the temp file is still there - so hours later that id may belong to something else entirely, and "Accept all" or "Open diff tool" would act on whatever that is. Touching Handle at track time opens one and keeps it, and Windows will not hand out an id while a handle to it exists, so there is nothing left to confuse the tracked process with. When the handle cannot be held - it exited between the probe and here, or this account cannot open it - TryGet now reports no process rather than one it cannot identify. The tool then goes unkilled, which is better than something else being killed in its place. The test asserts through the exit code, which is readable only if a handle was open before the process ended. That is the same fact as the id being held.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Process.GetProcessById holds no OS handle, so Kill, HasExited and
MainWindowHandle each re-open the id at the moment they are called. A tracked
move outlives its diff tool by design - HandleScanMove keeps it while the temp
file is still there - so hours later that id may belong to something else
entirely, and "Accept all" or "Open diff tool" would act on whatever that is.
Touching Handle at track time opens one and keeps it, and Windows will not hand
out an id while a handle to it exists, so there is nothing left to confuse the
tracked process with.
When the handle cannot be held - it exited between the probe and here, or this
account cannot open it - TryGet now reports no process rather than one it cannot
identify. The tool then goes unkilled, which is better than something else being
killed in its place.
The test asserts through the exit code, which is readable only if a handle was
open before the process ended. That is the same fact as the id being held.