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

Side by Side Diff: dart/runtime/bin/eventhandler_linux.h

Issue 665823007: Several bugfixes in dart:io's handing of sockets (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 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
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef BIN_EVENTHANDLER_LINUX_H_ 5 #ifndef BIN_EVENTHANDLER_LINUX_H_
6 #define BIN_EVENTHANDLER_LINUX_H_ 6 #define BIN_EVENTHANDLER_LINUX_H_
7 7
8 #if !defined(BIN_EVENTHANDLER_H_) 8 #if !defined(BIN_EVENTHANDLER_H_)
9 #error Do not include eventhandler_linux.h directly; use eventhandler.h instead. 9 #error Do not include eventhandler_linux.h directly; use eventhandler.h instead.
10 #endif 10 #endif
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 bool AddPort(Dart_Port port) { 180 bool AddPort(Dart_Port port) {
181 HashMap::Entry* entry = tokens_map_.Lookup( 181 HashMap::Entry* entry = tokens_map_.Lookup(
182 GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port), true); 182 GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port), true);
183 entry->value = reinterpret_cast<void*>(kTokenCount); 183 entry->value = reinterpret_cast<void*>(kTokenCount);
184 return live_ports_.Add(port); 184 return live_ports_.Add(port);
185 } 185 }
186 186
187 virtual bool RemovePort(Dart_Port port) { 187 virtual bool RemovePort(Dart_Port port) {
188 HashMap::Entry* entry = tokens_map_.Lookup( 188 HashMap::Entry* entry = tokens_map_.Lookup(
189 GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port), false); 189 GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port), false);
190 ASSERT(entry != NULL); 190 if (entry != NULL) {
191 intptr_t tokens = reinterpret_cast<intptr_t>(entry->value); 191 intptr_t tokens = reinterpret_cast<intptr_t>(entry->value);
192 if (tokens == 0) { 192 if (tokens == 0) {
193 while (idle_ports_.head() != port) { 193 while (idle_ports_.head() != port) {
194 idle_ports_.Rotate(); 194 idle_ports_.Rotate();
195 }
196 idle_ports_.RemoveHead();
197 } else {
198 while (live_ports_.head() != port) {
199 live_ports_.Rotate();
200 }
201 live_ports_.RemoveHead();
195 } 202 }
196 idle_ports_.RemoveHead(); 203 tokens_map_.Remove(
204 GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port));
197 } else { 205 } else {
198 while (live_ports_.head() != port) { 206 // NOTE: This is a listening socket which has been immediately closed.
Søren Gjesse 2014/10/22 07:23:51 Add "do nothing" to the comment to make it obvious
kustermann 2014/10/23 21:59:23 Done.
199 live_ports_.Rotate(); 207 //
200 } 208 // If a listening socket is not listened on, the event handler does not
201 live_ports_.RemoveHead(); 209 // know about it beforehand. So the first time the event handler knows
210 // about it, is when it is supposed to be closed.
211 // But whether to close it, depends on whether other isolates have it open
212 // as well or not.
202 } 213 }
203 tokens_map_.Remove(
204 GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port));
205 return !live_ports_.HasHead(); 214 return !live_ports_.HasHead();
206 } 215 }
207 216
208 bool TakeToken() { 217 bool TakeToken() {
209 ASSERT(live_ports_.HasHead()); 218 ASSERT(live_ports_.HasHead());
210 Dart_Port port = live_ports_.head(); 219 Dart_Port port = live_ports_.head();
211 HashMap::Entry* entry = tokens_map_.Lookup( 220 HashMap::Entry* entry = tokens_map_.Lookup(
212 GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port), false); 221 GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port), false);
213 ASSERT(entry != NULL); 222 ASSERT(entry != NULL);
214 intptr_t tokens = reinterpret_cast<intptr_t>(entry->value); 223 intptr_t tokens = reinterpret_cast<intptr_t>(entry->value);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 bool shutdown_; 291 bool shutdown_;
283 int interrupt_fds_[2]; 292 int interrupt_fds_[2];
284 int epoll_fd_; 293 int epoll_fd_;
285 int timer_fd_; 294 int timer_fd_;
286 }; 295 };
287 296
288 } // namespace bin 297 } // namespace bin
289 } // namespace dart 298 } // namespace dart
290 299
291 #endif // BIN_EVENTHANDLER_LINUX_H_ 300 #endif // BIN_EVENTHANDLER_LINUX_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698