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

Unified Diff: base/run_loop.h

Issue 2818533003: Make nesting/running states a RunLoop rather than a MessageLoop concept. (Closed)
Patch Set: still need to check MessageLoop::current() in Mojo's RunLoopNestingObserver::GetForThread() Created 3 years, 7 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 | « base/message_loop/message_loop_test.cc ('k') | base/run_loop.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/run_loop.h
diff --git a/base/run_loop.h b/base/run_loop.h
index 077d097ba9a2a35c6ec51d017f588b9f195e48c0..cd4a2112ca7bc9b422baa5a4ada872b9711fe4cb 100644
--- a/base/run_loop.h
+++ b/base/run_loop.h
@@ -43,7 +43,11 @@ 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 {
+ // TODO(gab): Fix bad usage and enable this check, http://crbug.com/715235.
+ // 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 +76,39 @@ class BASE_EXPORT RunLoop {
base::Closure QuitClosure();
base::Closure QuitWhenIdleClosure();
+ // Cleans pre-existing TLS state.
+ // TODO(gab): Remove this in favor of managing TLS through RunLoop::Delegate
+ // as part of the RunLoop<=>MessageLoop split in http://crbug.com/703346.
+ static void ResetTLSState();
+
+ // 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 OnBeginNestedRunLoop() = 0;
+
+ protected:
+ 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 +129,16 @@ 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 per
+ // this class' underlying use of thread-local-storage.
base::ThreadChecker thread_checker_;
// WeakPtrFactory for QuitClosure safety.
« no previous file with comments | « base/message_loop/message_loop_test.cc ('k') | base/run_loop.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698