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

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: Added two spaces as requested 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
« no previous file with comments | « dart/runtime/bin/eventhandler_android.cc ('k') | dart/runtime/bin/eventhandler_linux.cc » ('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 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.
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. We therefore do nothing
211 // here.
212 //
213 // But whether to close it, depends on whether other isolates have it open
214 // as well or not.
202 } 215 }
203 tokens_map_.Remove(
204 GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port));
205 return !live_ports_.HasHead(); 216 return !live_ports_.HasHead();
206 } 217 }
207 218
208 bool TakeToken() { 219 bool TakeToken() {
209 ASSERT(live_ports_.HasHead()); 220 ASSERT(live_ports_.HasHead());
210 Dart_Port port = live_ports_.head(); 221 Dart_Port port = live_ports_.head();
211 HashMap::Entry* entry = tokens_map_.Lookup( 222 HashMap::Entry* entry = tokens_map_.Lookup(
212 GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port), false); 223 GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port), false);
213 ASSERT(entry != NULL); 224 ASSERT(entry != NULL);
214 intptr_t tokens = reinterpret_cast<intptr_t>(entry->value); 225 intptr_t tokens = reinterpret_cast<intptr_t>(entry->value);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 bool shutdown_; 293 bool shutdown_;
283 int interrupt_fds_[2]; 294 int interrupt_fds_[2];
284 int epoll_fd_; 295 int epoll_fd_;
285 int timer_fd_; 296 int timer_fd_;
286 }; 297 };
287 298
288 } // namespace bin 299 } // namespace bin
289 } // namespace dart 300 } // namespace dart
290 301
291 #endif // BIN_EVENTHANDLER_LINUX_H_ 302 #endif // BIN_EVENTHANDLER_LINUX_H_
OLDNEW
« no previous file with comments | « dart/runtime/bin/eventhandler_android.cc ('k') | dart/runtime/bin/eventhandler_linux.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698