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 |