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

Side by Side Diff: base/message_pump_libevent.cc

Issue 7262011: Change MessagePumpLibevent::Run to handle IO events before doing idle (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years, 6 months 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
« no previous file with comments | « no previous file | third_party/libevent/event.c » ('j') | third_party/libevent/event.c » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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_pump_libevent.h" 5 #include "base/message_pump_libevent.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <fcntl.h> 8 #include <fcntl.h>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 // Instead, make our own timer and reuse it on each call to event_base_loop(). 219 // Instead, make our own timer and reuse it on each call to event_base_loop().
220 scoped_ptr<event> timer_event(new event); 220 scoped_ptr<event> timer_event(new event);
221 221
222 for (;;) { 222 for (;;) {
223 mac::ScopedNSAutoreleasePool autorelease_pool; 223 mac::ScopedNSAutoreleasePool autorelease_pool;
224 224
225 bool did_work = delegate->DoWork(); 225 bool did_work = delegate->DoWork();
226 if (!keep_running_) 226 if (!keep_running_)
227 break; 227 break;
228 228
229 int rv = event_base_loop(event_base_, EVLOOP_NONBLOCK);
230 did_work |= (rv == 2);
231
229 did_work |= delegate->DoDelayedWork(&delayed_work_time_); 232 did_work |= delegate->DoDelayedWork(&delayed_work_time_);
230 if (!keep_running_) 233 if (!keep_running_)
231 break; 234 break;
232 235
233 if (did_work) 236 if (did_work)
234 continue; 237 continue;
235 238
236 did_work = delegate->DoIdleWork(); 239 did_work = delegate->DoIdleWork();
237 if (!keep_running_) 240 if (!keep_running_)
238 break; 241 break;
239 242
240 if (did_work) 243 if (did_work)
241 continue; 244 continue;
242 245
243 // EVLOOP_ONCE tells libevent to only block once, 246 // EVLOOP_ONCE tells libevent to only block once,
244 // but to service all pending events when it wakes up. 247 // but to service all pending events when it wakes up.
245 if (delayed_work_time_.is_null()) { 248 if (delayed_work_time_.is_null()) {
246 event_base_loop(event_base_, EVLOOP_ONCE); 249 event_base_loop(event_base_, EVLOOP_ONCE);
wtc 2011/06/25 00:39:45 The original code calls event_base_loop here and o
247 } else { 250 } else {
248 TimeDelta delay = delayed_work_time_ - TimeTicks::Now(); 251 TimeDelta delay = delayed_work_time_ - TimeTicks::Now();
249 if (delay > TimeDelta()) { 252 if (delay > TimeDelta()) {
250 struct timeval poll_tv; 253 struct timeval poll_tv;
251 poll_tv.tv_sec = delay.InSeconds(); 254 poll_tv.tv_sec = delay.InSeconds();
252 poll_tv.tv_usec = delay.InMicroseconds() % Time::kMicrosecondsPerSecond; 255 poll_tv.tv_usec = delay.InMicroseconds() % Time::kMicrosecondsPerSecond;
253 event_set(timer_event.get(), -1, 0, timer_callback, event_base_); 256 event_set(timer_event.get(), -1, 0, timer_callback, event_base_);
254 event_base_set(event_base_, timer_event.get()); 257 event_base_set(event_base_, timer_event.get());
255 event_add(timer_event.get(), &poll_tv); 258 event_add(timer_event.get(), &poll_tv);
256 event_base_loop(event_base_, EVLOOP_ONCE); 259 event_base_loop(event_base_, EVLOOP_ONCE);
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 352
350 // Remove and discard the wakeup byte. 353 // Remove and discard the wakeup byte.
351 char buf; 354 char buf;
352 int nread = HANDLE_EINTR(read(socket, &buf, 1)); 355 int nread = HANDLE_EINTR(read(socket, &buf, 1));
353 DCHECK_EQ(nread, 1); 356 DCHECK_EQ(nread, 1);
354 // Tell libevent to break out of inner loop. 357 // Tell libevent to break out of inner loop.
355 event_base_loopbreak(that->event_base_); 358 event_base_loopbreak(that->event_base_);
356 } 359 }
357 360
358 } // namespace base 361 } // namespace base
OLDNEW
« no previous file with comments | « no previous file | third_party/libevent/event.c » ('j') | third_party/libevent/event.c » ('J')

Powered by Google App Engine
This is Rietveld 408576698