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