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

Unified Diff: base/run_loop.h

Issue 2818533003: Make nesting/running states a RunLoop rather than a MessageLoop concept. (Closed)
Patch Set: fix compile Created 3 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
Index: base/run_loop.h
diff --git a/base/run_loop.h b/base/run_loop.h
index 077d097ba9a2a35c6ec51d017f588b9f195e48c0..398ddc46406aa5f9e247abe9fd97b19e91554b3d 100644
--- a/base/run_loop.h
+++ b/base/run_loop.h
@@ -43,7 +43,10 @@ class BASE_EXPORT RunLoop {
// when repeating tasks such as animated web pages have been shut down.
void RunUntilIdle();
- bool running() const { return running_; }
+ bool running() const {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ return running_;
+ }
// Quit() quits an earlier call to Run() immediately. QuitWhenIdle() quits an
// earlier call to Run() when there aren't any tasks or messages in the queue.
@@ -72,6 +75,34 @@ class BASE_EXPORT RunLoop {
base::Closure QuitClosure();
base::Closure QuitWhenIdleClosure();
+ // Returns true if there is an active RunLoop on this thread.
+ static bool IsRunningOnCurrentThread();
+
+ // Returns true if there is an active RunLoop on this thread and it's nested
+ // within another active RunLoop.
+ static bool IsNestedOnCurrentThread();
+
+ // A NestingObserver is notified when a nested run loop begins. The observers
+ // are notified before the current thread's RunLoop::Delegate::Run() is
+ // invoked and nested work begins.
+ class BASE_EXPORT NestingObserver {
+ public:
+ virtual void OnBeginNestedMessageLoop() = 0;
Sami 2017/04/20 10:13:22 nit: TODO to rename this to OnBeginNestedRunLoop (
gab 2017/04/20 14:21:18 Ah yes, missed that one, definitely doing it now,
danakj 2017/04/20 14:57:32 +1
gab 2017/04/20 16:22:02 Done.
+
+ protected:
danakj 2017/04/20 14:57:32 why protected
gab 2017/04/20 16:22:02 Copied as-is from MessageLoop::NestingObserver. I
+ virtual ~NestingObserver() = default;
+ };
+
+ static void AddNestingObserverOnCurrentThread(NestingObserver* observer);
+ static void RemoveNestingObserverOnCurrentThread(NestingObserver* observer);
+
+ // Returns true if nesting is allowed on this thread.
+ static bool IsNestingAllowedOnCurrentThread();
+
+ // Disallow nesting. After this is called, running a nested RunLoop or calling
+ // Add/RemoveNestingObserverOnCurrentThread() on this thread will crash.
+ static void DisallowNestingOnCurrentThread();
+
private:
friend class MessageLoop;
#if defined(OS_ANDROID)
@@ -92,20 +123,15 @@ class BASE_EXPORT RunLoop {
MessageLoop* loop_;
- // Parent RunLoop or NULL if this is the top-most RunLoop.
- RunLoop* previous_run_loop_;
-
- // Used to count how many nested Run() invocations are on the stack.
- int run_depth_;
-
- bool run_called_;
- bool quit_called_;
- bool running_;
+ bool run_called_ = false;
+ bool quit_called_ = false;
+ bool running_ = false;
// Used to record that QuitWhenIdle() was called on the MessageLoop, meaning
// that we should quit Run once it becomes idle.
- bool quit_when_idle_received_;
+ bool quit_when_idle_received_ = false;
+ // RunLoop's non-static methods are affine to the thread it's running on.
base::ThreadChecker thread_checker_;
// WeakPtrFactory for QuitClosure safety.

Powered by Google App Engine
This is Rietveld 408576698