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

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

Issue 24395013: Merge services into a shared IOService in dart:io, and use a native port. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Finish off native_service Created 7 years, 2 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/socket.h ('k') | runtime/bin/socket_patch.dart » ('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) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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/io_buffer.h" 5 #include "bin/io_buffer.h"
6 #include "bin/socket.h" 6 #include "bin/socket.h"
7 #include "bin/dartutils.h" 7 #include "bin/dartutils.h"
8 #include "bin/thread.h" 8 #include "bin/thread.h"
9 #include "bin/utils.h" 9 #include "bin/utils.h"
10 10
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 if (Dart_IsError(err)) Dart_PropagateError(err); 346 if (Dart_IsError(err)) Dart_PropagateError(err);
347 Dart_SetReturnValue(args, Dart_True()); 347 Dart_SetReturnValue(args, Dart_True());
348 } else if (new_socket == ServerSocket::kTemporaryFailure) { 348 } else if (new_socket == ServerSocket::kTemporaryFailure) {
349 Dart_SetReturnValue(args, Dart_False()); 349 Dart_SetReturnValue(args, Dart_False());
350 } else { 350 } else {
351 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 351 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
352 } 352 }
353 } 353 }
354 354
355 355
356 static CObject* LookupRequest(const CObjectArray& request) { 356 CObject* Socket::LookupRequest(const CObjectArray& request) {
357 if (request.Length() == 3 && 357 if (request.Length() == 2 &&
358 request[1]->IsString() && 358 request[0]->IsString() &&
359 request[2]->IsInt32()) { 359 request[1]->IsInt32()) {
360 CObjectString host(request[1]); 360 CObjectString host(request[0]);
361 CObjectInt32 type(request[2]); 361 CObjectInt32 type(request[1]);
362 CObject* result = NULL; 362 CObject* result = NULL;
363 OSError* os_error = NULL; 363 OSError* os_error = NULL;
364 AddressList<SocketAddress>* addresses = 364 AddressList<SocketAddress>* addresses =
365 Socket::LookupAddress(host.CString(), type.Value(), &os_error); 365 Socket::LookupAddress(host.CString(), type.Value(), &os_error);
366 if (addresses != NULL) { 366 if (addresses != NULL) {
367 CObjectArray* array = new CObjectArray( 367 CObjectArray* array = new CObjectArray(
368 CObject::NewArray(addresses->count() + 1)); 368 CObject::NewArray(addresses->count() + 1));
369 array->SetAt(0, new CObjectInt32(CObject::NewInt32(0))); 369 array->SetAt(0, new CObjectInt32(CObject::NewInt32(0)));
370 for (intptr_t i = 0; i < addresses->count(); i++) { 370 for (intptr_t i = 0; i < addresses->count(); i++) {
371 SocketAddress* addr = addresses->GetAt(i); 371 SocketAddress* addr = addresses->GetAt(i);
(...skipping 22 matching lines...) Expand all
394 } else { 394 } else {
395 result = CObject::NewOSError(os_error); 395 result = CObject::NewOSError(os_error);
396 delete os_error; 396 delete os_error;
397 } 397 }
398 return result; 398 return result;
399 } 399 }
400 return CObject::IllegalArgumentError(); 400 return CObject::IllegalArgumentError();
401 } 401 }
402 402
403 403
404 static CObject* ReverseLookupRequest(const CObjectArray& request) { 404 CObject* Socket::ReverseLookupRequest(const CObjectArray& request) {
405 if (request.Length() == 2 && 405 if (request.Length() == 1 &&
406 request[1]->IsTypedData()) { 406 request[0]->IsTypedData()) {
407 CObjectUint8Array addr_object(request[1]); 407 CObjectUint8Array addr_object(request[0]);
408 RawAddr addr; 408 RawAddr addr;
409 memmove(reinterpret_cast<void *>(&addr), 409 memmove(reinterpret_cast<void *>(&addr),
410 addr_object.Buffer(), 410 addr_object.Buffer(),
411 addr_object.Length()); 411 addr_object.Length());
412 OSError* os_error = NULL; 412 OSError* os_error = NULL;
413 const intptr_t kMaxHostLength = 1025; 413 const intptr_t kMaxHostLength = 1025;
414 char host[kMaxHostLength]; 414 char host[kMaxHostLength];
415 if (Socket::ReverseLookup(addr, host, kMaxHostLength, &os_error)) { 415 if (Socket::ReverseLookup(addr, host, kMaxHostLength, &os_error)) {
416 return new CObjectString(CObject::NewString(host)); 416 return new CObjectString(CObject::NewString(host));
417 } else { 417 } else {
418 CObject* result = CObject::NewOSError(os_error); 418 CObject* result = CObject::NewOSError(os_error);
419 delete os_error; 419 delete os_error;
420 return result; 420 return result;
421 } 421 }
422 } 422 }
423 return CObject::IllegalArgumentError(); 423 return CObject::IllegalArgumentError();
424 } 424 }
425 425
426 426
427 427
428 static CObject* ListInterfacesRequest(const CObjectArray& request) { 428 CObject* Socket::ListInterfacesRequest(const CObjectArray& request) {
429 if (request.Length() == 2 && 429 if (request.Length() == 1 &&
430 request[1]->IsInt32()) { 430 request[0]->IsInt32()) {
431 CObjectInt32 type(request[1]); 431 CObjectInt32 type(request[0]);
432 CObject* result = NULL; 432 CObject* result = NULL;
433 OSError* os_error = NULL; 433 OSError* os_error = NULL;
434 AddressList<InterfaceSocketAddress>* addresses = Socket::ListInterfaces( 434 AddressList<InterfaceSocketAddress>* addresses = Socket::ListInterfaces(
435 type.Value(), &os_error); 435 type.Value(), &os_error);
436 if (addresses != NULL) { 436 if (addresses != NULL) {
437 CObjectArray* array = new CObjectArray( 437 CObjectArray* array = new CObjectArray(
438 CObject::NewArray(addresses->count() + 1)); 438 CObject::NewArray(addresses->count() + 1));
439 array->SetAt(0, new CObjectInt32(CObject::NewInt32(0))); 439 array->SetAt(0, new CObjectInt32(CObject::NewInt32(0)));
440 for (intptr_t i = 0; i < addresses->count(); i++) { 440 for (intptr_t i = 0; i < addresses->count(); i++) {
441 InterfaceSocketAddress* interface = addresses->GetAt(i); 441 InterfaceSocketAddress* interface = addresses->GetAt(i);
(...skipping 27 matching lines...) Expand all
469 } else { 469 } else {
470 result = CObject::NewOSError(os_error); 470 result = CObject::NewOSError(os_error);
471 delete os_error; 471 delete os_error;
472 } 472 }
473 return result; 473 return result;
474 } 474 }
475 return CObject::IllegalArgumentError(); 475 return CObject::IllegalArgumentError();
476 } 476 }
477 477
478 478
479 void SocketService(Dart_Port dest_port_id,
480 Dart_Port reply_port_id,
481 Dart_CObject* message) {
482 CObject* response = CObject::IllegalArgumentError();
483 CObjectArray request(message);
484 if (message->type == Dart_CObject_kArray) {
485 if (request.Length() > 1 && request[0]->IsInt32()) {
486 CObjectInt32 request_type(request[0]);
487 switch (request_type.Value()) {
488 case Socket::kLookupRequest:
489 response = LookupRequest(request);
490 break;
491 case Socket::kListInterfacesRequest:
492 response = ListInterfacesRequest(request);
493 break;
494 case Socket::kReverseLookupRequest:
495 response = ReverseLookupRequest(request);
496 break;
497 default:
498 UNREACHABLE();
499 }
500 }
501 }
502
503 Dart_PostCObject(reply_port_id, response->AsApiCObject());
504 }
505
506
507 Dart_Port Socket::GetServicePort() {
508 MutexLocker lock(mutex_);
509 if (service_ports_size_ == 0) {
510 ASSERT(service_ports_ == NULL);
511 service_ports_size_ = 16;
512 service_ports_ = new Dart_Port[service_ports_size_];
513 service_ports_index_ = 0;
514 for (int i = 0; i < service_ports_size_; i++) {
515 service_ports_[i] = ILLEGAL_PORT;
516 }
517 }
518
519 Dart_Port result = service_ports_[service_ports_index_];
520 if (result == ILLEGAL_PORT) {
521 result = Dart_NewNativePort("SocketService",
522 SocketService,
523 true);
524 ASSERT(result != ILLEGAL_PORT);
525 service_ports_[service_ports_index_] = result;
526 }
527 service_ports_index_ = (service_ports_index_ + 1) % service_ports_size_;
528 return result;
529 }
530
531
532 void FUNCTION_NAME(Socket_NewServicePort)(Dart_NativeArguments args) {
533 Dart_SetReturnValue(args, Dart_Null());
534 Dart_Port service_port = Socket::GetServicePort();
535 if (service_port != ILLEGAL_PORT) {
536 // Return a send port for the service port.
537 Dart_Handle send_port = Dart_NewSendPort(service_port);
538 Dart_SetReturnValue(args, send_port);
539 }
540 }
541
542
543 void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) { 479 void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) {
544 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); 480 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
545 intptr_t socket = 0; 481 intptr_t socket = 0;
546 bool result = false; 482 bool result = false;
547 Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket); 483 Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket);
548 if (Dart_IsError(err)) Dart_PropagateError(err); 484 if (Dart_IsError(err)) Dart_PropagateError(err);
549 Dart_Handle option_obj = Dart_GetNativeArgument(args, 1); 485 Dart_Handle option_obj = Dart_GetNativeArgument(args, 1);
550 int64_t option; 486 int64_t option;
551 err = Dart_IntegerToInt64(option_obj, &option); 487 err = Dart_IntegerToInt64(option_obj, &option);
552 if (Dart_IsError(err)) Dart_PropagateError(err); 488 if (Dart_IsError(err)) Dart_PropagateError(err);
(...skipping 16 matching lines...) Expand all
569 return Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id); 505 return Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id);
570 } 506 }
571 507
572 508
573 Dart_Handle Socket::GetSocketIdNativeField(Dart_Handle socket, intptr_t* id) { 509 Dart_Handle Socket::GetSocketIdNativeField(Dart_Handle socket, intptr_t* id) {
574 return Dart_GetNativeInstanceField(socket, kSocketIdNativeField, id); 510 return Dart_GetNativeInstanceField(socket, kSocketIdNativeField, id);
575 } 511 }
576 512
577 } // namespace bin 513 } // namespace bin
578 } // namespace dart 514 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/bin/socket.h ('k') | runtime/bin/socket_patch.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698