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