blob: ceb0d1c1cf460a4dd258b2cdd3757e1bb9ddba47 [file] [log] [blame]
// 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 <condition_variable>
#include <functional>
#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(std::function<void()> 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<std::function<void()>> task_queue_;
std::condition_variable notifier_;
bool should_quit_ = false;
MsgLoop(const MsgLoop&) = delete;
MsgLoop& operator=(const MsgLoop&) = delete;
};
#endif // UTIL_RUN_LOOP_H_