Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 |
| 11 #include "platform/globals.h" | 11 #include "platform/globals.h" |
| 12 #include "platform/thread.h" | 12 #include "platform/thread.h" |
| 13 #include "platform/utils.h" | 13 #include "platform/utils.h" |
| 14 | 14 |
| 15 #include "include/dart_api.h" | 15 #include "include/dart_api.h" |
| 16 | 16 |
| 17 | 17 |
| 18 namespace dart { | 18 namespace dart { |
| 19 namespace bin { | 19 namespace bin { |
| 20 | 20 |
| 21 static const int kSocketIdNativeField = 0; | 21 static const int kSocketIdNativeField = 0; |
| 22 | 22 |
| 23 dart::Mutex* Socket::mutex_ = new dart::Mutex(); | 23 dart::Mutex* Socket::mutex_ = new dart::Mutex(); |
| 24 int Socket::service_ports_size_ = 0; | 24 int Socket::service_ports_size_ = 0; |
| 25 Dart_Port* Socket::service_ports_ = NULL; | 25 Dart_Port* Socket::service_ports_ = NULL; |
| 26 int Socket::service_ports_index_ = 0; | 26 int Socket::service_ports_index_ = 0; |
| 27 | 27 |
| 28 | 28 |
| 29 static Dart_Handle GetSockAddr(Dart_Handle obj, RawAddr* addr) { | 29 static void GetSockAddr(Dart_Handle obj, RawAddr* addr) { |
| 30 Dart_TypedData_Type data_type; | 30 Dart_TypedData_Type data_type; |
| 31 uint8_t* data = NULL; | 31 uint8_t* data = NULL; |
| 32 intptr_t len; | 32 intptr_t len; |
| 33 Dart_Handle result = Dart_TypedDataAcquireData( | 33 Dart_Handle result = Dart_TypedDataAcquireData( |
| 34 obj, &data_type, reinterpret_cast<void**>(&data), &len); | 34 obj, &data_type, reinterpret_cast<void**>(&data), &len); |
| 35 if (Dart_IsError(result)) return result; | 35 if (Dart_IsError(result)) { |
| 36 printf("XXXXXXXXXXXXXXXXXX\n"); | |
|
Anders Johnsen
2013/11/22 06:43:41
Debug print.
Søren Gjesse
2013/11/22 07:18:52
Removed.
| |
| 37 Dart_TypedDataReleaseData(obj); | |
|
Anders Johnsen
2013/11/22 06:43:41
Why do we need to release the data, when we failed
| |
| 38 Dart_PropagateError(result); | |
| 39 } | |
| 36 memmove(reinterpret_cast<void *>(addr), data, len); | 40 memmove(reinterpret_cast<void *>(addr), data, len); |
| 37 return Dart_Null(); | 41 Dart_TypedDataReleaseData(obj); |
| 38 } | 42 } |
| 39 | 43 |
| 40 | 44 |
| 41 void FUNCTION_NAME(InternetAddress_Fixed)(Dart_NativeArguments args) { | 45 void FUNCTION_NAME(InternetAddress_Fixed)(Dart_NativeArguments args) { |
| 42 Dart_Handle id_obj = Dart_GetNativeArgument(args, 0); | |
| 43 ASSERT(!Dart_IsError(id_obj)); | |
| 44 int64_t id = 0; | 46 int64_t id = 0; |
| 45 bool ok = DartUtils::GetInt64Value(id_obj, &id); | 47 bool ok = DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &id); |
| 46 ASSERT(ok); | 48 ASSERT(ok); |
| 47 USE(ok); | 49 USE(ok); |
| 48 RawAddr raw; | 50 RawAddr raw; |
| 49 memset(&raw, 0, sizeof(raw)); | 51 memset(&raw, 0, sizeof(raw)); |
| 50 switch (id) { | 52 switch (id) { |
| 51 case SocketAddress::ADDRESS_LOOPBACK_IP_V4: { | 53 case SocketAddress::ADDRESS_LOOPBACK_IP_V4: { |
| 52 raw.in.sin_family = AF_INET; | 54 raw.in.sin_family = AF_INET; |
| 53 raw.in.sin_addr.s_addr = htonl(INADDR_LOOPBACK); | 55 raw.in.sin_addr.s_addr = htonl(INADDR_LOOPBACK); |
| 54 break; | 56 break; |
| 55 } | 57 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 96 ok = Socket::ParseAddress(type, address, &raw); | 98 ok = Socket::ParseAddress(type, address, &raw); |
| 97 if (!ok) { | 99 if (!ok) { |
| 98 Dart_SetReturnValue(args, Dart_Null()); | 100 Dart_SetReturnValue(args, Dart_Null()); |
| 99 } else { | 101 } else { |
| 100 Dart_SetReturnValue(args, SocketAddress::ToTypedData(&raw)); | 102 Dart_SetReturnValue(args, SocketAddress::ToTypedData(&raw)); |
| 101 } | 103 } |
| 102 } | 104 } |
| 103 | 105 |
| 104 | 106 |
| 105 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) { | 107 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) { |
| 106 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); | |
| 107 Dart_Handle host_obj = Dart_GetNativeArgument(args, 1); | |
| 108 RawAddr addr; | 108 RawAddr addr; |
| 109 Dart_Handle result = GetSockAddr(host_obj, &addr); | 109 GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
| 110 int64_t port = 0; | 110 int64_t port = 0; |
| 111 if (!Dart_IsError(result) && | 111 if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &port)) { |
| 112 DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &port)) { | |
| 113 intptr_t socket = Socket::CreateConnect(addr, port); | 112 intptr_t socket = Socket::CreateConnect(addr, port); |
| 114 OSError error; | 113 OSError error; |
| 115 Dart_TypedDataReleaseData(host_obj); | |
| 116 if (socket >= 0) { | 114 if (socket >= 0) { |
| 117 Socket::SetSocketIdNativeField(socket_obj, socket); | 115 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket); |
| 118 Dart_SetReturnValue(args, Dart_True()); | 116 Dart_SetReturnValue(args, Dart_True()); |
| 119 } else { | 117 } else { |
| 120 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); | 118 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); |
| 121 } | 119 } |
| 122 } else { | 120 } else { |
| 123 OSError os_error(-1, "Invalid argument", OSError::kUnknown); | 121 OSError os_error(-1, "Invalid argument", OSError::kUnknown); |
| 124 Dart_Handle err = DartUtils::NewDartOSError(&os_error); | 122 Dart_Handle err = DartUtils::NewDartOSError(&os_error); |
| 125 if (Dart_IsError(err)) Dart_PropagateError(err); | 123 if (Dart_IsError(err)) Dart_PropagateError(err); |
| 126 Dart_SetReturnValue(args, err); | 124 Dart_SetReturnValue(args, err); |
| 127 } | 125 } |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 140 } | 138 } |
| 141 | 139 |
| 142 | 140 |
| 143 void FUNCTION_NAME(Socket_Read)(Dart_NativeArguments args) { | 141 void FUNCTION_NAME(Socket_Read)(Dart_NativeArguments args) { |
| 144 static bool short_socket_reads = Dart_IsVMFlagSet("short_socket_read"); | 142 static bool short_socket_reads = Dart_IsVMFlagSet("short_socket_read"); |
| 145 intptr_t socket = | 143 intptr_t socket = |
| 146 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 144 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 147 intptr_t available = Socket::Available(socket); | 145 intptr_t available = Socket::Available(socket); |
| 148 if (available > 0) { | 146 if (available > 0) { |
| 149 int64_t length = 0; | 147 int64_t length = 0; |
| 150 Dart_Handle length_obj = Dart_GetNativeArgument(args, 1); | 148 if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 1), &length)) { |
| 151 if (DartUtils::GetInt64Value(length_obj, &length)) { | |
| 152 if (length == -1 || available < length) { | 149 if (length == -1 || available < length) { |
| 153 length = available; | 150 length = available; |
| 154 } | 151 } |
| 155 if (short_socket_reads) { | 152 if (short_socket_reads) { |
| 156 length = (length + 1) / 2; | 153 length = (length + 1) / 2; |
| 157 } | 154 } |
| 158 uint8_t* buffer = NULL; | 155 uint8_t* buffer = NULL; |
| 159 Dart_Handle result = IOBuffer::Allocate(length, &buffer); | 156 Dart_Handle result = IOBuffer::Allocate(length, &buffer); |
| 160 if (Dart_IsError(result)) Dart_PropagateError(result); | 157 if (Dart_IsError(result)) Dart_PropagateError(result); |
| 161 ASSERT(buffer != NULL); | 158 ASSERT(buffer != NULL); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 285 intptr_t type = Socket::GetType(socket); | 282 intptr_t type = Socket::GetType(socket); |
| 286 if (type >= 0) { | 283 if (type >= 0) { |
| 287 Dart_SetReturnValue(args, Dart_NewInteger(type)); | 284 Dart_SetReturnValue(args, Dart_NewInteger(type)); |
| 288 } else { | 285 } else { |
| 289 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 286 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 290 } | 287 } |
| 291 } | 288 } |
| 292 | 289 |
| 293 | 290 |
| 294 void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) { | 291 void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) { |
| 295 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); | |
| 296 intptr_t num = | 292 intptr_t num = |
| 297 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1)); | 293 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1)); |
| 298 ASSERT(num == 0 || num == 1 || num == 2); | 294 ASSERT(num == 0 || num == 1 || num == 2); |
| 299 intptr_t socket = Socket::GetStdioHandle(num); | 295 intptr_t socket = Socket::GetStdioHandle(num); |
| 300 Socket::SetSocketIdNativeField(socket_obj, socket); | 296 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket); |
| 301 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0)); | 297 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0)); |
| 302 } | 298 } |
| 303 | 299 |
| 304 | 300 |
| 305 void FUNCTION_NAME(Socket_SetSocketId)(Dart_NativeArguments args) { | 301 void FUNCTION_NAME(Socket_SetSocketId)(Dart_NativeArguments args) { |
| 306 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); | |
| 307 intptr_t id = | 302 intptr_t id = |
| 308 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1)); | 303 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1)); |
| 309 Socket::SetSocketIdNativeField(socket_obj, id); | 304 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), id); |
| 310 } | 305 } |
| 311 | 306 |
| 312 | 307 |
| 313 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) { | 308 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) { |
| 314 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); | |
| 315 Dart_Handle host_obj = Dart_GetNativeArgument(args, 1); | |
| 316 RawAddr addr; | 309 RawAddr addr; |
| 317 Dart_Handle result = GetSockAddr(host_obj, &addr); | |
| 318 Dart_Handle port_obj = Dart_GetNativeArgument(args, 2); | |
| 319 Dart_Handle backlog_obj = Dart_GetNativeArgument(args, 3); | |
| 320 Dart_Handle v6_only_obj = Dart_GetNativeArgument(args, 4); | |
| 321 bool v6_only = DartUtils::GetBooleanValue(v6_only_obj); | |
| 322 int64_t port = 0; | 310 int64_t port = 0; |
| 323 int64_t backlog = 0; | 311 int64_t backlog = 0; |
| 324 if (!Dart_IsError(result) && | 312 GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
| 325 DartUtils::GetInt64Value(port_obj, &port) && | 313 if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &port) && |
| 326 DartUtils::GetInt64Value(backlog_obj, &backlog)) { | 314 DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 3), &backlog)) { |
| 315 bool v6_only = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4)); | |
| 327 intptr_t socket = ServerSocket::CreateBindListen( | 316 intptr_t socket = ServerSocket::CreateBindListen( |
| 328 addr, port, backlog, v6_only); | 317 addr, port, backlog, v6_only); |
| 329 OSError error; | 318 OSError error; |
| 330 Dart_TypedDataReleaseData(host_obj); | |
| 331 if (socket >= 0) { | 319 if (socket >= 0) { |
| 332 Socket::SetSocketIdNativeField(socket_obj, socket); | 320 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket); |
| 333 Dart_SetReturnValue(args, Dart_True()); | 321 Dart_SetReturnValue(args, Dart_True()); |
| 334 } else { | 322 } else { |
| 335 if (socket == -5) { | 323 if (socket == -5) { |
| 336 OSError os_error(-1, "Invalid host", OSError::kUnknown); | 324 OSError os_error(-1, "Invalid host", OSError::kUnknown); |
| 337 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); | 325 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); |
| 338 } else { | 326 } else { |
| 339 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); | 327 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); |
| 340 } | 328 } |
| 341 } | 329 } |
| 342 } else { | 330 } else { |
| 343 OSError os_error(-1, "Invalid argument", OSError::kUnknown); | 331 OSError os_error(-1, "Invalid argument", OSError::kUnknown); |
| 344 Dart_Handle err = DartUtils::NewDartOSError(&os_error); | 332 Dart_Handle err = DartUtils::NewDartOSError(&os_error); |
| 345 if (Dart_IsError(err)) Dart_PropagateError(err); | 333 if (Dart_IsError(err)) Dart_PropagateError(err); |
| 346 Dart_SetReturnValue(args, err); | 334 Dart_SetReturnValue(args, err); |
| 347 } | 335 } |
| 348 } | 336 } |
| 349 | 337 |
| 350 | 338 |
| 351 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) { | 339 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) { |
| 352 intptr_t socket = | 340 intptr_t socket = |
| 353 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 341 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 354 Dart_Handle result_socket_obj = Dart_GetNativeArgument(args, 1); | |
| 355 intptr_t new_socket = ServerSocket::Accept(socket); | 342 intptr_t new_socket = ServerSocket::Accept(socket); |
| 356 if (new_socket >= 0) { | 343 if (new_socket >= 0) { |
| 357 Socket::SetSocketIdNativeField(result_socket_obj, new_socket); | 344 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 1), new_socket); |
| 358 Dart_SetReturnValue(args, Dart_True()); | 345 Dart_SetReturnValue(args, Dart_True()); |
| 359 } else if (new_socket == ServerSocket::kTemporaryFailure) { | 346 } else if (new_socket == ServerSocket::kTemporaryFailure) { |
| 360 Dart_SetReturnValue(args, Dart_False()); | 347 Dart_SetReturnValue(args, Dart_False()); |
| 361 } else { | 348 } else { |
| 362 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 349 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 363 } | 350 } |
| 364 } | 351 } |
| 365 | 352 |
| 366 | 353 |
| 367 CObject* Socket::LookupRequest(const CObjectArray& request) { | 354 CObject* Socket::LookupRequest(const CObjectArray& request) { |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 520 intptr_t Socket::GetSocketIdNativeField(Dart_Handle socket_obj) { | 507 intptr_t Socket::GetSocketIdNativeField(Dart_Handle socket_obj) { |
| 521 intptr_t socket = 0; | 508 intptr_t socket = 0; |
| 522 Dart_Handle err = | 509 Dart_Handle err = |
| 523 Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &socket); | 510 Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &socket); |
| 524 if (Dart_IsError(err)) Dart_PropagateError(err); | 511 if (Dart_IsError(err)) Dart_PropagateError(err); |
| 525 return socket; | 512 return socket; |
| 526 } | 513 } |
| 527 | 514 |
| 528 } // namespace bin | 515 } // namespace bin |
| 529 } // namespace dart | 516 } // namespace dart |
| OLD | NEW |