Chromium Code Reviews| Index: content/browser/renderer_host/render_widget_host.cc |
| diff --git a/content/browser/renderer_host/render_widget_host.cc b/content/browser/renderer_host/render_widget_host.cc |
| index 404ff86093ef97319b1da921c70cda7dfbc631d1..972bea222239edf740bd44788b457a6b5dd61332 100644 |
| --- a/content/browser/renderer_host/render_widget_host.cc |
| +++ b/content/browser/renderer_host/render_widget_host.cc |
| @@ -94,6 +94,7 @@ RenderWidgetHost::RenderWidgetHost(RenderProcessHost* process, |
| touch_event_is_queued_(false), |
| needs_repainting_on_restore_(false), |
| is_unresponsive_(false), |
| + is_monitoring_for_hung_renderer_(false), |
| in_get_backing_store_(false), |
| view_being_painted_(false), |
| ignore_input_events_(false), |
| @@ -506,32 +507,22 @@ void RenderWidgetHost::StartHangMonitorTimeout(TimeDelta delay) { |
| return; |
| } |
| - // If we already have a timer that will expire at or before the given delay, |
| - // then we have nothing more to do now. If we have set our end time to null |
| - // by calling StopHangMonitorTimeout, though, we will need to restart the |
| - // timer. |
| - if (hung_renderer_timer_.IsRunning() && |
| - hung_renderer_timer_.GetCurrentDelay() <= delay && |
|
jbates
2011/11/10 01:51:31
This code seems to assume that GetCurrentDelay is
Charlie Reis
2011/11/10 19:35:54
Thanks for catching this!
|
| - !time_when_considered_hung_.is_null()) { |
| - return; |
| - } |
| + is_monitoring_for_hung_renderer_ = true; |
| - // Either the timer is not yet running, or we need to adjust the timer to |
| - // fire sooner. |
| - time_when_considered_hung_ = Time::Now() + delay; |
| - hung_renderer_timer_.Stop(); |
| - hung_renderer_timer_.Start(FROM_HERE, delay, this, |
| - &RenderWidgetHost::CheckRendererIsUnresponsive); |
| + // Start the timer if it's not already pending. |
| + if (!hung_renderer_timer_.IsRunning()) { |
| + hung_renderer_timer_.Start(FROM_HERE, delay, this, |
| + &RenderWidgetHost::CheckRendererIsUnresponsive); |
| + } |
| } |
| void RenderWidgetHost::RestartHangMonitorTimeout() { |
| - // Setting to null will cause StartHangMonitorTimeout to restart the timer. |
| - time_when_considered_hung_ = Time(); |
|
jbates
2011/11/10 01:51:31
Instead of overloading the meaning of this time, I
Charlie Reis
2011/11/10 19:35:54
I like it.
|
| + time_of_last_renderer_response_ = TimeTicks::Now(); |
|
jbates
2011/11/10 01:51:31
Storing the time_of_last_renderer_response_ rather
Charlie Reis
2011/11/10 19:35:54
I like simplifying it, but I'm not sure this is co
|
| StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kHungRendererDelayMs)); |
| } |
| void RenderWidgetHost::StopHangMonitorTimeout() { |
| - time_when_considered_hung_ = Time(); |
| + is_monitoring_for_hung_renderer_ = false; |
| RendererIsResponsive(); |
| // We do not bother to stop the hung_renderer_timer_ here in case it will be |
| @@ -859,13 +850,14 @@ void RenderWidgetHost::Destroy() { |
| void RenderWidgetHost::CheckRendererIsUnresponsive() { |
| // If we received a call to StopHangMonitorTimeout. |
| - if (time_when_considered_hung_.is_null()) |
| + if (!is_monitoring_for_hung_renderer_) |
| return; |
| // If we have not waited long enough, then wait some more. |
| - Time now = Time::Now(); |
| - if (now < time_when_considered_hung_) { |
| - StartHangMonitorTimeout(time_when_considered_hung_ - now); |
| + TimeDelta elapsed_time = TimeTicks::Now() - time_of_last_renderer_response_; |
| + TimeDelta hung_delay = TimeDelta::FromMilliseconds(kHungRendererDelayMs); |
|
Charlie Reis
2011/11/10 19:35:54
This isn't correct-- we use different values in di
|
| + if (elapsed_time < hung_delay) { |
| + StartHangMonitorTimeout(hung_delay - elapsed_time); |
| return; |
| } |
| @@ -879,6 +871,7 @@ void RenderWidgetHost::CheckRendererIsUnresponsive() { |
| } |
| void RenderWidgetHost::RendererIsResponsive() { |
| + time_of_last_renderer_response_ = TimeTicks::Now(); |
| if (is_unresponsive_) { |
| is_unresponsive_ = false; |
| NotifyRendererResponsive(); |