From: Alexander Gavrilov Date: Sat, 12 Jul 2008 12:09:28 +0000 (+0400) Subject: gitk: Kill back-end processes on window close X-Git-Tag: v1.6.0-rc2~4^2~7 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/e2f90ee45c8b2d13a6c6b8a9f4bc3dce05408c99 gitk: Kill back-end processes on window close When collecting commits for a rarely changed, or recently created file or directory, rev-list may work for a noticeable period of time without producing any output. Such processes don't receive SIGPIPE for a while after gitk is closed, thus becoming runaway CPU hogs. Signed-off-by: Alexander Gavrilov Signed-off-by: Paul Mackerras --- diff --git a/gitk b/gitk index fddcb45817..29d79d63db 100755 --- a/gitk +++ b/gitk @@ -375,19 +375,33 @@ proc start_rev_list {view} { return 1 } +proc stop_instance {inst} { + global commfd leftover + + set fd $commfd($inst) + catch { + set pid [pid $fd] + exec kill $pid + } + catch {close $fd} + nukefile $fd + unset commfd($inst) + unset leftover($inst) +} + +proc stop_backends {} { + global commfd + + foreach inst [array names commfd] { + stop_instance $inst + } +} + proc stop_rev_list {view} { - global commfd viewinstances leftover + global viewinstances foreach inst $viewinstances($view) { - set fd $commfd($inst) - catch { - set pid [pid $fd] - exec kill $pid - } - catch {close $fd} - nukefile $fd - unset commfd($inst) - unset leftover($inst) + stop_instance $inst } set viewinstances($view) {} } @@ -2103,6 +2117,7 @@ proc makewindow {} { bind . <$M1B-minus> {incrfont -1} bind . <$M1B-KP_Subtract> {incrfont -1} wm protocol . WM_DELETE_WINDOW doquit + bind . {stop_backends} bind . "click %W" bind $fstring {dofind 1 1} bind $sha1entry gotocommit