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
Logged In: YES
user_id=79902
Turns out to have been a problem with [after]'s handling of
time limit mathematics. Fixed in HEAD.