summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authormbelshe@google.com <mbelshe@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-25 22:01:20 +0000
committermbelshe@google.com <mbelshe@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-25 22:01:20 +0000
commitc855b201a7fbf4b3956079244784450e1adde5d6 (patch)
tree61e86efbcd6c001fc7a4cef9cdeefa39270432a2 /chrome/renderer
parent284547ba566633338d9d6249511fd5f34da178b6 (diff)
downloadchromium_src-c855b201a7fbf4b3956079244784450e1adde5d6.zip
chromium_src-c855b201a7fbf4b3956079244784450e1adde5d6.tar.gz
chromium_src-c855b201a7fbf4b3956079244784450e1adde5d6.tar.bz2
Revert 24314 - Modify the RenderThread to track the number of widgets
and "hidden widgets" which are running through that thread. By knowing the if the widgets are all hidden, the thread can accurately inform V8 when it is idle so that V8 can better cleanup unused memory when idle. This time if V8 has been killed for some reason, don't call into it. BUG=none TEST=none Review URL: http://codereview.chromium.org/173379 TBR=mbelshe@google.com Review URL: http://codereview.chromium.org/174458 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@24339 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/mock_render_thread.h11
-rw-r--r--chrome/renderer/render_thread.cc68
-rw-r--r--chrome/renderer/render_thread.h26
-rw-r--r--chrome/renderer/render_widget.cc22
-rw-r--r--chrome/renderer/render_widget.h5
5 files changed, 13 insertions, 119 deletions
diff --git a/chrome/renderer/mock_render_thread.h b/chrome/renderer/mock_render_thread.h
index 057f0cf..0e5bab8 100644
--- a/chrome/renderer/mock_render_thread.h
+++ b/chrome/renderer/mock_render_thread.h
@@ -41,13 +41,10 @@ class MockRenderThread : public RenderThreadBase {
virtual bool Send(IPC::Message* msg);
// Our mock thread doesn't do filtering.
- virtual void AddFilter(IPC::ChannelProxy::MessageFilter* filter) { }
- virtual void RemoveFilter(IPC::ChannelProxy::MessageFilter* filter) { }
-
- // Our mock thread doesn't deal with hidden and restored tabs.
- virtual void WidgetHidden() { }
- virtual void WidgetRestored() { }
-
+ virtual void AddFilter(IPC::ChannelProxy::MessageFilter* filter) {
+ }
+ virtual void RemoveFilter(IPC::ChannelProxy::MessageFilter* filter) {
+ }
//////////////////////////////////////////////////////////////////////////
// The following functions are called by the test itself.
diff --git a/chrome/renderer/render_thread.cc b/chrome/renderer/render_thread.cc
index f517c9c..c6e5b17 100644
--- a/chrome/renderer/render_thread.cc
+++ b/chrome/renderer/render_thread.cc
@@ -9,7 +9,6 @@
#include "base/command_line.h"
#include "base/lazy_instance.h"
-#include "base/logging.h"
#include "base/shared_memory.h"
#include "base/stats_table.h"
#include "base/thread_local.h"
@@ -59,8 +58,6 @@ using WebKit::WebString;
namespace {
static const unsigned int kCacheStatsDelayMS = 2000 /* milliseconds */;
-static const double kInitialIdleHandlerDelayS = 1.0 /* seconds */;
-
static base::LazyInstance<base::ThreadLocalPointer<RenderThread> > lazy_tls(
base::LINKER_INITIALIZED);
@@ -108,11 +105,8 @@ void RenderThread::Init() {
#endif
plugin_refresh_allowed_ = true;
- cache_stats_task_pending_ = false;
- widget_count_ = 0;
- hidden_widget_count_ = 0;
- idle_notification_delay_in_s_ = kInitialIdleHandlerDelayS;
- task_factory_.reset(new ScopedRunnableMethodFactory<RenderThread>(this));
+ cache_stats_factory_.reset(
+ new ScopedRunnableMethodFactory<RenderThread>(this));
visited_link_slave_.reset(new VisitedLinkSlave());
user_script_slave_.reset(new UserScriptSlave());
@@ -162,30 +156,6 @@ void RenderThread::RemoveFilter(IPC::ChannelProxy::MessageFilter* filter) {
channel()->RemoveFilter(filter);
}
-void RenderThread::WidgetHidden() {
- DCHECK(hidden_widget_count_ < widget_count_);
- hidden_widget_count_++ ;
- if (widget_count_ && hidden_widget_count_ == widget_count_) {
- // Reset the delay.
- idle_notification_delay_in_s_ = kInitialIdleHandlerDelayS;
-
- // Schedule the IdleHandler to wakeup in a bit.
- MessageLoop::current()->PostDelayedTask(FROM_HERE,
- task_factory_->NewRunnableMethod(&RenderThread::IdleHandler),
- static_cast<int64>(floor(idle_notification_delay_in_s_)) * 1000);
- }
-}
-
-void RenderThread::WidgetRestored() {
- DCHECK(hidden_widget_count_ > 0);
- hidden_widget_count_--;
-
- // Note: we may have a timer pending to call the IdleHandler (see the
- // WidgetHidden() code). But we don't bother to cancel it as it is
- // benign and won't do anything if the tab is un-hidden when it is
- // called.
-}
-
void RenderThread::Resolve(const char* name, size_t length) {
return dns_master_->Resolve(name, length);
}
@@ -346,17 +316,15 @@ void RenderThread::InformHostOfCacheStats() {
WebCache::UsageStats stats;
WebCache::getUsageStats(&stats);
Send(new ViewHostMsg_UpdatedCacheStats(stats));
- cache_stats_task_pending_ = false;
}
void RenderThread::InformHostOfCacheStatsLater() {
// Rate limit informing the host of our cache stats.
- if (cache_stats_task_pending_)
+ if (!cache_stats_factory_->empty())
return;
- cache_stats_task_pending_ = true;
MessageLoop::current()->PostDelayedTask(FROM_HERE,
- task_factory_->NewRunnableMethod(
+ cache_stats_factory_->NewRunnableMethod(
&RenderThread::InformHostOfCacheStats),
kCacheStatsDelayMS);
}
@@ -456,34 +424,6 @@ void RenderThread::EnsureWebKitInitialized() {
}
}
-void RenderThread::IdleHandler() {
- // It is possible that the timer was set while the widgets were idle,
- // but that they are no longer idle. If so, just return.
- if (!widget_count_ || hidden_widget_count_ < widget_count_)
- return;
-
- if (v8::V8::IsDead())
- return;
-
- LOG(INFO) << "RenderThread calling v8 IdleNotification for " << this;
-
- // When V8::IdleNotification returns true, it means that it has cleaned up
- // as much as it can. There is no point in continuing to call it.
- if (!v8::V8::IdleNotification(false)) {
- // Dampen the delay using the algorithm:
- // delay = delay + 1 / (delay + 2)
- // Using floor(delay) has a dampening effect such as:
- // 1s, 1, 1, 2, 2, 2, 2, 3, 3, ...
- idle_notification_delay_in_s_ +=
- 1.0 / (idle_notification_delay_in_s_ + 2.0);
-
- // Schedule the next timer.
- MessageLoop::current()->PostDelayedTask(FROM_HERE,
- task_factory_->NewRunnableMethod(&RenderThread::IdleHandler),
- static_cast<int64>(floor(idle_notification_delay_in_s_)) * 1000);
- }
-}
-
void RenderThread::OnExtensionMessageInvoke(const std::string& function_name,
const ListValue& args) {
RendererExtensionBindings::Invoke(function_name, args, NULL);
diff --git a/chrome/renderer/render_thread.h b/chrome/renderer/render_thread.h
index 007bac4..5c22236 100644
--- a/chrome/renderer/render_thread.h
+++ b/chrome/renderer/render_thread.h
@@ -49,10 +49,6 @@ class RenderThreadBase {
virtual void AddFilter(IPC::ChannelProxy::MessageFilter* filter) = 0;
virtual void RemoveFilter(IPC::ChannelProxy::MessageFilter* filter) = 0;
-
- // Called by a RenderWidget when it is hidden or restored.
- virtual void WidgetHidden() = 0;
- virtual void WidgetRestored() = 0;
};
// The RenderThread class represents a background thread where RenderView
@@ -83,20 +79,15 @@ class RenderThread : public RenderThreadBase,
}
virtual void AddRoute(int32 routing_id, IPC::Channel::Listener* listener) {
- widget_count_++;
return ChildThread::AddRoute(routing_id, listener);
}
virtual void RemoveRoute(int32 routing_id) {
- widget_count_--;
return ChildThread::RemoveRoute(routing_id);
}
virtual void AddFilter(IPC::ChannelProxy::MessageFilter* filter);
virtual void RemoveFilter(IPC::ChannelProxy::MessageFilter* filter);
- virtual void WidgetHidden();
- virtual void WidgetRestored();
-
VisitedLinkSlave* visited_link_slave() const {
return visited_link_slave_.get();
}
@@ -172,11 +163,8 @@ class RenderThread : public RenderThreadBase,
// We initialize WebKit as late as possible.
void EnsureWebKitInitialized();
- // A task we invoke periodically to assist with idle cleanup.
- void IdleHandler();
-
// These objects live solely on the render thread.
- scoped_ptr<ScopedRunnableMethodFactory<RenderThread> > task_factory_;
+ scoped_ptr<ScopedRunnableMethodFactory<RenderThread> > cache_stats_factory_;
scoped_ptr<VisitedLinkSlave> visited_link_slave_;
scoped_ptr<UserScriptSlave> user_script_slave_;
scoped_ptr<RenderDnsMaster> dns_master_;
@@ -195,18 +183,6 @@ class RenderThread : public RenderThreadBase,
// If true, then a GetPlugins call is allowed to rescan the disk.
bool plugin_refresh_allowed_;
- // Is there a pending task for doing CacheStats.
- bool cache_stats_task_pending_;
-
- // The count of RenderWidgets running through this thread.
- int widget_count_;
-
- // The count of hidden RenderWidgets running through this thread.
- int hidden_widget_count_;
-
- // The current value of the idle notification timer delay.
- double idle_notification_delay_in_s_;
-
DISALLOW_COPY_AND_ASSIGN(RenderThread);
};
diff --git a/chrome/renderer/render_widget.cc b/chrome/renderer/render_widget.cc
index cd722ba..863e73d 100644
--- a/chrome/renderer/render_widget.cc
+++ b/chrome/renderer/render_widget.cc
@@ -180,10 +180,8 @@ void RenderWidget::OnClose() {
closing_ = true;
// Browser correspondence is no longer needed at this point.
- if (routing_id_ != MSG_ROUTING_NONE) {
+ if (routing_id_ != MSG_ROUTING_NONE)
render_thread_->RemoveRoute(routing_id_);
- SetHidden(false);
- }
// If there is a Send call on the stack, then it could be dangerous to close
// now. Post a task that only gets invoked when there are no nested message
@@ -205,7 +203,7 @@ void RenderWidget::OnResize(const gfx::Size& new_size,
resizer_rect_ = resizer_rect;
// TODO(darin): We should not need to reset this here.
- SetHidden(false);
+ is_hidden_ = false;
needs_repainting_on_restore_ = false;
// We shouldn't be asked to resize to our current size.
@@ -234,7 +232,7 @@ void RenderWidget::OnResize(const gfx::Size& new_size,
void RenderWidget::OnWasHidden() {
// Go into a mode where we stop generating paint and scrolling events.
- SetHidden(true);
+ is_hidden_ = true;
}
void RenderWidget::OnWasRestored(bool needs_repainting) {
@@ -243,7 +241,7 @@ void RenderWidget::OnWasRestored(bool needs_repainting) {
return;
// See OnWasHidden
- SetHidden(false);
+ is_hidden_ = false;
if (!needs_repainting && !needs_repainting_on_restore_)
return;
@@ -738,18 +736,6 @@ void RenderWidget::OnSetTextDirection(WebTextDirection direction) {
webwidget_->setTextDirection(direction);
}
-void RenderWidget::SetHidden(bool hidden) {
- if (is_hidden_ == hidden)
- return;
-
- // The status has changed. Tell the RenderThread about it.
- is_hidden_ = hidden;
- if (is_hidden_)
- render_thread_->WidgetHidden();
- else
- render_thread_->WidgetRestored();
-}
-
void RenderWidget::SetBackground(const SkBitmap& background) {
background_ = background;
// Generate a full repaint.
diff --git a/chrome/renderer/render_widget.h b/chrome/renderer/render_widget.h
index ae54a55..7987d28 100644
--- a/chrome/renderer/render_widget.h
+++ b/chrome/renderer/render_widget.h
@@ -151,11 +151,6 @@ class RenderWidget : public IPC::Channel::Listener,
// browser side has updated the screen for a newly painted region.
virtual void DidPaint() {}
- // Sets the "hidden" state of this widget. All accesses to is_hidden_ should
- // use this method so that we can properly inform the RenderThread of our
- // state.
- void SetHidden(bool hidden);
-
// True if a PaintRect_ACK message is pending.
bool paint_reply_pending() const {
return paint_reply_pending_;