Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(160)

Unified Diff: chromeos/memory/low_memory_listener.cc

Issue 14727005: Moves LowMemoryObserver into chromeos and renames (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: review feedback again Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chromeos/memory/low_memory_listener.h ('k') | chromeos/memory/low_memory_listener_delegate.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chromeos/memory/low_memory_listener.cc
diff --git a/chrome/browser/chromeos/memory/low_memory_observer.cc b/chromeos/memory/low_memory_listener.cc
similarity index 61%
rename from chrome/browser/chromeos/memory/low_memory_observer.cc
rename to chromeos/memory/low_memory_listener.cc
index 90fd869d0985db3554608be00b4d6b7eb30e905c..a53e7b7bae8c8469a0e735568536c789e3415454 100644
--- a/chrome/browser/chromeos/memory/low_memory_observer.cc
+++ b/chromeos/memory/low_memory_listener.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/browser/chromeos/memory/low_memory_observer.h"
+#include "chromeos/memory/low_memory_listener.h"
#include <fcntl.h>
@@ -12,9 +12,7 @@
#include "base/message_loop.h"
#include "base/time.h"
#include "base/timer.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/browser_process_platform_part_chromeos.h"
-#include "chrome/browser/chromeos/memory/oom_priority_manager.h"
+#include "chromeos/memory/low_memory_listener_delegate.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/zygote_host_linux.h"
@@ -34,26 +32,26 @@ const int kLowMemoryCheckTimeoutMs = 750;
} // namespace
////////////////////////////////////////////////////////////////////////////////
-// LowMemoryObserverImpl
+// LowMemoryListenerImpl
//
// Does the actual work of observing. The observation work happens on the FILE
-// thread, and the discarding of tabs happens on the UI thread.
-// If low memory is detected, then we discard a tab, wait
-// kLowMemoryCheckTimeoutMs milliseconds and then start watching again to see
-// if we're still in a low memory state. This is to keep from discarding all
-// tabs the first time we enter the state, because it takes time for the
-// tabs to deallocate their memory. A timer isn't the perfect solution, but
-// without any reliable indicator that a tab has had all its parts deallocated,
-// it's the next best thing.
-class LowMemoryObserverImpl
- : public base::RefCountedThreadSafe<LowMemoryObserverImpl> {
+// thread, and notification happens on the UI thread. If low memory is
+// detected, then we notify, wait kLowMemoryCheckTimeoutMs milliseconds and then
+// start watching again to see if we're still in a low memory state. This is to
+// keep from sending out multiple notifications before the UI has a chance to
+// respond (it may take the UI a while to actually deallocate memory). A timer
+// isn't the perfect solution, but without any reliable indicator that a tab has
+// had all its parts deallocated, it's the next best thing.
+class LowMemoryListenerImpl
+ : public base::RefCountedThreadSafe<LowMemoryListenerImpl> {
public:
- LowMemoryObserverImpl() : watcher_delegate_(this), file_descriptor_(-1) {}
+ LowMemoryListenerImpl() : watcher_delegate_(this), file_descriptor_(-1) {}
// Start watching the low memory file for readability.
// Calls to StartObserving should always be matched with calls to
// StopObserving. This method should only be called from the FILE thread.
- void StartObservingOnFileThread();
+ // |low_memory_callback| is run when memory is low.
+ void StartObservingOnFileThread(const base::Closure& low_memory_callback);
// Stop watching the low memory file for readability.
// May be safely called if StartObserving has not been called.
@@ -61,9 +59,9 @@ class LowMemoryObserverImpl
void StopObservingOnFileThread();
private:
- friend class base::RefCountedThreadSafe<LowMemoryObserverImpl>;
+ friend class base::RefCountedThreadSafe<LowMemoryListenerImpl>;
- ~LowMemoryObserverImpl() {
+ ~LowMemoryListenerImpl() {
StopObservingOnFileThread();
}
@@ -76,7 +74,7 @@ class LowMemoryObserverImpl
// Delegate to receive events from WatchFileDescriptor.
class FileWatcherDelegate : public MessageLoopForIO::Watcher {
public:
- explicit FileWatcherDelegate(LowMemoryObserverImpl* owner)
+ explicit FileWatcherDelegate(LowMemoryListenerImpl* owner)
: owner_(owner) {}
virtual ~FileWatcherDelegate() {}
@@ -85,36 +83,29 @@ class LowMemoryObserverImpl
virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE {
LOG(WARNING) << "Low memory condition detected. Discarding a tab.";
// We can only discard tabs on the UI thread.
- base::Callback<void(void)> callback = base::Bind(&DiscardTab);
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, callback);
+ BrowserThread::PostTask(BrowserThread::UI,
+ FROM_HERE,
+ owner_->low_memory_callback_);
owner_->ScheduleNextObservation();
}
- // Sends off a discard request to the OomPriorityManager. Must be run on
- // the UI thread.
- static void DiscardTab() {
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (g_browser_process &&
- g_browser_process->platform_part()->oom_priority_manager()) {
- g_browser_process->platform_part()->
- oom_priority_manager()->LogMemoryAndDiscardTab();
- }
- }
-
private:
- LowMemoryObserverImpl* owner_;
+ LowMemoryListenerImpl* owner_;
DISALLOW_COPY_AND_ASSIGN(FileWatcherDelegate);
};
scoped_ptr<MessageLoopForIO::FileDescriptorWatcher> watcher_;
FileWatcherDelegate watcher_delegate_;
int file_descriptor_;
- base::OneShotTimer<LowMemoryObserverImpl> timer_;
+ base::OneShotTimer<LowMemoryListenerImpl> timer_;
+ base::Closure low_memory_callback_;
- DISALLOW_COPY_AND_ASSIGN(LowMemoryObserverImpl);
+ DISALLOW_COPY_AND_ASSIGN(LowMemoryListenerImpl);
};
-void LowMemoryObserverImpl::StartObservingOnFileThread() {
+void LowMemoryListenerImpl::StartObservingOnFileThread(
+ const base::Closure& low_memory_callback) {
+ low_memory_callback_ = low_memory_callback;
DCHECK_LE(file_descriptor_, 0)
<< "Attempted to start observation when it was already started.";
DCHECK(watcher_.get() == NULL);
@@ -132,7 +123,7 @@ void LowMemoryObserverImpl::StartObservingOnFileThread() {
StartWatchingDescriptor();
}
-void LowMemoryObserverImpl::StopObservingOnFileThread() {
+void LowMemoryListenerImpl::StopObservingOnFileThread() {
// If StartObserving failed, StopObserving will still get called.
timer_.Stop();
if (file_descriptor_ >= 0) {
@@ -143,14 +134,14 @@ void LowMemoryObserverImpl::StopObservingOnFileThread() {
}
}
-void LowMemoryObserverImpl::ScheduleNextObservation() {
+void LowMemoryListenerImpl::ScheduleNextObservation() {
timer_.Start(FROM_HERE,
base::TimeDelta::FromMilliseconds(kLowMemoryCheckTimeoutMs),
this,
- &LowMemoryObserverImpl::StartWatchingDescriptor);
+ &LowMemoryListenerImpl::StartWatchingDescriptor);
}
-void LowMemoryObserverImpl::StartWatchingDescriptor() {
+void LowMemoryListenerImpl::StartWatchingDescriptor() {
DCHECK(watcher_.get());
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
DCHECK(MessageLoopForIO::current());
@@ -167,31 +158,41 @@ void LowMemoryObserverImpl::StartWatchingDescriptor() {
}
////////////////////////////////////////////////////////////////////////////////
-// LowMemoryObserver
+// LowMemoryListener
-LowMemoryObserver::LowMemoryObserver() : observer_(new LowMemoryObserverImpl) {}
+LowMemoryListener::LowMemoryListener(LowMemoryListenerDelegate* delegate)
+ : observer_(new LowMemoryListenerImpl),
+ delegate_(delegate),
+ weak_factory_(this) {
+}
-LowMemoryObserver::~LowMemoryObserver() { Stop(); }
+LowMemoryListener::~LowMemoryListener() {
+ Stop();
+}
-void LowMemoryObserver::Start() {
+void LowMemoryListener::Start() {
+ base::Closure memory_low_callback =
+ base::Bind(&LowMemoryListener::OnMemoryLow, weak_factory_.GetWeakPtr());
BrowserThread::PostTask(
BrowserThread::FILE,
FROM_HERE,
- base::Bind(&LowMemoryObserverImpl::StartObservingOnFileThread,
- observer_.get()));
+ base::Bind(&LowMemoryListenerImpl::StartObservingOnFileThread,
+ observer_.get(),
+ memory_low_callback));
}
-void LowMemoryObserver::Stop() {
+void LowMemoryListener::Stop() {
+ weak_factory_.InvalidateWeakPtrs();
BrowserThread::PostTask(
BrowserThread::FILE,
FROM_HERE,
- base::Bind(&LowMemoryObserverImpl::StopObservingOnFileThread,
+ base::Bind(&LowMemoryListenerImpl::StopObservingOnFileThread,
observer_.get()));
}
-// static
-void LowMemoryObserver::SetLowMemoryMargin(int64 margin_mb) {
- content::ZygoteHost::GetInstance()->AdjustLowMemoryMargin(margin_mb);
+void LowMemoryListener::OnMemoryLow() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ delegate_->OnMemoryLow();
}
} // namespace chromeos
« no previous file with comments | « chromeos/memory/low_memory_listener.h ('k') | chromeos/memory/low_memory_listener_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698