| Ticket UUID: | 1499394 | ||
| Title: | TIP 285: Script Cancellation with Tcl_CancelEval | ||
| Type: | Patch | Created on: | 2006-06-02 09:28:10 |
| Submitter: | mistachkin | Assigned to: | mistachkin |
| Subsystem: | 45. Parsing and Eval | Severity: | |
| Priority: | 7 High | Last modified: | 2009-12-27 16:13:55 |
| Status: | Closed | Closed by: | mistachkin |
| Resolution: | Accepted | Closed on: | 2008-06-13 15:11:52 |
| Version: | TIP Implementation | ||
| 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 2006-06-02 16:28:10:
File Added - 180282: script_cancellation.zip mistachkin added on 2006-06-06 16:34:22:
File Deleted - 180282: 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:46:12:
Logged In: YES user_id=113501 NOTE: This patch needs to be reviewed by kennykb and msofer. 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-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-12 15:45:02:
File Added - 181375: script_cancellation_4.zip 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-13 16:01:35:
File Deleted - 181375: mistachkin added on 2006-06-13 16:02:01:
File Deleted - 181083: 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-18 07:55:24:
File Added - 182033: script_cancellation_6.zip mistachkin added on 2006-06-18 07:55:38:
File Deleted - 181487: 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-07-11 11:45:13:
File Deleted - 182033: File Added - 184503: script_cancellation_7.zip 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-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. 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 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. 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-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 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 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 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 2008-04-04 16:02:27:
File Deleted - 238301: 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 17:36:25:
File Deleted - 273175: 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-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 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-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-29 21:39:35:
File Deleted - 273323: 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-05-15 12:37:11:
File Deleted - 276288: mistachkin added on 2008-05-15 12:37:15:
File Deleted - 273326: 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-06-13 22:11:51:
Logged In: YES user_id=113501 Originator: YES Updated and committed to HEAD. alsterg added on 2009-12-27 15:55:57:
The tip285_v18.zip file looks broken. Can you upload again? 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. mistachkin added on 2009-12-27 16:13:55:
Just tested the attached ZIP file. It opens and validates OK. | ||||
Attachments:
- tip285_v18.zip [download] added by mistachkin on 2008-05-16 10:39:47. [details]
- script_cancellation_2.zip [download] added by mistachkin on 2006-06-06 16:41:24. [details]
