Tcl Source Code

View Ticket
Login
Ticket UUID: 1499394
Title: TIP 285: Script Cancellation with Tcl_CancelEval
Type: Patch Version: TIP Implementation
Submitter: mistachkin Created on: 2006-06-02 09:28:10
Subsystem: 45. Parsing and Eval Assigned To: mistachkin
Priority: 7 High Severity:
Status: Closed Last Modified: 2009-12-27 16:13:55
Resolution: Accepted Closed By: mistachkin
    Closed on: 2008-06-13 15:11:52
Description:
Patch that implements a forthcoming TIP, entitled
"Script cancellation with Tcl_CancelEval" or something
similar.

Please test.  I would like to get some feedback on this
patch so that any necessary changes can be made prior
to writing the formal TIP.
User Comments: mistachkin added on 2009-12-27 16:13:55:
Just tested the attached ZIP file.  It opens and validates OK.

mistachkin added on 2009-12-27 16:12:56:
I can try to find the patch and re-upload it; however, the functionality is already present in HEAD.

alsterg added on 2009-12-27 15:55:57:
The tip285_v18.zip file looks broken. Can you upload again?

mistachkin added on 2008-06-13 22:11:51:
Logged In: YES 
user_id=113501
Originator: YES


Updated and committed to HEAD.

mistachkin added on 2008-05-16 10:39:47:

File Deleted - 277853: 



File Added - 277953: tip285_v18.zip

Logged In: YES 
user_id=113501
Originator: YES


Updated, fixes to tests.

File Added: tip285_v18.zip

mistachkin added on 2008-05-15 12:37:15:

File Deleted - 273326:

mistachkin added on 2008-05-15 12:37:11:

File Deleted - 276288:

mistachkin added on 2008-05-15 12:37:06:

File Added - 277853: tip285_v17.zip

Logged In: YES 
user_id=113501
Originator: YES


Updated to HEAD.  Minor enhancements and fixes.

File Added: tip285_v17.zip

mistachkin added on 2008-04-29 21:39:35:

File Deleted - 273323:

mistachkin added on 2008-04-29 21:39:34:

File Added - 276288: script_cancellation_16.zip

Logged In: YES 
user_id=113501
Originator: YES


Updated CANCELED interp flag to not use the previously used 0x10 value.

File Added: script_cancellation_16.zip

mistachkin added on 2008-04-05 11:11:25:

File Added - 273326: tk_cancellation_1.zip

Logged In: YES 
user_id=113501
Originator: YES


Adding preliminary patch for Tk changes.

File Added: tk_cancellation_1.zip

mistachkin added on 2008-04-05 09:49:00:

File Deleted - 273267: 



File Added - 273323: script_cancellation_15.zip

Logged In: YES 
user_id=113501
Originator: YES


More minor corrections.

File Added: script_cancellation_15.zip

mistachkin added on 2008-04-05 02:14:54:

File Deleted - 273192: 



File Added - 273267: script_cancellation_14.zip

Logged In: YES 
user_id=113501
Originator: YES


Minor corrections.

File Added: script_cancellation_14.zip

mistachkin added on 2008-04-04 17:36:25:

File Deleted - 273175:

mistachkin added on 2008-04-04 17:36:24:

File Added - 273192: script_cancellation_13.zip

Logged In: YES 
user_id=113501
Originator: YES

Patch updated.

Changed [cancel] to [interp cancel] and added appropriate docs.

File Added: script_cancellation_13.zip

mistachkin added on 2008-04-04 16:02:27:

File Deleted - 238301:

mistachkin added on 2008-04-04 16:02:26:

File Added - 273175: script_cancellation_12.zip

Logged In: YES 
user_id=113501
Originator: YES

Patch updated to latest HEAD.  

Still need to change [cancel] to [interp cancel] and add docs for it.

File Added: script_cancellation_12.zip

mistachkin added on 2007-12-13 13:52:12:
Logged In: YES 
user_id=113501
Originator: YES

Patch needs to be updated for latest HEAD.  Also, the plan is to change the script visible command to [interp cancel] instead of [cancel].

mistachkin added on 2007-07-24 17:09:00:

File Deleted - 198625: 



File Added - 238301: script_cancellation_11.zip

Logged In: YES 
user_id=113501
Originator: YES


Updated (v11) patch to latest HEAD.

File Added: script_cancellation_11.zip

mistachkin added on 2006-10-17 21:51:45:

File Deleted - 198366: 



File Added - 198625: script_cancellation_10.zip

Logged In: YES 
user_id=113501


New v10 patch, various adjustments, corrected whitespace.

mistachkin added on 2006-10-16 14:12:07:

File Deleted - 197788: 



File Added - 198366: script_cancellation_9.zip

Logged In: YES 
user_id=113501


New v9 patch.  More cleanup and consistency fixes, now
complete with tests.  Docs for Tcl_Canceled and
Tcl_CancelEval complete.  Still working on [cancel] docs. 
TIP has been submitted and should be forthcoming.

mistachkin added on 2006-10-12 09:26:40:
Logged In: YES 
user_id=113501


Sorry, I'm still working on the TIP, man pages, and tests.  

In the meantime, the code fully works.  The basic
functionality provided is the ability to cancel a script
running in an interpreter from any thread in the process via
Tcl_CancelEval or from within the interpreter itself via the
[cancel] command.  Some examples are provided below.

msofer added on 2006-10-12 08:17:07:
Logged In: YES 
user_id=148712

An almost 1500 loc patch without a spec, man page or tests.
I'm not up to guessing what it is supposed to do, sorry.
When the forthcoming tip does come forth, I'll take a look.

mistachkin added on 2006-10-12 08:01:31:

File Added - 197788: script_cancellation8.zip

Logged In: YES 
user_id=113501


Latest patch is against HEAD and cleans up a few things.

mistachkin added on 2006-08-31 14:36:21:

File Deleted - 184503: 

Logged In: YES 
user_id=113501


A new patch revision is forthcoming...

mistachkin added on 2006-07-11 11:45:13:

File Deleted - 182033: 



File Added - 184503: script_cancellation_7.zip

mistachkin added on 2006-07-11 11:45:12:
Logged In: YES 
user_id=113501


Refreshed v6 patch against current HEAD (now v7).

mistachkin added on 2006-06-18 07:55:38:

File Deleted - 181487:

mistachkin added on 2006-06-18 07:55:24:

File Added - 182033: script_cancellation_6.zip

mistachkin added on 2006-06-18 07:55:23:
Logged In: YES 
user_id=113501

Refactored error message handling to be simpler and more
robust (v6).

mistachkin added on 2006-06-13 16:02:01:

File Deleted - 181083:

mistachkin added on 2006-06-13 16:01:35:

File Deleted - 181375:

mistachkin added on 2006-06-13 16:01:05:

File Added - 181487: script_cancellation_5.zip

Logged In: YES 
user_id=113501


Updated (v5) patch supports a custom error message for
script cancellation via Tcl_CancelEval and [cancel].  Also
corrected mutex locking issue with CancelEvalProc.

Here is a quick Tk example of [cancel] usage:

----------------------------------------------------

package require Tk

pack [text .clock] -side top -expand true \
        -fill both -padx 10 -pady 10
                   
pack [button .go -padx 10 -pady 10 -text "Go" \
        -command [list goButton]] \
        -side left -padx 10 -pady 10
pack [button .cancel -padx 10 -pady 10 -text "Cancel" \
        -command [list cancelButton "clock stopped."]] \
        -side right -padx 10 -pady 10

proc goButton {args} {
  while {1} {
    catch {.clock delete 1.0 end}
    .clock insert end [clock format [clock seconds]]
    update
  }
}

proc cancelButton {msg} {
  cancel -unwind {} $msg
}

mistachkin added on 2006-06-12 15:45:02:

File Added - 181375: script_cancellation_4.zip

mistachkin added on 2006-06-12 15:45:01:
Logged In: YES 
user_id=113501


The v4 patch is basically code complete.  However, I'm still
working on the documentation and test cases for [cancel].

Quite a lot of fine tuning has been done to both the new
code and the comments.  The Tcl_CancelEval function now
accepts a new flag TCL_CANCEL_UNWIND that allows the
evaluation stack for the target interpreter to be completely
unwound in the event of the pathological test cases like:

while {1} { catch { while {1} {incr x} } }

Here are some other test cases that work correctly with the
v4 patch:

# Tcl_CancelEval after delay test
# returns TCL_ERROR "eval cancelled" or "eval unwound" 
# based on flags passed to Tcl_CancelEval
after 30000

----------------------------------------------------------

# Tcl_CancelEval vwait test
# returns TCL_ERROR "eval cancelled" or "eval unwound" 
# based on flags passed to Tcl_CancelEval
vwait forever

----------------------------------------------------------

# Tcl_CancelEval very tight loop test
# returns TCL_ERROR "eval cancelled" or "eval unwound" 
# based on flags passed to Tcl_CancelEval
while {1} {}

----------------------------------------------------------

# Tcl_CancelEval tight loop with body test
# returns TCL_ERROR "eval cancelled" or "eval unwound" 
# based on flags passed to Tcl_CancelEval
while {1} {incr x}

----------------------------------------------------------

# Tcl_CancelEval with TCL_CANCEL_UNWIND test.
# This can only be cancelled if the TCL_CANCEL_UNWIND
# flag is used with Tcl_CancelEval.  It will return 
# TCL_ERROR "eval unwound" in that case.
while {1} { catch { while {1} {incr x} } }

----------------------------------------------------------

# Tcl_CancelEval with TCL_CANCEL_UNWIND slightly more 
# pathological unwind test
# returns TCL_ERROR "eval unwound" 
while {1} {
  catch { 
    while {1} {
      catch { 
        while {1} {incr x}
      } 
    } 
  } 
}

----------------------------------------------------------

# Tcl_CancelEval slave interp test
# returns TCL_ERROR "eval cancelled" or "eval unwound" 
# based on flags passed to Tcl_CancelEval
interp create foo; foo eval { while {1} {incr x} }

----------------------------------------------------------

# Tcl_CancelEval [subst] test
# returns TCL_ERROR "eval cancelled" or "eval unwound" 
# based on flags passed to Tcl_CancelEval
subst {[while {1} {incr x}]}

----------------------------------------------------------

# Tcl_CancelEval with TCL_CANCEL_UNWIND pathological slave 
# interp test
# returns TCL_ERROR "eval unwound"
interp create foo; foo eval {
  while {1} {
    catch { 
      while {1} { 
        catch { 
          while {1} {incr x}
        }
      }
    } 
  } 
}

----------------------------------------------------------

# basic [cancel] test
# returns TCL_ERROR "eval cancelled"
cancel

----------------------------------------------------------

# basic [cancel] test with "--"
# returns TCL_ERROR "eval cancelled"
cancel --

----------------------------------------------------------

# basic [cancel -unwind] test
# returns TCL_ERROR "eval unwound"
cancel -unwind --

----------------------------------------------------------

# [cancel] test
# returns TCL_ERROR "eval cancelled"
catch {unset foo i}
while {1} {
  incr i; lappend foo $i
  # pretend this is some complex 
  # logic or Tk button command.
  if {$i > 3} then {cancel} 
}

----------------------------------------------------------

# [cancel -unwind] test
# returns TCL_ERROR "eval unwound"
catch {unset foo i}
while {1} { 
  catch { 
    while {1} { 
      incr i; lappend foo $i
      # pretend this is some complex 
      # logic or Tk button command.
      if {$i > 3} then {cancel -unwind} 
    }
  } 
}

----------------------------------------------------------

# recursion test
# returns TCL_ERROR "eval cancelled"
proc foo { i } {
  if {$i > 10} then { 
    cancel 
  } else {
    return [foo [expr {$i + 1}]] 
  }
}; foo 0

mistachkin added on 2006-06-09 16:07:52:

File Added - 181083: script_cancellation_3.zip

Logged In: YES 
user_id=113501

Attaching updated (v3) patch that works around the
Tcl_GetMaster (bug #1502071) issue.

The previous (v2) patch demonstrates the issue.

mistachkin added on 2006-06-06 16:46:12:
Logged In: YES 
user_id=113501


NOTE: This patch needs to be reviewed by kennykb and msofer.

mistachkin added on 2006-06-06 16:41:24:

File Added - 180714: script_cancellation_2.zip

Logged In: YES 
user_id=113501

Fixed interp deletion issue, slave interp support, and some
issues with commands that block (after, vwait).  Tweaked docs.

mistachkin added on 2006-06-06 16:34:22:

File Deleted - 180282:

mistachkin added on 2006-06-02 16:28:10:

File Added - 180282: script_cancellation.zip

Attachments: