// 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 UTIL_RUN_LOOP_H_ #define UTIL_RUN_LOOP_H_ #include "base/macros.h" #include "util/task.h" #include #include #include 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_queue_; std::condition_variable notifier_; bool should_quit_ = false; DISALLOW_COPY_AND_ASSIGN(MsgLoop); }; #endif // UTIL_RUN_LOOP_H_