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

Side by Side Diff: base/message_pump_libevent.cc

Issue 3884001: Switch to using TimeTicks rather than Time in message loops (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 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
« no previous file with comments | « base/message_pump_libevent.h ('k') | base/message_pump_mac.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 break; 283 break;
284 284
285 if (did_work) 285 if (did_work)
286 continue; 286 continue;
287 287
288 // EVLOOP_ONCE tells libevent to only block once, 288 // EVLOOP_ONCE tells libevent to only block once,
289 // but to service all pending events when it wakes up. 289 // but to service all pending events when it wakes up.
290 if (delayed_work_time_.is_null()) { 290 if (delayed_work_time_.is_null()) {
291 event_base_loop(event_base_, EVLOOP_ONCE); 291 event_base_loop(event_base_, EVLOOP_ONCE);
292 } else { 292 } else {
293 TimeDelta delay = delayed_work_time_ - Time::Now(); 293 TimeDelta delay = delayed_work_time_ - TimeTicks::Now();
294 if (delay > TimeDelta()) { 294 if (delay > TimeDelta()) {
295 struct timeval poll_tv; 295 struct timeval poll_tv;
296 poll_tv.tv_sec = delay.InSeconds(); 296 poll_tv.tv_sec = delay.InSeconds();
297 poll_tv.tv_usec = delay.InMicroseconds() % Time::kMicrosecondsPerSecond; 297 poll_tv.tv_usec = delay.InMicroseconds() % Time::kMicrosecondsPerSecond;
298 event_set(timer_event.get(), -1, 0, timer_callback, event_base_); 298 event_set(timer_event.get(), -1, 0, timer_callback, event_base_);
299 event_base_set(event_base_, timer_event.get()); 299 event_base_set(event_base_, timer_event.get());
300 event_add(timer_event.get(), &poll_tv); 300 event_add(timer_event.get(), &poll_tv);
301 event_base_loop(event_base_, EVLOOP_ONCE); 301 event_base_loop(event_base_, EVLOOP_ONCE);
302 event_del(timer_event.get()); 302 event_del(timer_event.get());
303 } else { 303 } else {
304 // It looks like delayed_work_time_ indicates a time in the past, so we 304 // It looks like delayed_work_time_ indicates a time in the past, so we
305 // need to call DoDelayedWork now. 305 // need to call DoDelayedWork now.
306 delayed_work_time_ = Time(); 306 delayed_work_time_ = TimeTicks();
307 } 307 }
308 } 308 }
309 } 309 }
310 310
311 keep_running_ = true; 311 keep_running_ = true;
312 } 312 }
313 313
314 void MessagePumpLibevent::Quit() { 314 void MessagePumpLibevent::Quit() {
315 DCHECK(in_run_); 315 DCHECK(in_run_);
316 // Tell both libevent and Run that they should break out of their loops. 316 // Tell both libevent and Run that they should break out of their loops.
317 keep_running_ = false; 317 keep_running_ = false;
318 ScheduleWork(); 318 ScheduleWork();
319 } 319 }
320 320
321 void MessagePumpLibevent::ScheduleWork() { 321 void MessagePumpLibevent::ScheduleWork() {
322 // Tell libevent (in a threadsafe way) that it should break out of its loop. 322 // Tell libevent (in a threadsafe way) that it should break out of its loop.
323 char buf = 0; 323 char buf = 0;
324 int nwrite = HANDLE_EINTR(write(wakeup_pipe_in_, &buf, 1)); 324 int nwrite = HANDLE_EINTR(write(wakeup_pipe_in_, &buf, 1));
325 DCHECK(nwrite == 1 || errno == EAGAIN) 325 DCHECK(nwrite == 1 || errno == EAGAIN)
326 << "[nwrite:" << nwrite << "] [errno:" << errno << "]"; 326 << "[nwrite:" << nwrite << "] [errno:" << errno << "]";
327 } 327 }
328 328
329 void MessagePumpLibevent::ScheduleDelayedWork(const Time& delayed_work_time) { 329 void MessagePumpLibevent::ScheduleDelayedWork(
330 const TimeTicks& delayed_work_time) {
330 // We know that we can't be blocked on Wait right now since this method can 331 // We know that we can't be blocked on Wait right now since this method can
331 // only be called on the same thread as Run, so we only need to update our 332 // only be called on the same thread as Run, so we only need to update our
332 // record of how long to sleep when we do sleep. 333 // record of how long to sleep when we do sleep.
333 delayed_work_time_ = delayed_work_time; 334 delayed_work_time_ = delayed_work_time;
334 } 335 }
335 336
336 void MessagePumpLibevent::AddIOObserver(IOObserver *obs) { 337 void MessagePumpLibevent::AddIOObserver(IOObserver *obs) {
337 io_observers_.AddObserver(obs); 338 io_observers_.AddObserver(obs);
338 } 339 }
339 340
340 void MessagePumpLibevent::RemoveIOObserver(IOObserver *obs) { 341 void MessagePumpLibevent::RemoveIOObserver(IOObserver *obs) {
341 io_observers_.RemoveObserver(obs); 342 io_observers_.RemoveObserver(obs);
342 } 343 }
343 344
344 void MessagePumpLibevent::WillProcessIOEvent() { 345 void MessagePumpLibevent::WillProcessIOEvent() {
345 FOR_EACH_OBSERVER(IOObserver, io_observers_, WillProcessIOEvent()); 346 FOR_EACH_OBSERVER(IOObserver, io_observers_, WillProcessIOEvent());
346 } 347 }
347 348
348 void MessagePumpLibevent::DidProcessIOEvent() { 349 void MessagePumpLibevent::DidProcessIOEvent() {
349 FOR_EACH_OBSERVER(IOObserver, io_observers_, DidProcessIOEvent()); 350 FOR_EACH_OBSERVER(IOObserver, io_observers_, DidProcessIOEvent());
350 } 351 }
351 352
352 } // namespace base 353 } // namespace base
OLDNEW
« no previous file with comments | « base/message_pump_libevent.h ('k') | base/message_pump_mac.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698