* demos/bug1158628.tcl: Demo file for this bug.
authorpatthoyts <patthoyts>
Wed, 27 Apr 2005 08:11:08 +0000 (08:11 +0000)
committerpatthoyts <patthoyts>
Wed, 27 Apr 2005 08:11:08 +0000 (08:11 +0000)
* generic/udp_tcl.c: Applied a fix for bug #1158628 from Reinhard
Max which avoids hanging Tcl while exiting with open channels.
* configure.in:     Moved version to 1.0.7
* win/makefile.vc:

ChangeLog
configure
configure.in
demos/bug1158628.tcl [new file with mode: 0644]
generic/udp_tcl.c
win/makefile.vc

index e46f69345fff8491b0212dac07f1cd6ff05feeac..405c634d461c43a57268b8e2af907bbe197e7051 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2005-04-27  Pat Thoyts  <patthoyts@users.sourceforge.net>
+
+       * demos/bug1158628.tcl: Demo file for this bug.
+       * generic/udp_tcl.c: Applied a fix for bug #1158628 from Reinhard
+       Max which avoids hanging Tcl while exiting with open channels.
+       * configure.in:     Moved version to 1.0.7
+       * win/makefile.vc: 
+
 2004-11-23  Pat Thoyts  <patthoyts@users.sourceforge.net>
 
        * demos/chat.tcl: Sample Tk chat app using multicast udp.
index db9c7e23795a6c0e031c6d5402a44fd93babc6e8..9092875a5106320a5b1da2363092e997bb0395ad 100755 (executable)
--- a/configure
+++ b/configure
@@ -573,7 +573,7 @@ PACKAGE=udp
 
 MAJOR_VERSION=1
 MINOR_VERSION=0
-PATCHLEVEL=6
+PATCHLEVEL=7
 
 VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${PATCHLEVEL}
 NODOT_VERSION=${MAJOR_VERSION}${MINOR_VERSION}
index 4355ec6729b35c20b10844902786c8a12f1725a7..1d7c29011bca458f46f9c1e817e01251bb126292 100644 (file)
@@ -39,7 +39,7 @@ PACKAGE=udp
 
 MAJOR_VERSION=1
 MINOR_VERSION=0
-PATCHLEVEL=6
+PATCHLEVEL=7
 
 VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${PATCHLEVEL}
 NODOT_VERSION=${MAJOR_VERSION}${MINOR_VERSION}
diff --git a/demos/bug1158628.tcl b/demos/bug1158628.tcl
new file mode 100644 (file)
index 0000000..e86837e
--- /dev/null
@@ -0,0 +1,61 @@
+# bug1158628.tcl - Copyright (C) 2005 Pat Thoyts <patthoyts@users.sf.net>
+#
+# "On windows XP, I have a GUI that has an exit buttons which when
+# pressed does: {set done 1; destroy .;exit} If there is an open UDP
+# channel with a fileevent on it, the program will not exit --
+# i.e. task manager still shows it. Also if I have the console up, the
+# console goes away when the exit button is invoked, but the program
+# does not exit.  NOTE -- all windows are correctly destroyed (or at
+# least withdrawn)"
+#
+# The fault is calling Tcl_UnregisterChannel in the udpClose function.
+# We must let tcl handle this itself. Solved by Reinhard Max.
+#
+# This script demonstrates the problem. Using udp 1.0.6 the program hangs
+# after printing "Exiting...". With the fix applied it properly exits.
+#
+# $Id$
+
+If the channel is closed, the program will exit.
+
+BTW, when it will not exit it does *not* consume CPU
+resources.
+
+
+
+load [file join [file dirname [info script]] .. win Release udp106.dll]
+package require udp
+
+variable forever 0
+
+proc Event {sock} {
+    variable forever
+    set pkt [read $sock]
+    set peer [fconfigure $sock -peer]
+    puts "Recieved [string length $pkt] from $peer\n$pkt"
+    #set forever 1
+    return
+}
+
+proc Listen {port} {
+    set s [udp_open $port]
+    fconfigure $s -blocking 0 -buffering none -translation binary
+    fileevent $s readable [list Event $s]
+    return $s
+}
+
+proc Exit {sock} {
+    puts "Exiting"
+    exit 0
+}
+
+if {!$tcl_interactive} {
+    puts "Bug #1158628 - hangs in exit if open udp channels"
+    puts "  Using a buggy version, this will hang after printing Exiting..."
+    puts ""
+    set sock [Listen 10245]
+    puts "Wait 1 sec..."
+    after 1000 [list Exit $sock]
+    vwait forever
+    close $sock
+}
index 63a6ccf7e1620c3e0a1ed305c32c7189e0a5cdba..d76d20ac608c00bfb76c948b7e615b5ba7450864 100644 (file)
@@ -837,7 +837,9 @@ udpClose(ClientData instanceData, Tcl_Interp *interp)
        Tcl_DecrRefCount(statePtr->groupsObj);
     }
     
-    Tcl_UnregisterChannel(interp, statePtr->channel);
+    /* No - doing this causes a infinite recursion. Let Tcl handle this.
+     *   Tcl_UnregisterChannel(interp, statePtr->channel);
+     */
     if (closesocket(sock) < 0) {
         errorCode = errno;
     }
index 2e91178f6bae0585ef36e92baa04e6a8ec322e71..fe16a1382da3c7915b683708a24c50de261650d3 100644 (file)
@@ -156,7 +156,7 @@ Please `cd` to its location first.
 PROJECT = udp
 !include "rules.vc"
 
-DOTVERSION      = 1.0.6
+DOTVERSION      = 1.0.7
 VERSION         = $(DOTVERSION:.=)
 STUBPREFIX      = $(PROJECT)stub