git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH (GITK BUGFIX)] gitk: Allow safely calling nukefile from a run queue handler.

From
Alexander Gavrilov <angavrilov@gmail.com>
Date
Aug 9, 2008, 10:41 UTC
Message-ID
<200808091441.50444.angavrilov@gmail.com>
In-Reply-To
<217ad8e755d8d51e2ec0f06b4bffa0864976f7e4.1218277122.git.christian@jaeger.mine.nu>

Originally dorunq assumed that the queue entry remained first in the queue after the script eval, and blindly removed it. However, if the handler calls nukefile, it may not be the case anymore, and a random queue entry gets dropped instead.

This patch makes dorunq remove the entry before calling the script, and adds a global variable to allow other functions to determine if they are called from within a dorunq handler.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
---
	On Saturday 09 August 2008 14:04:43 Christian Jaeger wrote:
	> gitk would not show diffs (or trees when choosing tree view) about
	> half of the times it is started, it would only show the commit
	> messages. Sometimes it took dozens of times to get it to show a diff
	> again, then show it again the next 3 starts, then the next 2 starts
	> not, then the next 2 starts would show it again, and so on.
	
	I think I guessed the cause of this bug: if two or more files
	become ready for reading at once, and the first one in the queue
	calls nukefile on itself, the next one will get silently dropped from
	the queue. If the second one was a diff pipe, the diff system gets
	wedged until gitk is restarted.
 
	Please test if this patch fixes it.
	-- Alexander
 gitk |   14 ++++++++------
 1 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/gitk b/gitk
index b523c98..18d000c 100755
--- a/gitk
+++ b/gitk
@@ -22,11 +22,11 @@ proc gitdir {} {
 # run before X event handlers, so reading from a fast source can
 # make the GUI completely unresponsive.
 proc run args {
-    global isonrunq runq
+    global isonrunq runq currunq
 
     set script $args
     if {[info exists isonrunq($script)]} return
-    if {$runq eq {}} {
+    if {$runq eq {} && ![info exists currunq]} {
 	after idle dorunq
     }
     lappend runq [list {} $script]
@@ -38,10 +38,10 @@ proc filerun {fd script} {
 }
 
 proc filereadable {fd script} {
-    global runq
+    global runq currunq
 
     fileevent $fd readable {}
-    if {$runq eq {}} {
+    if {$runq eq {} && ![info exists currunq]} {
 	after idle dorunq
     }
     lappend runq [list $fd $script]
@@ -60,17 +60,19 @@ proc nukefile {fd} {
 }
 
 proc dorunq {} {
-    global isonrunq runq
+    global isonrunq runq currunq
 
     set tstart [clock clicks -milliseconds]
     set t0 $tstart
     while {[llength $runq] > 0} {
 	set fd [lindex $runq 0 0]
 	set script [lindex $runq 0 1]
+	set currunq [lindex $runq 0]
+	set runq [lrange $runq 1 end]
 	set repeat [eval $script]
+	unset currunq
 	set t1 [clock clicks -milliseconds]
 	set t [expr {$t1 - $t0}]
-	set runq [lrange $runq 1 end]
 	if {$repeat ne {} && $repeat} {
 	    if {$fd eq {} || $repeat == 2} {
 		# script returns 1 if it wants to be readded
-- 
1.6.0.rc2
Previous: Christian JaegerNext: Christian Jaeger
Message 4 of 8 in “Revert "gitk: Arrange to kill diff-files & diff-index on quit"”
  1. Revert "gitk: Arrange to kill diff-files & diff-index on quit"Christian Jaeger, Aug 8, 2008
  2. Alexander GavrilovAug 9, 2008
  3. gitk: make diff and tree display work reliably againChristian Jaeger, Aug 9, 2008
  4. gitk: Allow safely calling nukefile from a run queue handler.Alexander Gavrilov, Aug 9, 2008
  5. Christian JaegerAug 9, 2008
  6. Christian JaegerAug 11, 2008
  7. Junio C HamanoAug 11, 2008
  8. Paul MackerrasAug 11, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.