• install smart SIGUSR1 handler

Previously we would kill everything in the process group of the controlled 
process, and therefor, we changed the pgid of that process — this was bad 
because that made the “native” killing of the launched command (from TextMate) 
fail to find offspring.

The new handler constructs a process tree and then from that, determines what 
the “active” process is (the rightmost/last leaf) then sends SIGINT only to 
this process (waits a bit, then sends SIGTERM, and moves on to SIGKILL).

It does not go up the tree, but if multiple processes are “stalling” this can 
be achieved by repeatedly sending SIGUSR1 (which translates to pressing ^C in 
the Executor controlled command output window). It sends “^C: «command»” to 
stderr of the command being killed, so the user should get nice feedback, also 
incase it is somehow determining the wrong active process, or if repeated uses 
of ^C is needed to fully terminate Executor.

A simple example of a process requiring repeated presses of ^C is:

   #!/usr/bin/env ruby -wKU

   fork { sleep 200 }
   fork { sleep 200 }

   Process.waitall()

Changed:
U   trunk/Support/lib/tm/process.rb
_______________________________________________
textmate-dev mailing list
[email protected]
http://lists.macromates.com/listinfo/textmate-dev

Reply via email to