blob: 7931447497026d143499b95c139370ffd0e961c0 [file] [log] [blame]
Alex Deymoef3955a2015-06-09 10:14:01 -07001// Copyright 2015 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Alex Vakulenko9ed0cab2015-10-12 15:21:28 -07005#include <brillo/message_loops/message_loop_utils.h>
Alex Deymoef3955a2015-06-09 10:14:01 -07006
Alex Deymo106edd12015-06-18 20:15:11 -07007#include <base/location.h>
Alex Vakulenko9ed0cab2015-10-12 15:21:28 -07008#include <brillo/bind_lambda.h>
Alex Deymoef3955a2015-06-09 10:14:01 -07009
Alex Vakulenko9ed0cab2015-10-12 15:21:28 -070010namespace brillo {
Alex Deymoef3955a2015-06-09 10:14:01 -070011
12void MessageLoopRunUntil(
13 MessageLoop* loop,
14 base::TimeDelta timeout,
15 base::Callback<bool()> terminate) {
16 bool timeout_called = false;
17 MessageLoop::TaskId task_id = loop->PostDelayedTask(
Alex Deymo106edd12015-06-18 20:15:11 -070018 FROM_HERE,
19 base::Bind([&timeout_called]() { timeout_called = true; }),
20 timeout);
Alex Deymoef3955a2015-06-09 10:14:01 -070021 while (!timeout_called && (terminate.is_null() || !terminate.Run()))
22 loop->RunOnce(true);
23
24 if (!timeout_called)
25 loop->CancelTask(task_id);
26}
27
28int MessageLoopRunMaxIterations(MessageLoop* loop, int iterations) {
29 int result;
30 for (result = 0; result < iterations && loop->RunOnce(false); result++) {}
31 return result;
32}
33
Alex Vakulenko9ed0cab2015-10-12 15:21:28 -070034} // namespace brillo