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