OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |