Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(903)

Side by Side Diff: base/message_loop/message_loop.cc

Issue 61643006: Adds the ability for MessageLoop to take a MessagePump (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/message_loop/message_loop.h" 5 #include "base/message_loop/message_loop.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 // Returns true if MessagePump::ScheduleWork() must be called one 91 // Returns true if MessagePump::ScheduleWork() must be called one
92 // time for every task that is added to the MessageLoop incoming queue. 92 // time for every task that is added to the MessageLoop incoming queue.
93 bool AlwaysNotifyPump(MessageLoop::Type type) { 93 bool AlwaysNotifyPump(MessageLoop::Type type) {
94 #if defined(OS_ANDROID) 94 #if defined(OS_ANDROID)
95 return type == MessageLoop::TYPE_UI || type == MessageLoop::TYPE_JAVA; 95 return type == MessageLoop::TYPE_UI || type == MessageLoop::TYPE_JAVA;
96 #else 96 #else
97 return false; 97 return false;
98 #endif 98 #endif
99 } 99 }
100 100
101 MessagePump* CreateMessagePump(MessageLoop::Type type) {
102 // TODO(rvargas): Get rid of the OS guards.
103 #if defined(OS_WIN)
104 #define MESSAGE_PUMP_UI new MessagePumpForUI()
105 #define MESSAGE_PUMP_IO new MessagePumpForIO()
106 #elif defined(OS_IOS)
107 #define MESSAGE_PUMP_UI MessagePumpMac::Create()
108 #define MESSAGE_PUMP_IO new MessagePumpIOSForIO()
109 #elif defined(OS_MACOSX)
110 #define MESSAGE_PUMP_UI MessagePumpMac::Create()
111 #define MESSAGE_PUMP_IO new MessagePumpLibevent()
112 #elif defined(OS_NACL)
113 // Currently NaCl doesn't have a UI MessageLoop.
114 // TODO(abarth): Figure out if we need this.
115 #define MESSAGE_PUMP_UI NULL
116 // ipc_channel_nacl.cc uses a worker thread to do socket reads currently, and
117 // doesn't require extra support for watching file descriptors.
118 #define MESSAGE_PUMP_IO new MessagePumpDefault()
119 #elif defined(OS_POSIX) // POSIX but not MACOSX.
120 #define MESSAGE_PUMP_UI new MessagePumpForUI()
121 #define MESSAGE_PUMP_IO new MessagePumpLibevent()
122 #else
123 #error Not implemented
124 #endif
125
126 if (type == MessageLoop::TYPE_UI) {
127 if (message_pump_for_ui_factory_)
128 return message_pump_for_ui_factory_();
129 return MESSAGE_PUMP_UI;
130 }
131 if (type == MessageLoop::TYPE_IO)
132 return MESSAGE_PUMP_IO;
133 #if defined(TOOLKIT_GTK)
134 if (type == MessageLoop::TYPE_GPU)
135 return new MessagePumpX11();
136 #endif
137 #if defined(OS_ANDROID)
138 if (type == MessageLoop::TYPE_JAVA)
139 return MESSAGE_PUMP_UI;
140 #endif
141 DCHECK_EQ(MessageLoop::TYPE_DEFAULT, type);
142 return new MessagePumpDefault();
143 }
144
101 } // namespace 145 } // namespace
102 146
103 //------------------------------------------------------------------------------ 147 //------------------------------------------------------------------------------
104 148
105 #if defined(OS_WIN) 149 #if defined(OS_WIN)
106 150
107 // Upon a SEH exception in this thread, it restores the original unhandled 151 // Upon a SEH exception in this thread, it restores the original unhandled
108 // exception filter. 152 // exception filter.
109 static int SEHFilter(LPTOP_LEVEL_EXCEPTION_FILTER old_filter) { 153 static int SEHFilter(LPTOP_LEVEL_EXCEPTION_FILTER old_filter) {
110 ::SetUnhandledExceptionFilter(old_filter); 154 ::SetUnhandledExceptionFilter(old_filter);
(...skipping 17 matching lines...) Expand all
128 } 172 }
129 173
130 MessageLoop::TaskObserver::~TaskObserver() { 174 MessageLoop::TaskObserver::~TaskObserver() {
131 } 175 }
132 176
133 MessageLoop::DestructionObserver::~DestructionObserver() { 177 MessageLoop::DestructionObserver::~DestructionObserver() {
134 } 178 }
135 179
136 //------------------------------------------------------------------------------ 180 //------------------------------------------------------------------------------
137 181
138 MessageLoop::MessageLoop(Type type) 182 MessageLoop::MessageLoop(Type type, MessagePump* message_pump)
139 : type_(type), 183 : pump_(message_pump),
184 type_(type),
140 exception_restoration_(false), 185 exception_restoration_(false),
141 nestable_tasks_allowed_(true), 186 nestable_tasks_allowed_(true),
142 #if defined(OS_WIN) 187 #if defined(OS_WIN)
143 os_modal_loop_(false), 188 os_modal_loop_(false),
144 #endif // OS_WIN 189 #endif // OS_WIN
145 message_histogram_(NULL), 190 message_histogram_(NULL),
146 run_loop_(NULL) { 191 run_loop_(NULL) {
147 DCHECK(!current()) << "should only have one message loop per thread"; 192 DCHECK(!current()) << "should only have one message loop per thread";
148 lazy_tls_ptr.Pointer()->Set(this); 193 lazy_tls_ptr.Pointer()->Set(this);
149 194
150 incoming_task_queue_ = new internal::IncomingTaskQueue(this); 195 incoming_task_queue_ = new internal::IncomingTaskQueue(this);
151 message_loop_proxy_ = 196 message_loop_proxy_ =
152 new internal::MessageLoopProxyImpl(incoming_task_queue_); 197 new internal::MessageLoopProxyImpl(incoming_task_queue_);
153 thread_task_runner_handle_.reset( 198 thread_task_runner_handle_.reset(
154 new ThreadTaskRunnerHandle(message_loop_proxy_)); 199 new ThreadTaskRunnerHandle(message_loop_proxy_));
155 200
156 // TODO(rvargas): Get rid of the OS guards. 201 if (!pump_.get())
157 #if defined(OS_WIN) 202 pump_.reset(CreateMessagePump(type));
158 #define MESSAGE_PUMP_UI new MessagePumpForUI()
159 #define MESSAGE_PUMP_IO new MessagePumpForIO()
160 #elif defined(OS_IOS)
161 #define MESSAGE_PUMP_UI MessagePumpMac::Create()
162 #define MESSAGE_PUMP_IO new MessagePumpIOSForIO()
163 #elif defined(OS_MACOSX)
164 #define MESSAGE_PUMP_UI MessagePumpMac::Create()
165 #define MESSAGE_PUMP_IO new MessagePumpLibevent()
166 #elif defined(OS_NACL)
167 // Currently NaCl doesn't have a UI MessageLoop.
168 // TODO(abarth): Figure out if we need this.
169 #define MESSAGE_PUMP_UI NULL
170 // ipc_channel_nacl.cc uses a worker thread to do socket reads currently, and
171 // doesn't require extra support for watching file descriptors.
172 #define MESSAGE_PUMP_IO new MessagePumpDefault()
173 #elif defined(OS_POSIX) // POSIX but not MACOSX.
174 #define MESSAGE_PUMP_UI new MessagePumpForUI()
175 #define MESSAGE_PUMP_IO new MessagePumpLibevent()
176 #else
177 #error Not implemented
178 #endif
179
180 if (type_ == TYPE_UI) {
181 if (message_pump_for_ui_factory_)
182 pump_.reset(message_pump_for_ui_factory_());
183 else
184 pump_.reset(MESSAGE_PUMP_UI);
185 } else if (type_ == TYPE_IO) {
186 pump_.reset(MESSAGE_PUMP_IO);
187 #if defined(TOOLKIT_GTK)
188 } else if (type_ == TYPE_GPU) {
189 pump_.reset(new MessagePumpX11());
190 #endif
191 #if defined(OS_ANDROID)
192 } else if (type_ == TYPE_JAVA) {
193 pump_.reset(MESSAGE_PUMP_UI);
194 #endif
195 } else {
196 DCHECK_EQ(TYPE_DEFAULT, type_);
197 pump_.reset(new MessagePumpDefault());
198 }
199 } 203 }
200 204
201 MessageLoop::~MessageLoop() { 205 MessageLoop::~MessageLoop() {
202 DCHECK_EQ(this, current()); 206 DCHECK_EQ(this, current());
203 207
204 DCHECK(!run_loop_); 208 DCHECK(!run_loop_);
205 209
206 // Clean up any unprocessed tasks, but take care: deleting a task could 210 // Clean up any unprocessed tasks, but take care: deleting a task could
207 // result in the addition of more tasks (e.g., via DeleteSoon). We set a 211 // result in the addition of more tasks (e.g., via DeleteSoon). We set a
208 // limit on the number of times we will allow a deleted task to generate more 212 // limit on the number of times we will allow a deleted task to generate more
(...skipping 553 matching lines...) Expand 10 before | Expand all | Expand 10 after
762 fd, 766 fd,
763 persistent, 767 persistent,
764 mode, 768 mode,
765 controller, 769 controller,
766 delegate); 770 delegate);
767 } 771 }
768 772
769 #endif 773 #endif
770 774
771 } // namespace base 775 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698