# HG changeset patch # User Laurent Bessard # Date 1353015904 -3600 # Node ID 68ac754a5a727f9ee5f117e3e936e74b33bab21e # Parent 781ced3c0aef7ff18d6d586d830d425902b3c895 Fix bug with concurrent access to LastRefreshTimer in LogPseudoFile for Log Console diff -r 781ced3c0aef -r 68ac754a5a72 Beremiz.py --- a/Beremiz.py Tue Nov 13 11:36:04 2012 +0100 +++ b/Beremiz.py Thu Nov 15 22:45:04 2012 +0100 @@ -196,6 +196,7 @@ self.lock = Lock() self.YieldLock = Lock() self.RefreshLock = Lock() + self.TimerAccessLock = Lock() self.stack = [] self.LastRefreshTime = gettime() self.LastRefreshTimer = None @@ -205,21 +206,27 @@ self.stack.append((s,style)) self.lock.release() current_time = gettime() + self.TimerAccessLock.acquire() if self.LastRefreshTimer: self.LastRefreshTimer.cancel() self.LastRefreshTimer=None + self.TimerAccessLock.release() if current_time - self.LastRefreshTime > REFRESH_PERIOD and self.RefreshLock.acquire(False): self._should_write() else: + self.TimerAccessLock.acquire() self.LastRefreshTimer = Timer(REFRESH_PERIOD, self._timer_expired) self.LastRefreshTimer.start() + self.TimerAccessLock.release() def _timer_expired(self): if self.RefreshLock.acquire(False): self._should_write() else: + self.TimerAccessLock.acquire() self.LastRefreshTimer = Timer(REFRESH_PERIOD, self._timer_expired) self.LastRefreshTimer.start() + self.TimerAccessLock.release() def _should_write(self): wx.CallAfter(self._write) diff -r 781ced3c0aef -r 68ac754a5a72 tests/python/plc.xml --- a/tests/python/plc.xml Tue Nov 13 11:36:04 2012 +0100 +++ b/tests/python/plc.xml Thu Nov 15 22:45:04 2012 +0100 @@ -8,7 +8,7 @@ productVersion="0.0" creationDateTime="2008-12-14T16:21:19"/> + modificationDateTime="2012-11-15T18:38:58"> @@ -40,6 +40,17 @@ + + + + + + + + + + + @@ -109,7 +120,55 @@ + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -610,6 +669,313 @@ + + + + + + + + + + Test_BCD_RESULT + + + + + + + Test_BCD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test_DT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test_TOD + + + + + + + + + + + Test_Date + + + + + + + + + + + Test_String + + + + + + + + + + + Test_Bool + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 'True' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BYTE#145 + + + + + + + Global_RS.Q1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BOOL#TRUE + + + + + + + + + + + Global_RS.S + + + + + + + + + + + Global_RS.R1 + + + + + + + Global_RS.Q1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BOOL#FALSE + @@ -668,6 +1034,13 @@ + + + + + + + @@ -686,6 +1059,7 @@ } }} (* If you do not use __GET_VAR and _SET_VAR macro, expect unexpected *) +Global_RS(); ]]> @@ -696,9 +1070,16 @@ - + + + + + + + +