#3164 Cannot break 'vwait' with Tcl_LimitSetTime

obsolete: 8.5a3
closed-fixed
8
2005-06-17
2005-06-15
Anonymous
No

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

Discussion

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

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