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

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

Issue 1950633002: Remove IOObservers from MessageLoopForIO. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: self review Created 4 years, 7 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
« no previous file with comments | « base/message_loop/message_pump_libevent.h ('k') | base/message_loop/message_pump_win.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) 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_loop/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 <unistd.h> 8 #include <unistd.h>
9 9
10 #include <memory> 10 #include <memory>
11 11
12 #include "base/auto_reset.h" 12 #include "base/auto_reset.h"
13 #include "base/compiler_specific.h" 13 #include "base/compiler_specific.h"
14 #include "base/files/file_util.h" 14 #include "base/files/file_util.h"
15 #include "base/logging.h" 15 #include "base/logging.h"
16 #include "base/observer_list.h"
17 #include "base/posix/eintr_wrapper.h" 16 #include "base/posix/eintr_wrapper.h"
18 #include "base/third_party/libevent/event.h" 17 #include "base/third_party/libevent/event.h"
19 #include "base/time/time.h" 18 #include "base/time/time.h"
20 #include "base/trace_event/trace_event.h" 19 #include "base/trace_event/trace_event.h"
21 #include "build/build_config.h" 20 #include "build/build_config.h"
22 21
23 #if defined(OS_MACOSX) 22 #if defined(OS_MACOSX)
24 #include "base/mac/scoped_nsautorelease_pool.h" 23 #include "base/mac/scoped_nsautorelease_pool.h"
25 #endif 24 #endif
26 25
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 event_ = NULL; 85 event_ = NULL;
87 return e; 86 return e;
88 } 87 }
89 88
90 void MessagePumpLibevent::FileDescriptorWatcher::OnFileCanReadWithoutBlocking( 89 void MessagePumpLibevent::FileDescriptorWatcher::OnFileCanReadWithoutBlocking(
91 int fd, MessagePumpLibevent* pump) { 90 int fd, MessagePumpLibevent* pump) {
92 // Since OnFileCanWriteWithoutBlocking() gets called first, it can stop 91 // Since OnFileCanWriteWithoutBlocking() gets called first, it can stop
93 // watching the file descriptor. 92 // watching the file descriptor.
94 if (!watcher_) 93 if (!watcher_)
95 return; 94 return;
96 pump->WillProcessIOEvent();
97 watcher_->OnFileCanReadWithoutBlocking(fd); 95 watcher_->OnFileCanReadWithoutBlocking(fd);
98 pump->DidProcessIOEvent();
99 } 96 }
100 97
101 void MessagePumpLibevent::FileDescriptorWatcher::OnFileCanWriteWithoutBlocking( 98 void MessagePumpLibevent::FileDescriptorWatcher::OnFileCanWriteWithoutBlocking(
102 int fd, MessagePumpLibevent* pump) { 99 int fd, MessagePumpLibevent* pump) {
103 DCHECK(watcher_); 100 DCHECK(watcher_);
104 pump->WillProcessIOEvent();
105 watcher_->OnFileCanWriteWithoutBlocking(fd); 101 watcher_->OnFileCanWriteWithoutBlocking(fd);
106 pump->DidProcessIOEvent();
107 } 102 }
108 103
109 MessagePumpLibevent::MessagePumpLibevent() 104 MessagePumpLibevent::MessagePumpLibevent()
110 : keep_running_(true), 105 : keep_running_(true),
111 in_run_(false), 106 in_run_(false),
112 processed_io_events_(false), 107 processed_io_events_(false),
113 event_base_(event_base_new()), 108 event_base_(event_base_new()),
114 wakeup_pipe_in_(-1), 109 wakeup_pipe_in_(-1),
115 wakeup_pipe_out_(-1) { 110 wakeup_pipe_out_(-1) {
116 if (!Init()) 111 if (!Init())
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 187
193 // Transfer ownership of evt to controller. 188 // Transfer ownership of evt to controller.
194 controller->Init(evt.release()); 189 controller->Init(evt.release());
195 190
196 controller->set_watcher(delegate); 191 controller->set_watcher(delegate);
197 controller->set_pump(this); 192 controller->set_pump(this);
198 193
199 return true; 194 return true;
200 } 195 }
201 196
202 void MessagePumpLibevent::AddIOObserver(IOObserver *obs) {
203 io_observers_.AddObserver(obs);
204 }
205
206 void MessagePumpLibevent::RemoveIOObserver(IOObserver *obs) {
207 io_observers_.RemoveObserver(obs);
208 }
209
210 // Tell libevent to break out of inner loop. 197 // Tell libevent to break out of inner loop.
211 static void timer_callback(int fd, short events, void *context) 198 static void timer_callback(int fd, short events, void *context)
212 { 199 {
213 event_base_loopbreak((struct event_base *)context); 200 event_base_loopbreak((struct event_base *)context);
214 } 201 }
215 202
216 // Reentrant! 203 // Reentrant!
217 void MessagePumpLibevent::Run(Delegate* delegate) { 204 void MessagePumpLibevent::Run(Delegate* delegate) {
218 AutoReset<bool> auto_reset_keep_running(&keep_running_, true); 205 AutoReset<bool> auto_reset_keep_running(&keep_running_, true);
219 AutoReset<bool> auto_reset_in_run(&in_run_, true); 206 AutoReset<bool> auto_reset_in_run(&in_run_, true);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 } 281 }
295 282
296 void MessagePumpLibevent::ScheduleDelayedWork( 283 void MessagePumpLibevent::ScheduleDelayedWork(
297 const TimeTicks& delayed_work_time) { 284 const TimeTicks& delayed_work_time) {
298 // We know that we can't be blocked on Wait right now since this method can 285 // We know that we can't be blocked on Wait right now since this method can
299 // only be called on the same thread as Run, so we only need to update our 286 // only be called on the same thread as Run, so we only need to update our
300 // record of how long to sleep when we do sleep. 287 // record of how long to sleep when we do sleep.
301 delayed_work_time_ = delayed_work_time; 288 delayed_work_time_ = delayed_work_time;
302 } 289 }
303 290
304 void MessagePumpLibevent::WillProcessIOEvent() {
305 FOR_EACH_OBSERVER(IOObserver, io_observers_, WillProcessIOEvent());
306 }
307
308 void MessagePumpLibevent::DidProcessIOEvent() {
309 FOR_EACH_OBSERVER(IOObserver, io_observers_, DidProcessIOEvent());
310 }
311
312 bool MessagePumpLibevent::Init() { 291 bool MessagePumpLibevent::Init() {
313 int fds[2]; 292 int fds[2];
314 if (pipe(fds)) { 293 if (pipe(fds)) {
315 DLOG(ERROR) << "pipe() failed, errno: " << errno; 294 DLOG(ERROR) << "pipe() failed, errno: " << errno;
316 return false; 295 return false;
317 } 296 }
318 if (!SetNonBlocking(fds[0])) { 297 if (!SetNonBlocking(fds[0])) {
319 DLOG(ERROR) << "SetNonBlocking for pipe fd[0] failed, errno: " << errno; 298 DLOG(ERROR) << "SetNonBlocking for pipe fd[0] failed, errno: " << errno;
320 return false; 299 return false;
321 } 300 }
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 // Remove and discard the wakeup byte. 354 // Remove and discard the wakeup byte.
376 char buf; 355 char buf;
377 int nread = HANDLE_EINTR(read(socket, &buf, 1)); 356 int nread = HANDLE_EINTR(read(socket, &buf, 1));
378 DCHECK_EQ(nread, 1); 357 DCHECK_EQ(nread, 1);
379 that->processed_io_events_ = true; 358 that->processed_io_events_ = true;
380 // Tell libevent to break out of inner loop. 359 // Tell libevent to break out of inner loop.
381 event_base_loopbreak(that->event_base_); 360 event_base_loopbreak(that->event_base_);
382 } 361 }
383 362
384 } // namespace base 363 } // namespace base
OLDNEW
« no previous file with comments | « base/message_loop/message_pump_libevent.h ('k') | base/message_loop/message_pump_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698