diff options
| author | dgp <dgp@users.sourceforge.net> | 2016-03-08 15:55:51 (GMT) |
|---|---|---|
| committer | dgp <dgp@users.sourceforge.net> | 2016-03-08 15:55:51 (GMT) |
| commit | c2480e69a5cb24601c36b41ef4d47cf59b0159b7 (patch) | |
| tree | 1b49fd42c73cc5d60c6b041d15b35f9c5e04fd7e | |
| parent | 4ff3a61b823ec5ca0df8a09c4e82403e24585afc (diff) | |
| parent | 056d0d2c786f58f232b7dde6760c9fbb3595740d (diff) | |
| download | tcl-c2480e69a5cb24601c36b41ef4d47cf59b0159b7.zip tcl-c2480e69a5cb24601c36b41ef4d47cf59b0159b7.tar.gz tcl-c2480e69a5cb24601c36b41ef4d47cf59b0159b7.tar.bz2 | |
[bbc304f61a] Avoid event handling when reflected channel has a watch change half-completed. (First half in 1 thread, second in another). When this is allowed to happen, false alarm errors from [chan postevent] are the result when timing is unlucky. See test iocmd.tf-24.17.bug3522560 .
| -rw-r--r-- | generic/tclIORChan.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/generic/tclIORChan.c b/generic/tclIORChan.c index 21c766e..f476a1a 100644 --- a/generic/tclIORChan.c +++ b/generic/tclIORChan.c @@ -1609,8 +1609,6 @@ ReflectWatch( return; } - rcPtr->interest = mask; - /* * Are we in the correct thread? */ @@ -1633,6 +1631,7 @@ ReflectWatch( Tcl_Preserve(rcPtr); + rcPtr->interest = mask; maskObj = DecodeEventMask(mask); /* assert maskObj.refCount == 1 */ (void) InvokeTclMethod(rcPtr, METH_WATCH, maskObj, NULL, NULL); @@ -3083,6 +3082,7 @@ ForwardProc( /* assert maskObj.refCount == 1 */ Tcl_Preserve(rcPtr); + rcPtr->interest = paramPtr->watch.mask; (void) InvokeTclMethod(rcPtr, METH_WATCH, maskObj, NULL, NULL); Tcl_DecrRefCount(maskObj); Tcl_Release(rcPtr); |
