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

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

Issue 78393005: More cleanup in the socket C++ code (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years 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 | « no previous file | no next file » | 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
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698