> Unfortunately, taskkill is not available widely enough. E.g., on my
> XP Home edition, it is not available, and I believe it is not there on
> systems older than XP, which we still support.
I am aware that 'taskkill' is not present on windowses (is that a word?) older
than XP. This makes it no worse than 'CreateToolhelp32Snapshot'. But I din't
know of its absence from home editions. My first thought was to seek inspiration
in the Wine project:
... only to find:
WINE_FIXME("/T not supported\n");
... so this seems like a dead end.
> This might be "good enough" -- we err on the safe side, and only leave
> some subprocesses not killed in rare situations. Does this strategy
> solve the problem which started this bug report? If so, please tell
> the main ideas of how you intend to avoid killing unrelated processes.
Here is some pseudo-code for it...
# This returns [a subset] of the edges in the process tree
def get-process-tree:
1. let process-snapshot be the current process snapshot
2. let process-tree be an empty list
3. for parent-pid, child-pid in process-snapshot:
if process-start-time(child-pid) < process-start-time(parent-pid):
add(process-tree, (parent-pid . child-pid))
def kill-process-tree(root-process):
1. open a process handle to the root-process (I am guessing that Emacs already
keeps a handle to all process it spawned so this step might be unnecessary)
2. let initial-process-tree be the return value of get-process-tree
3. let inital-kill-list be the edges from initial-process-tree that are
reachable from the root-process
4. open process handles to every child-pid from inital-kill-list
5. let revised-process-tree be the return value of get-process-tree
6. let revised-kill-list be the intersection of inital-kill-list and
revised-process-tree
7. kill and close handles to child processes in final-kill-list
8. close any remaining handles from step (4.)
There are a few non-obvious things here that need a skeptical reading.
The most arcane is that step (6.) in kill-process-tree really returns what we
need to kill.
Other potential issue is the non-atomicity of step (4.) and the possibility of
grabbing a handle to a process that wasn't in initial-process-tree. I claim that
this is not an issue, because those will not end up in revised-kill-list.
Both, of course, I cannot prove formally. But so far I have been unable to find
counterexamples.