Index: base/run_loop.h |
diff --git a/base/run_loop.h b/base/run_loop.h |
index 9c32337cd332c4994ed1d9512aa58225943acd48..3e20a305f532b15cd934e2dd6df3abc7f78bcb7b 100644 |
--- a/base/run_loop.h |
+++ b/base/run_loop.h |
@@ -11,6 +11,7 @@ |
#include "base/base_export.h" |
#include "base/callback.h" |
#include "base/macros.h" |
+#include "base/memory/ref_counted.h" |
#include "base/memory/weak_ptr.h" |
#include "base/observer_list.h" |
#include "base/sequence_checker.h" |
@@ -26,6 +27,8 @@ class MessagePumpForUI; |
class MessagePumpUIApplication; |
#endif |
+class SingleThreadTaskRunner; |
+ |
// Helper class to run the RunLoop::Delegate associated with the current thread. |
// A RunLoop::Delegate must have been bound to this thread (ref. |
// RunLoop::RegisterDelegateForCurrentThread()) prior to using any of RunLoop's |
@@ -59,6 +62,10 @@ class BASE_EXPORT RunLoop { |
// 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. |
// |
+ // These methods are thread-safe but note that Quit() is best-effort when |
+ // called from another thread (will quit soon but tasks that were already |
+ // queued on this RunLoop will get to run first). |
+ // |
// There can be other nested RunLoops servicing the same task queue |
// (MessageLoop); Quitting one RunLoop has no bearing on the others. Quit() |
// and QuitWhenIdle() can be called before, during or after Run(). If called |
@@ -76,6 +83,10 @@ class BASE_EXPORT RunLoop { |
// Convenience methods to get a closure that safely calls Quit() or |
// QuitWhenIdle() (has no effect if the RunLoop instance is gone). |
// |
+ // The resulting Closure is thread-safe (note however that invoking the |
+ // QuitClosure() from another thread than this RunLoop's will result in an |
+ // asynchronous rather than immediate Quit()). |
+ // |
// Example: |
// RunLoop run_loop; |
// PostTask(run_loop.QuitClosure()); |
@@ -214,20 +225,26 @@ class BASE_EXPORT RunLoop { |
// during Run(), ref. |sequence_checker_| below). |
Delegate* delegate_; |
+#if DCHECK_IS_ON() |
bool run_called_ = false; |
+#endif |
+ |
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_ = false; |
- // RunLoop is not thread-safe. Its state may not be accessed from any other |
- // sequence than the thread it was constructed on. Exception: RunLoop can be |
- // safely accessed from one other sequence (or single parallel task) during |
- // Run(). |
+ // RunLoop is not thread-safe. Its state/methods, unless marked as such, may |
+ // not be accessed from any other sequence than the thread it was constructed |
+ // on. Exception: RunLoop can be safely accessed from one other sequence (or |
+ // single parallel task) during Run() -- e.g. to Quit() without having to |
+ // plumb ThreatTaskRunnerHandle::Get() throughout a test to repost QuitClosure |
+ // to origin thread. |
SEQUENCE_CHECKER(sequence_checker_); |
+ const scoped_refptr<SingleThreadTaskRunner> origin_task_runner_; |
+ |
// WeakPtrFactory for QuitClosure safety. |
base::WeakPtrFactory<RunLoop> weak_factory_; |