| // Copyright 2018 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef RUN_LOOP_H_ | 
 | #define RUN_LOOP_H_ | 
 |  | 
 | #include "base/macros.h" | 
 | #include "task.h" | 
 |  | 
 | #include <condition_variable> | 
 | #include <mutex> | 
 | #include <queue> | 
 |  | 
 | class MsgLoop { | 
 |  public: | 
 |   MsgLoop(); | 
 |   ~MsgLoop(); | 
 |  | 
 |   // Blocks until PostQuit() is called, processing work items posted via | 
 |   void Run(); | 
 |  | 
 |   // Schedules Run() to exit, but will not happen until other outstanding tasks | 
 |   // complete. Can be called from any thread. | 
 |   void PostQuit(); | 
 |  | 
 |   // Posts a work item to this queue. All items will be run on the thread from | 
 |   // which Run() was called. Can be called from any thread. | 
 |   void PostTask(Task task); | 
 |  | 
 |   // Run()s until the queue is empty. Should only be used (carefully) in tests. | 
 |   void RunUntilIdleForTesting(); | 
 |  | 
 |   // Gets the MsgLoop for the thread from which it's called, or nullptr if | 
 |   // there's no MsgLoop for the current thread. | 
 |   static MsgLoop* Current(); | 
 |  | 
 |  private: | 
 |   std::mutex queue_mutex_; | 
 |   std::queue<Task> task_queue_; | 
 |   std::condition_variable notifier_; | 
 |   bool should_quit_ = false; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(MsgLoop); | 
 | }; | 
 |  | 
 | #endif  // RUN_LOOP_H_ |