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

Side by Side Diff: base/message_pump_libevent.cc

Issue 235007: Simplify failure codepaths of MessagePumpLibevent::WatchFileDescriptor() (Closed)
Patch Set: Created 11 years, 3 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 | « no previous file | no next file » | 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) 2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2008 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 "eintr_wrapper.h" 10 #include "eintr_wrapper.h"
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 DCHECK(mode == WATCH_READ || mode == WATCH_WRITE || mode == WATCH_READ_WRITE); 154 DCHECK(mode == WATCH_READ || mode == WATCH_WRITE || mode == WATCH_READ_WRITE);
155 155
156 int event_mask = persistent ? EV_PERSIST : 0; 156 int event_mask = persistent ? EV_PERSIST : 0;
157 if ((mode & WATCH_READ) != 0) { 157 if ((mode & WATCH_READ) != 0) {
158 event_mask |= EV_READ; 158 event_mask |= EV_READ;
159 } 159 }
160 if ((mode & WATCH_WRITE) != 0) { 160 if ((mode & WATCH_WRITE) != 0) {
161 event_mask |= EV_WRITE; 161 event_mask |= EV_WRITE;
162 } 162 }
163 163
164 // |should_delete_event| is true if we're modifying an event that's currently
165 // active in |controller|.
166 // If we're modifying an existing event and there's an error then we need to
167 // tell libevent to clean it up via event_delete() before returning.
168 bool should_delete_event = true;
169 scoped_ptr<event> evt(controller->ReleaseEvent()); 164 scoped_ptr<event> evt(controller->ReleaseEvent());
170 if (evt.get() == NULL) { 165 if (evt.get() == NULL) {
171 should_delete_event = false;
172 // Ownership is transferred to the controller. 166 // Ownership is transferred to the controller.
173 evt.reset(new event); 167 evt.reset(new event);
174 } else { 168 } else {
175 // It's illegal to use this function to listen on 2 separate fds with the
176 // same |controller|.
177 if (EVENT_FD(evt.get()) != fd) {
178 NOTREACHED() << "FDs don't match" << EVENT_FD(evt.get()) << "!=" << fd;
179 return false;
180 }
181
182 // Make sure we don't pick up any funky internal libevent masks. 169 // Make sure we don't pick up any funky internal libevent masks.
183 int old_interest_mask = evt.get()->ev_events & 170 int old_interest_mask = evt.get()->ev_events &
184 (EV_READ | EV_WRITE | EV_PERSIST); 171 (EV_READ | EV_WRITE | EV_PERSIST);
185 172
186 // Combine old/new event masks. 173 // Combine old/new event masks.
187 event_mask |= old_interest_mask; 174 event_mask |= old_interest_mask;
188 175
189 // Must disarm the event before we can reuse it. 176 // Must disarm the event before we can reuse it.
190 event_del(evt.get()); 177 event_del(evt.get());
178
179 // It's illegal to use this function to listen on 2 separate fds with the
180 // same |controller|.
181 if (EVENT_FD(evt.get()) != fd) {
182 NOTREACHED() << "FDs don't match" << EVENT_FD(evt.get()) << "!=" << fd;
183 return false;
184 }
191 } 185 }
192 186
193 // Set current interest mask and message pump for this event. 187 // Set current interest mask and message pump for this event.
194 event_set(evt.get(), fd, event_mask, OnLibeventNotification, 188 event_set(evt.get(), fd, event_mask, OnLibeventNotification, delegate);
195 delegate);
196 189
197 // Tell libevent which message pump this socket will belong to when we add it. 190 // Tell libevent which message pump this socket will belong to when we add it.
198 if (event_base_set(event_base_, evt.get()) != 0) { 191 if (event_base_set(event_base_, evt.get()) != 0) {
199 if (should_delete_event) {
200 event_del(evt.get());
201 }
202 return false; 192 return false;
203 } 193 }
204 194
205 // Add this socket to the list of monitored sockets. 195 // Add this socket to the list of monitored sockets.
206 if (event_add(evt.get(), NULL) != 0) { 196 if (event_add(evt.get(), NULL) != 0) {
207 if (should_delete_event) {
208 event_del(evt.get());
209 }
210 return false; 197 return false;
211 } 198 }
212 199
213 // Transfer ownership of evt to controller. 200 // Transfer ownership of evt to controller.
214 controller->Init(evt.release(), persistent); 201 controller->Init(evt.release(), persistent);
215 return true; 202 return true;
216 } 203 }
217 204
218 205
219 void MessagePumpLibevent::OnLibeventNotification(int fd, short flags, 206 void MessagePumpLibevent::OnLibeventNotification(int fd, short flags,
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 } 283 }
297 284
298 void MessagePumpLibevent::ScheduleDelayedWork(const Time& delayed_work_time) { 285 void MessagePumpLibevent::ScheduleDelayedWork(const Time& delayed_work_time) {
299 // We know that we can't be blocked on Wait right now since this method can 286 // We know that we can't be blocked on Wait right now since this method can
300 // only be called on the same thread as Run, so we only need to update our 287 // only be called on the same thread as Run, so we only need to update our
301 // record of how long to sleep when we do sleep. 288 // record of how long to sleep when we do sleep.
302 delayed_work_time_ = delayed_work_time; 289 delayed_work_time_ = delayed_work_time;
303 } 290 }
304 291
305 } // namespace base 292 } // namespace base
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698