Chromium Code Reviews
DescriptionFix race condition in EventTimerPosix
The intended signalling from StartTimer() to Process() is that
created_at_.tv_sec is set to 0, and timer_event_->Set() is then called
in order to wake the process thread from timer_event_->Wait(). When this
happens the process thread will return early and the run Process()
again. This time it will pick up created_at_.tv_sec = 0 and run a new
Wait() call with the desired end time.
However if the process thread was NOT blocking on timer_event_->Wait()
when timer_event_->Set() was called from StartTimer() it will mean that
the first call to timer_event_->Wait() from Process(), AFTER the new
time has been configured (count_ = 1), will return early.
If the timer is not periodic it means that Set() will never be called,
and any calls will Wait() will block until the time out.
The solution is to always reset the event in timer_event_ on the first
call to timerEvent_->Wait(), after a timer has started.
Also some general cleanup.
BUG=
Patch Set 1 #Patch Set 2 : Reverted signature change #Patch Set 3 : Added unit tests #Patch Set 4 : Fixed race in test code #
Total comments: 2
Patch Set 5 : Formatting #Patch Set 6 : Fixed potential deadlock #Patch Set 7 : Avoid data race #Patch Set 8 : Test case was still racy #
Total comments: 1
Messages
Total messages: 24 (10 generated)
|
||||||||||||||||||||||||||||||||||||||||||||||