#3164 Cannot break 'vwait' with Tcl_LimitSetTime

obsolete: 8.5a3

Tcl 8.5a3, Windows 2000

It is impossible to stop interpreter from outside ('master'
C code) by using Tcl_LimitSetTime when script is
executing vwait command. The following code was
written in 'master':

limitTime.usec = 1;
limitTime.sec = 0;
Tcl_LimitSetGranularity( interp, TCL_LIMIT_TIME, 1 );
Tcl_LimitTypeSet( interp, TCL_LIMIT_TIME );
Tcl_LimitSetTime( interp, &limitTime );
Tcl_LimitCheck( interp );

and doesn't work (I suspect that Tcl_LimitTypeSet()
should be enough indeed)

I've modified TCL sources a bit and it started to work but I
don't know TCL sources well, so this could be a bad way.

In tclInterp.c, Tcl_LimitCheck() (Send alert each time
limit check is hit)
> Tcl_Preserve(interp);
> RunLimitHandlers(iPtr->limit.timeHandlers, interp);

+ Tcl_ThreadAlert( NULL );

> if (iPtr->limit.time.sec > now.sec ||

In tclNotify.c, Tcl_ThreadAlert() (support for 'broadcast'
events, without exact threadId known)
> for (tsdPtr = firstNotifierPtr; tsdPtr; tsdPtr = tsdPtr-
>nextPtr) {
+ if ((threadId == NULL) || (tsdPtr->threadId == threadId))
> if (tclStubs.tcl_AlertNotifier) {

And the last thing is that even after all that done
Tcl_WaitForEvent returns 0 and Tcl_DoOneEvent() do not
warns vwait about changes happened, so I had to make
Tcl_WaitForEvent always return 1.

I believe there can be a graceful solution of this problem
(if there IS problem).

nyrl at mail dot ru


    • priority: 5 --> 8
    • assigned_to: hobbs --> dkf
    • status: open --> closed-fixed
  • Logged In: YES

    Turns out to have been a problem with [after]'s handling of
    time limit mathematics. Fixed in HEAD.