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

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

Issue 17078005: Move message_pump to base/message_loop. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_loop/message_pump_libevent.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <fcntl.h> 8 #include <fcntl.h>
9 #include <unistd.h> 9 #include <unistd.h>
10 10
11 #include "base/auto_reset.h" 11 #include "base/auto_reset.h"
12 #include "base/compiler_specific.h" 12 #include "base/compiler_specific.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #if defined(OS_MACOSX)
15 #include "base/mac/scoped_nsautorelease_pool.h"
16 #endif
17 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/scoped_ptr.h"
18 #include "base/observer_list.h" 15 #include "base/observer_list.h"
19 #include "base/posix/eintr_wrapper.h" 16 #include "base/posix/eintr_wrapper.h"
20 #include "base/time.h" 17 #include "base/time.h"
21 #include "third_party/libevent/event.h" 18 #include "third_party/libevent/event.h"
22 19
23 #if defined(OS_MACOSX) 20 #if defined(OS_MACOSX)
24 #include "base/mac/scoped_nsautorelease_pool.h" 21 #include "base/mac/scoped_nsautorelease_pool.h"
25 #endif 22 #endif
26 23
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 211
215 // Tell libevent to break out of inner loop. 212 // Tell libevent to break out of inner loop.
216 static void timer_callback(int fd, short events, void *context) 213 static void timer_callback(int fd, short events, void *context)
217 { 214 {
218 event_base_loopbreak((struct event_base *)context); 215 event_base_loopbreak((struct event_base *)context);
219 } 216 }
220 217
221 // Reentrant! 218 // Reentrant!
222 void MessagePumpLibevent::Run(Delegate* delegate) { 219 void MessagePumpLibevent::Run(Delegate* delegate) {
223 DCHECK(keep_running_) << "Quit must have been called outside of Run!"; 220 DCHECK(keep_running_) << "Quit must have been called outside of Run!";
224 base::AutoReset<bool> auto_reset_in_run(&in_run_, true); 221 AutoReset<bool> auto_reset_in_run(&in_run_, true);
225 222
226 // event_base_loopexit() + EVLOOP_ONCE is leaky, see http://crbug.com/25641. 223 // event_base_loopexit() + EVLOOP_ONCE is leaky, see http://crbug.com/25641.
227 // Instead, make our own timer and reuse it on each call to event_base_loop(). 224 // Instead, make our own timer and reuse it on each call to event_base_loop().
228 scoped_ptr<event> timer_event(new event); 225 scoped_ptr<event> timer_event(new event);
229 226
230 for (;;) { 227 for (;;) {
231 #if defined(OS_MACOSX) 228 #if defined(OS_MACOSX)
232 mac::ScopedNSAutoreleasePool autorelease_pool; 229 mac::ScopedNSAutoreleasePool autorelease_pool;
233 #endif 230 #endif
234 231
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 event_base_set(event_base_, wakeup_event_); 333 event_base_set(event_base_, wakeup_event_);
337 334
338 if (event_add(wakeup_event_, 0)) 335 if (event_add(wakeup_event_, 0))
339 return false; 336 return false;
340 return true; 337 return true;
341 } 338 }
342 339
343 // static 340 // static
344 void MessagePumpLibevent::OnLibeventNotification(int fd, short flags, 341 void MessagePumpLibevent::OnLibeventNotification(int fd, short flags,
345 void* context) { 342 void* context) {
346 base::WeakPtr<FileDescriptorWatcher> controller = 343 WeakPtr<FileDescriptorWatcher> controller =
347 static_cast<FileDescriptorWatcher*>(context)->weak_factory_.GetWeakPtr(); 344 static_cast<FileDescriptorWatcher*>(context)->weak_factory_.GetWeakPtr();
348 DCHECK(controller.get()); 345 DCHECK(controller.get());
349 346
350 MessagePumpLibevent* pump = controller->pump(); 347 MessagePumpLibevent* pump = controller->pump();
351 pump->processed_io_events_ = true; 348 pump->processed_io_events_ = true;
352 349
353 if (flags & EV_WRITE) { 350 if (flags & EV_WRITE) {
354 controller->OnFileCanWriteWithoutBlocking(fd, pump); 351 controller->OnFileCanWriteWithoutBlocking(fd, pump);
355 } 352 }
356 // Check |controller| in case it's been deleted in 353 // Check |controller| in case it's been deleted in
357 // controller->OnFileCanWriteWithoutBlocking(). 354 // controller->OnFileCanWriteWithoutBlocking().
358 if (controller.get() && flags & EV_READ) { 355 if (controller.get() && flags & EV_READ) {
359 controller->OnFileCanReadWithoutBlocking(fd, pump); 356 controller->OnFileCanReadWithoutBlocking(fd, pump);
360 } 357 }
361 } 358 }
362 359
363 // Called if a byte is received on the wakeup pipe. 360 // Called if a byte is received on the wakeup pipe.
364 // static 361 // static
365 void MessagePumpLibevent::OnWakeup(int socket, short flags, void* context) { 362 void MessagePumpLibevent::OnWakeup(int socket, short flags, void* context) {
366 base::MessagePumpLibevent* that = 363 MessagePumpLibevent* that = static_cast<MessagePumpLibevent*>(context);
367 static_cast<base::MessagePumpLibevent*>(context);
368 DCHECK(that->wakeup_pipe_out_ == socket); 364 DCHECK(that->wakeup_pipe_out_ == socket);
369 365
370 // Remove and discard the wakeup byte. 366 // Remove and discard the wakeup byte.
371 char buf; 367 char buf;
372 int nread = HANDLE_EINTR(read(socket, &buf, 1)); 368 int nread = HANDLE_EINTR(read(socket, &buf, 1));
373 DCHECK_EQ(nread, 1); 369 DCHECK_EQ(nread, 1);
374 that->processed_io_events_ = true; 370 that->processed_io_events_ = true;
375 // Tell libevent to break out of inner loop. 371 // Tell libevent to break out of inner loop.
376 event_base_loopbreak(that->event_base_); 372 event_base_loopbreak(that->event_base_);
377 } 373 }
378 374
379 } // namespace base 375 } // namespace base
OLDNEW
« no previous file with comments | « base/message_loop/message_pump_libevent.h ('k') | base/message_loop/message_pump_libevent_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698