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

Side by Side Diff: runtime/bin/eventhandler_macos.cc

Issue 9720045: Extend dart:io error handling to all socket functions (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed review comments Created 8 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « runtime/bin/eventhandler_linux.cc ('k') | runtime/bin/eventhandler_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 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 #include "bin/eventhandler.h" 5 #include "bin/eventhandler.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <pthread.h> 8 #include <pthread.h>
9 #include <stdio.h> 9 #include <stdio.h>
10 #include <string.h> 10 #include <string.h>
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 delete sd; 225 delete sd;
226 } else { 226 } else {
227 // Setup events to wait for. 227 // Setup events to wait for.
228 sd->SetPortAndMask(msg.dart_port, msg.data); 228 sd->SetPortAndMask(msg.dart_port, msg.data);
229 UpdateKqueue(kqueue_fd_, sd); 229 UpdateKqueue(kqueue_fd_, sd);
230 } 230 }
231 } 231 }
232 } 232 }
233 } 233 }
234 234
235
236 #ifdef DEBUG_KQUEUE 235 #ifdef DEBUG_KQUEUE
237 static void PrintEventMask(intptr_t fd, struct kevent* event) { 236 static void PrintEventMask(intptr_t fd, struct kevent* event) {
238 printf("%d ", fd); 237 printf("%d ", static_cast<int>(fd));
239 if (event->filter == EVFILT_READ) printf("EVFILT_READ "); 238 if (event->filter == EVFILT_READ) printf("EVFILT_READ ");
240 if (event->filter == EVFILT_WRITE) printf("EVFILT_WRITE "); 239 if (event->filter == EVFILT_WRITE) printf("EVFILT_WRITE ");
241 printf("flags: %x: ", event->flags); 240 printf("flags: %x: ", event->flags);
242 if ((event->flags & EV_EOF) != 0) printf("EV_EOF "); 241 if ((event->flags & EV_EOF) != 0) printf("EV_EOF ");
243 if ((event->flags & EV_ERROR) != 0) printf("EV_ERROR "); 242 if ((event->flags & EV_ERROR) != 0) printf("EV_ERROR ");
244 printf("(available %d) ", FDUtils::AvailableBytes(fd)); 243 printf("- fflags: %d ", event->fflags);
244 printf("(available %d) ", static_cast<int>(FDUtils::AvailableBytes(fd)));
245 printf("\n"); 245 printf("\n");
246 } 246 }
247 #endif 247 #endif
248 248
249 249
250 intptr_t EventHandlerImplementation::GetEvents(struct kevent* event, 250 intptr_t EventHandlerImplementation::GetEvents(struct kevent* event,
251 SocketData* sd) { 251 SocketData* sd) {
252 #ifdef DEBUG_KQUEUE 252 #ifdef DEBUG_KQUEUE
253 PrintEventMask(sd->fd(), event); 253 PrintEventMask(sd->fd(), event);
254 #endif 254 #endif
255 intptr_t event_mask = 0; 255 intptr_t event_mask = 0;
256 if (sd->IsListeningSocket()) { 256 if (sd->IsListeningSocket()) {
257 // On a listening socket the READ event means that there are 257 // On a listening socket the READ event means that there are
258 // connections ready to be accepted. 258 // connections ready to be accepted.
259 if (event->filter == EVFILT_READ) { 259 if (event->filter == EVFILT_READ) {
260 if ((event->flags & EV_EOF) != 0) event_mask |= (1 << kCloseEvent); 260 if ((event->flags & EV_EOF) != 0) {
261 if ((event->flags & EV_ERROR) != 0) event_mask |= (1 << kErrorEvent); 261 if (event->fflags != 0) {
262 event_mask |= (1 << kErrorEvent);
263 } else {
264 event_mask |= (1 << kCloseEvent);
265 }
266 }
262 if (event_mask == 0) event_mask |= (1 << kInEvent); 267 if (event_mask == 0) event_mask |= (1 << kInEvent);
263 } 268 }
264 } else { 269 } else {
265 // Prioritize data events over close and error events. 270 // Prioritize data events over close and error events.
266 if (event->filter == EVFILT_READ) { 271 if (event->filter == EVFILT_READ) {
267 if (FDUtils::AvailableBytes(sd->fd()) != 0) { 272 if (FDUtils::AvailableBytes(sd->fd()) != 0) {
268 event_mask = (1 << kInEvent); 273 event_mask = (1 << kInEvent);
269 } else if ((event->flags & EV_EOF) != 0) { 274 } else if ((event->flags & EV_EOF) != 0) {
270 event_mask = (1 << kCloseEvent); 275 if (event->fflags != 0) {
276 event_mask |= (1 << kErrorEvent);
277 } else {
278 event_mask |= (1 << kCloseEvent);
279 }
271 sd->MarkClosedRead(); 280 sd->MarkClosedRead();
272 } else if ((event->flags & EV_ERROR) != 0) {
273 event_mask = (1 << kErrorEvent);
274 } 281 }
275 } 282 }
276 283
277 if (event->filter == EVFILT_WRITE) { 284 if (event->filter == EVFILT_WRITE) {
278 if ((event->flags & EV_ERROR) != 0) { 285 if ((event->flags & EV_EOF) != 0) {
279 event_mask = (1 << kErrorEvent); 286 if (event->fflags != 0) {
280 sd->MarkClosedWrite(); 287 event_mask |= (1 << kErrorEvent);
281 } else if ((event->flags & EV_EOF) != 0) { 288 } else {
289 event_mask |= (1 << kCloseEvent);
290 }
282 // If the receiver closed for reading, close for writing, 291 // If the receiver closed for reading, close for writing,
283 // update the registration with kqueue, and do not report a 292 // update the registration with kqueue, and do not report a
284 // write event. 293 // write event.
285 sd->MarkClosedWrite(); 294 sd->MarkClosedWrite();
286 UpdateKqueue(kqueue_fd_, sd); 295 UpdateKqueue(kqueue_fd_, sd);
287 } else { 296 } else {
288 event_mask |= (1 << kOutEvent); 297 event_mask |= (1 << kOutEvent);
289 } 298 }
290 } 299 }
291 } 300 }
292 301
293 return event_mask; 302 return event_mask;
294 } 303 }
295 304
296 305
297 void EventHandlerImplementation::HandleEvents(struct kevent* events, 306 void EventHandlerImplementation::HandleEvents(struct kevent* events,
298 int size) { 307 int size) {
299 for (int i = 0; i < size; i++) { 308 for (int i = 0; i < size; i++) {
309 // If flag EV_ERROR is set it indicates an error in kevent processing.
310 if ((events[i].flags & EV_ERROR) != 0) {
311 FATAL1("kevent failed %s\n", strerror(events[i].data));
312 }
300 if (events[i].udata != NULL) { 313 if (events[i].udata != NULL) {
301 SocketData* sd = reinterpret_cast<SocketData*>(events[i].udata); 314 SocketData* sd = reinterpret_cast<SocketData*>(events[i].udata);
302 intptr_t event_mask = GetEvents(events + i, sd); 315 intptr_t event_mask = GetEvents(events + i, sd);
303 if (event_mask != 0) { 316 if (event_mask != 0) {
304 // Unregister events for the file descriptor. Events will be 317 // Unregister events for the file descriptor. Events will be
305 // registered again when the current event has been handled in 318 // registered again when the current event has been handled in
306 // Dart code. 319 // Dart code.
307 RemoveFromKqueue(kqueue_fd_, sd); 320 RemoveFromKqueue(kqueue_fd_, sd);
308 Dart_Port port = sd->port(); 321 Dart_Port port = sd->port();
309 ASSERT(port != 0); 322 ASSERT(port != 0);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 ts.tv_nsec = (millis - (ts.tv_sec * 1000)) * 1000000; 366 ts.tv_nsec = (millis - (ts.tv_sec * 1000)) * 1000000;
354 timeout = &ts; 367 timeout = &ts;
355 } 368 }
356 intptr_t result = TEMP_FAILURE_RETRY(kevent(handler->kqueue_fd_, 369 intptr_t result = TEMP_FAILURE_RETRY(kevent(handler->kqueue_fd_,
357 NULL, 370 NULL,
358 0, 371 0,
359 events, 372 events,
360 kMaxEvents, 373 kMaxEvents,
361 timeout)); 374 timeout));
362 if (result == -1) { 375 if (result == -1) {
363 perror("kevent failed"); 376 FATAL1("kevent failed %s\n", strerror(errno));
364 FATAL("kevent failed\n");
365 } else { 377 } else {
366 handler->HandleTimeout(); 378 handler->HandleTimeout();
367 handler->HandleEvents(events, result); 379 handler->HandleEvents(events, result);
368 } 380 }
369 } 381 }
370 } 382 }
371 383
372 384
373 void EventHandlerImplementation::StartEventHandler() { 385 void EventHandlerImplementation::StartEventHandler() {
374 int result = 386 int result =
(...skipping 15 matching lines...) Expand all
390 void* EventHandlerImplementation::GetHashmapKeyFromFd(intptr_t fd) { 402 void* EventHandlerImplementation::GetHashmapKeyFromFd(intptr_t fd) {
391 // The hashmap does not support keys with value 0. 403 // The hashmap does not support keys with value 0.
392 return reinterpret_cast<void*>(fd + 1); 404 return reinterpret_cast<void*>(fd + 1);
393 } 405 }
394 406
395 407
396 uint32_t EventHandlerImplementation::GetHashmapHashFromFd(intptr_t fd) { 408 uint32_t EventHandlerImplementation::GetHashmapHashFromFd(intptr_t fd) {
397 // The hashmap does not support keys with value 0. 409 // The hashmap does not support keys with value 0.
398 return dart::Utils::WordHash(fd + 1); 410 return dart::Utils::WordHash(fd + 1);
399 } 411 }
OLDNEW
« no previous file with comments | « runtime/bin/eventhandler_linux.cc ('k') | runtime/bin/eventhandler_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698