blob: 2fa5d946461d4f33b93f993b5ea26b8b33e47074 [file] [log] [blame]
[email protected]b2e97292008-09-02 18:20:341// Copyright (c) 2006-2008 The Chromium 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
5#include "base/message_pump_default.h"
6
7#include "base/logging.h"
8
9namespace base {
10
11MessagePumpDefault::MessagePumpDefault()
12 : keep_running_(true),
13 event_(false, false) {
14}
15
16void MessagePumpDefault::Run(Delegate* delegate) {
17 DCHECK(keep_running_) << "Quit must have been called outside of Run!";
18
19 for (;;) {
20 bool did_work = delegate->DoWork();
21 if (!keep_running_)
22 break;
23
24 did_work |= delegate->DoDelayedWork(&delayed_work_time_);
25 if (!keep_running_)
26 break;
27
28 if (did_work)
29 continue;
30
31 did_work = delegate->DoIdleWork();
32 if (!keep_running_)
33 break;
34
35 if (did_work)
36 continue;
37
38 if (delayed_work_time_.is_null()) {
39 event_.Wait();
40 } else {
41 TimeDelta delay = delayed_work_time_ - Time::Now();
42 if (delay > TimeDelta()) {
43 event_.TimedWait(delay);
44 } else {
45 // It looks like delayed_work_time_ indicates a time in the past, so we
46 // need to call DoDelayedWork now.
47 delayed_work_time_ = Time();
48 }
49 }
50 // Since event_ is auto-reset, we don't need to do anything special here
51 // other than service each delegate method.
52 }
53
54 keep_running_ = true;
55}
56
57void MessagePumpDefault::Quit() {
58 keep_running_ = false;
59}
60
61void MessagePumpDefault::ScheduleWork() {
62 // Since this can be called on any thread, we need to ensure that our Run
63 // loop wakes up.
64 event_.Signal();
65}
66
67void MessagePumpDefault::ScheduleDelayedWork(const Time& delayed_work_time) {
68 // We know that we can't be blocked on Wait right now since this method can
69 // only be called on the same thread as Run, so we only need to update our
70 // record of how long to sleep when we do sleep.
71 delayed_work_time_ = delayed_work_time;
72}
73
74} // namespace base
75