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

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

Issue 2974233002: VM: Re-format to use at most one newline between functions (Closed)
Patch Set: Rebase and merge Created 3 years, 5 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
« no previous file with comments | « runtime/bin/socket.h ('k') | runtime/bin/socket_android.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) 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 #if !defined(DART_IO_DISABLED) 5 #if !defined(DART_IO_DISABLED)
6 6
7 #include "bin/socket.h" 7 #include "bin/socket.h"
8 8
9 #include "bin/dartutils.h" 9 #include "bin/dartutils.h"
10 #include "bin/eventhandler.h" 10 #include "bin/eventhandler.h"
(...skipping 17 matching lines...) Expand all
28 28
29 bool short_socket_read = false; 29 bool short_socket_read = false;
30 30
31 bool short_socket_write = false; 31 bool short_socket_write = false;
32 32
33 void ListeningSocketRegistry::Initialize() { 33 void ListeningSocketRegistry::Initialize() {
34 ASSERT(globalTcpListeningSocketRegistry == NULL); 34 ASSERT(globalTcpListeningSocketRegistry == NULL);
35 globalTcpListeningSocketRegistry = new ListeningSocketRegistry(); 35 globalTcpListeningSocketRegistry = new ListeningSocketRegistry();
36 } 36 }
37 37
38
39 ListeningSocketRegistry* ListeningSocketRegistry::Instance() { 38 ListeningSocketRegistry* ListeningSocketRegistry::Instance() {
40 return globalTcpListeningSocketRegistry; 39 return globalTcpListeningSocketRegistry;
41 } 40 }
42 41
43
44 void ListeningSocketRegistry::Cleanup() { 42 void ListeningSocketRegistry::Cleanup() {
45 delete globalTcpListeningSocketRegistry; 43 delete globalTcpListeningSocketRegistry;
46 globalTcpListeningSocketRegistry = NULL; 44 globalTcpListeningSocketRegistry = NULL;
47 } 45 }
48 46
49
50 ListeningSocketRegistry::OSSocket* ListeningSocketRegistry::LookupByPort( 47 ListeningSocketRegistry::OSSocket* ListeningSocketRegistry::LookupByPort(
51 intptr_t port) { 48 intptr_t port) {
52 HashMap::Entry* entry = sockets_by_port_.Lookup( 49 HashMap::Entry* entry = sockets_by_port_.Lookup(
53 GetHashmapKeyFromIntptr(port), GetHashmapHashFromIntptr(port), false); 50 GetHashmapKeyFromIntptr(port), GetHashmapHashFromIntptr(port), false);
54 if (entry == NULL) { 51 if (entry == NULL) {
55 return NULL; 52 return NULL;
56 } 53 }
57 return reinterpret_cast<OSSocket*>(entry->value); 54 return reinterpret_cast<OSSocket*>(entry->value);
58 } 55 }
59 56
60
61 void ListeningSocketRegistry::InsertByPort(intptr_t port, OSSocket* socket) { 57 void ListeningSocketRegistry::InsertByPort(intptr_t port, OSSocket* socket) {
62 HashMap::Entry* entry = sockets_by_port_.Lookup( 58 HashMap::Entry* entry = sockets_by_port_.Lookup(
63 GetHashmapKeyFromIntptr(port), GetHashmapHashFromIntptr(port), true); 59 GetHashmapKeyFromIntptr(port), GetHashmapHashFromIntptr(port), true);
64 ASSERT(entry != NULL); 60 ASSERT(entry != NULL);
65 entry->value = reinterpret_cast<void*>(socket); 61 entry->value = reinterpret_cast<void*>(socket);
66 } 62 }
67 63
68
69 void ListeningSocketRegistry::RemoveByPort(intptr_t port) { 64 void ListeningSocketRegistry::RemoveByPort(intptr_t port) {
70 sockets_by_port_.Remove(GetHashmapKeyFromIntptr(port), 65 sockets_by_port_.Remove(GetHashmapKeyFromIntptr(port),
71 GetHashmapHashFromIntptr(port)); 66 GetHashmapHashFromIntptr(port));
72 } 67 }
73 68
74
75 ListeningSocketRegistry::OSSocket* ListeningSocketRegistry::LookupByFd( 69 ListeningSocketRegistry::OSSocket* ListeningSocketRegistry::LookupByFd(
76 Socket* fd) { 70 Socket* fd) {
77 HashMap::Entry* entry = sockets_by_fd_.Lookup( 71 HashMap::Entry* entry = sockets_by_fd_.Lookup(
78 GetHashmapKeyFromIntptr(reinterpret_cast<intptr_t>(fd)), 72 GetHashmapKeyFromIntptr(reinterpret_cast<intptr_t>(fd)),
79 GetHashmapHashFromIntptr(reinterpret_cast<intptr_t>(fd)), false); 73 GetHashmapHashFromIntptr(reinterpret_cast<intptr_t>(fd)), false);
80 if (entry == NULL) { 74 if (entry == NULL) {
81 return NULL; 75 return NULL;
82 } 76 }
83 return reinterpret_cast<OSSocket*>(entry->value); 77 return reinterpret_cast<OSSocket*>(entry->value);
84 } 78 }
85 79
86
87 void ListeningSocketRegistry::InsertByFd(Socket* fd, OSSocket* socket) { 80 void ListeningSocketRegistry::InsertByFd(Socket* fd, OSSocket* socket) {
88 HashMap::Entry* entry = sockets_by_fd_.Lookup( 81 HashMap::Entry* entry = sockets_by_fd_.Lookup(
89 GetHashmapKeyFromIntptr(reinterpret_cast<intptr_t>(fd)), 82 GetHashmapKeyFromIntptr(reinterpret_cast<intptr_t>(fd)),
90 GetHashmapHashFromIntptr(reinterpret_cast<intptr_t>(fd)), true); 83 GetHashmapHashFromIntptr(reinterpret_cast<intptr_t>(fd)), true);
91 ASSERT(entry != NULL); 84 ASSERT(entry != NULL);
92 entry->value = reinterpret_cast<void*>(socket); 85 entry->value = reinterpret_cast<void*>(socket);
93 } 86 }
94 87
95
96 void ListeningSocketRegistry::RemoveByFd(Socket* fd) { 88 void ListeningSocketRegistry::RemoveByFd(Socket* fd) {
97 sockets_by_fd_.Remove( 89 sockets_by_fd_.Remove(
98 GetHashmapKeyFromIntptr(reinterpret_cast<intptr_t>(fd)), 90 GetHashmapKeyFromIntptr(reinterpret_cast<intptr_t>(fd)),
99 GetHashmapHashFromIntptr(reinterpret_cast<intptr_t>(fd))); 91 GetHashmapHashFromIntptr(reinterpret_cast<intptr_t>(fd)));
100 } 92 }
101 93
102
103 Dart_Handle ListeningSocketRegistry::CreateBindListen(Dart_Handle socket_object, 94 Dart_Handle ListeningSocketRegistry::CreateBindListen(Dart_Handle socket_object,
104 RawAddr addr, 95 RawAddr addr,
105 intptr_t backlog, 96 intptr_t backlog,
106 bool v6_only, 97 bool v6_only,
107 bool shared) { 98 bool shared) {
108 MutexLocker ml(mutex_); 99 MutexLocker ml(mutex_);
109 100
110 OSSocket* first_os_socket = NULL; 101 OSSocket* first_os_socket = NULL;
111 intptr_t port = SocketAddress::GetAddrPort(addr); 102 intptr_t port = SocketAddress::GetAddrPort(addr);
112 if (port > 0) { 103 if (port > 0) {
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 InsertByPort(allocated_port, os_socket); 188 InsertByPort(allocated_port, os_socket);
198 InsertByFd(socketfd, os_socket); 189 InsertByFd(socketfd, os_socket);
199 190
200 // We set as a side-effect the port on the dart socket_object. 191 // We set as a side-effect the port on the dart socket_object.
201 Socket::ReuseSocketIdNativeField(socket_object, socketfd, 192 Socket::ReuseSocketIdNativeField(socket_object, socketfd,
202 Socket::kFinalizerListening); 193 Socket::kFinalizerListening);
203 194
204 return Dart_True(); 195 return Dart_True();
205 } 196 }
206 197
207
208 bool ListeningSocketRegistry::CloseOneSafe(OSSocket* os_socket, 198 bool ListeningSocketRegistry::CloseOneSafe(OSSocket* os_socket,
209 bool update_hash_maps) { 199 bool update_hash_maps) {
210 ASSERT(!mutex_->TryLock()); 200 ASSERT(!mutex_->TryLock());
211 ASSERT(os_socket != NULL); 201 ASSERT(os_socket != NULL);
212 ASSERT(os_socket->ref_count > 0); 202 ASSERT(os_socket->ref_count > 0);
213 os_socket->ref_count--; 203 os_socket->ref_count--;
214 if (os_socket->ref_count > 0) { 204 if (os_socket->ref_count > 0) {
215 return false; 205 return false;
216 } 206 }
217 if (update_hash_maps) { 207 if (update_hash_maps) {
(...skipping 18 matching lines...) Expand all
236 // Remove element from the list which is not the first one. 226 // Remove element from the list which is not the first one.
237 prev->next = os_socket->next; 227 prev->next = os_socket->next;
238 } 228 }
239 } 229 }
240 230
241 ASSERT(os_socket->ref_count == 0); 231 ASSERT(os_socket->ref_count == 0);
242 delete os_socket; 232 delete os_socket;
243 return true; 233 return true;
244 } 234 }
245 235
246
247 void ListeningSocketRegistry::CloseAllSafe() { 236 void ListeningSocketRegistry::CloseAllSafe() {
248 MutexLocker ml(mutex_); 237 MutexLocker ml(mutex_);
249 238
250 for (HashMap::Entry* cursor = sockets_by_fd_.Start(); cursor != NULL; 239 for (HashMap::Entry* cursor = sockets_by_fd_.Start(); cursor != NULL;
251 cursor = sockets_by_fd_.Next(cursor)) { 240 cursor = sockets_by_fd_.Next(cursor)) {
252 CloseOneSafe(reinterpret_cast<OSSocket*>(cursor->value), false); 241 CloseOneSafe(reinterpret_cast<OSSocket*>(cursor->value), false);
253 } 242 }
254 } 243 }
255 244
256
257 bool ListeningSocketRegistry::CloseSafe(Socket* socketfd) { 245 bool ListeningSocketRegistry::CloseSafe(Socket* socketfd) {
258 ASSERT(!mutex_->TryLock()); 246 ASSERT(!mutex_->TryLock());
259 OSSocket* os_socket = LookupByFd(socketfd); 247 OSSocket* os_socket = LookupByFd(socketfd);
260 if (os_socket != NULL) { 248 if (os_socket != NULL) {
261 return CloseOneSafe(os_socket, true); 249 return CloseOneSafe(os_socket, true);
262 } else { 250 } else {
263 // A finalizer may direct the event handler to close a listening socket 251 // A finalizer may direct the event handler to close a listening socket
264 // that it has never seen before. In this case, we return true to direct 252 // that it has never seen before. In this case, we return true to direct
265 // the eventhandler to clean up the socket. 253 // the eventhandler to clean up the socket.
266 return true; 254 return true;
267 } 255 }
268 } 256 }
269 257
270
271 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) { 258 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) {
272 RawAddr addr; 259 RawAddr addr;
273 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); 260 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
274 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); 261 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2);
275 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); 262 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535);
276 SocketAddress::SetAddrPort(&addr, static_cast<intptr_t>(port)); 263 SocketAddress::SetAddrPort(&addr, static_cast<intptr_t>(port));
277 intptr_t socket = Socket::CreateConnect(addr); 264 intptr_t socket = Socket::CreateConnect(addr);
278 OSError error; 265 OSError error;
279 if (socket >= 0) { 266 if (socket >= 0) {
280 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, 267 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket,
281 Socket::kFinalizerNormal); 268 Socket::kFinalizerNormal);
282 Dart_SetReturnValue(args, Dart_True()); 269 Dart_SetReturnValue(args, Dart_True());
283 } else { 270 } else {
284 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); 271 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error));
285 } 272 }
286 } 273 }
287 274
288
289 void FUNCTION_NAME(Socket_CreateBindConnect)(Dart_NativeArguments args) { 275 void FUNCTION_NAME(Socket_CreateBindConnect)(Dart_NativeArguments args) {
290 RawAddr addr; 276 RawAddr addr;
291 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); 277 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
292 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); 278 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2);
293 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); 279 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535);
294 SocketAddress::SetAddrPort(&addr, static_cast<intptr_t>(port)); 280 SocketAddress::SetAddrPort(&addr, static_cast<intptr_t>(port));
295 RawAddr sourceAddr; 281 RawAddr sourceAddr;
296 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 3), &sourceAddr); 282 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 3), &sourceAddr);
297 intptr_t socket = Socket::CreateBindConnect(addr, sourceAddr); 283 intptr_t socket = Socket::CreateBindConnect(addr, sourceAddr);
298 OSError error; 284 OSError error;
299 if (socket >= 0) { 285 if (socket >= 0) {
300 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, 286 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket,
301 Socket::kFinalizerNormal); 287 Socket::kFinalizerNormal);
302 Dart_SetReturnValue(args, Dart_True()); 288 Dart_SetReturnValue(args, Dart_True());
303 } else { 289 } else {
304 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); 290 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error));
305 } 291 }
306 } 292 }
307 293
308
309 void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) { 294 void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) {
310 RawAddr addr; 295 RawAddr addr;
311 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); 296 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
312 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); 297 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2);
313 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); 298 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535);
314 SocketAddress::SetAddrPort(&addr, port); 299 SocketAddress::SetAddrPort(&addr, port);
315 bool reuse_addr = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3)); 300 bool reuse_addr = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3));
316 intptr_t socket = Socket::CreateBindDatagram(addr, reuse_addr); 301 intptr_t socket = Socket::CreateBindDatagram(addr, reuse_addr);
317 if (socket >= 0) { 302 if (socket >= 0) {
318 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, 303 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket,
319 Socket::kFinalizerNormal); 304 Socket::kFinalizerNormal);
320 Dart_SetReturnValue(args, Dart_True()); 305 Dart_SetReturnValue(args, Dart_True());
321 } else { 306 } else {
322 OSError error; 307 OSError error;
323 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); 308 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error));
324 } 309 }
325 } 310 }
326 311
327
328 void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) { 312 void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) {
329 Socket* socket = 313 Socket* socket =
330 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 314 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
331 intptr_t available = SocketBase::Available(socket->fd()); 315 intptr_t available = SocketBase::Available(socket->fd());
332 if (available >= 0) { 316 if (available >= 0) {
333 Dart_SetReturnValue(args, Dart_NewInteger(available)); 317 Dart_SetReturnValue(args, Dart_NewInteger(available));
334 } else { 318 } else {
335 // Available failed. Mark socket as having data, to trigger a future read 319 // Available failed. Mark socket as having data, to trigger a future read
336 // event where the actual error can be reported. 320 // event where the actual error can be reported.
337 Dart_SetReturnValue(args, Dart_NewInteger(1)); 321 Dart_SetReturnValue(args, Dart_NewInteger(1));
338 } 322 }
339 } 323 }
340 324
341
342 void FUNCTION_NAME(Socket_Read)(Dart_NativeArguments args) { 325 void FUNCTION_NAME(Socket_Read)(Dart_NativeArguments args) {
343 Socket* socket = 326 Socket* socket =
344 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 327 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
345 int64_t length = 0; 328 int64_t length = 0;
346 if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 1), &length)) { 329 if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 1), &length)) {
347 if (short_socket_read) { 330 if (short_socket_read) {
348 length = (length + 1) / 2; 331 length = (length + 1) / 2;
349 } 332 }
350 uint8_t* buffer = NULL; 333 uint8_t* buffer = NULL;
351 Dart_Handle result = IOBuffer::Allocate(length, &buffer); 334 Dart_Handle result = IOBuffer::Allocate(length, &buffer);
(...skipping 21 matching lines...) Expand all
373 } else { 356 } else {
374 ASSERT(bytes_read == -1); 357 ASSERT(bytes_read == -1);
375 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 358 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
376 } 359 }
377 } else { 360 } else {
378 OSError os_error(-1, "Invalid argument", OSError::kUnknown); 361 OSError os_error(-1, "Invalid argument", OSError::kUnknown);
379 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); 362 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
380 } 363 }
381 } 364 }
382 365
383
384 void FUNCTION_NAME(Socket_RecvFrom)(Dart_NativeArguments args) { 366 void FUNCTION_NAME(Socket_RecvFrom)(Dart_NativeArguments args) {
385 Socket* socket = 367 Socket* socket =
386 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 368 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
387 369
388 // TODO(sgjesse): Use a MTU value here. Only the loopback adapter can 370 // TODO(sgjesse): Use a MTU value here. Only the loopback adapter can
389 // handle 64k datagrams. 371 // handle 64k datagrams.
390 IsolateData* isolate_data = 372 IsolateData* isolate_data =
391 reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData()); 373 reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData());
392 if (isolate_data->udp_receive_buffer == NULL) { 374 if (isolate_data->udp_receive_buffer == NULL) {
393 isolate_data->udp_receive_buffer = 375 isolate_data->udp_receive_buffer =
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 // TODO(sgjesse): Cache the _makeDatagram function somewhere. 426 // TODO(sgjesse): Cache the _makeDatagram function somewhere.
445 Dart_Handle io_lib = Dart_LookupLibrary(DartUtils::NewString("dart:io")); 427 Dart_Handle io_lib = Dart_LookupLibrary(DartUtils::NewString("dart:io"));
446 if (Dart_IsError(io_lib)) { 428 if (Dart_IsError(io_lib)) {
447 Dart_PropagateError(io_lib); 429 Dart_PropagateError(io_lib);
448 } 430 }
449 Dart_Handle result = Dart_Invoke( 431 Dart_Handle result = Dart_Invoke(
450 io_lib, DartUtils::NewString("_makeDatagram"), kNumArgs, dart_args); 432 io_lib, DartUtils::NewString("_makeDatagram"), kNumArgs, dart_args);
451 Dart_SetReturnValue(args, result); 433 Dart_SetReturnValue(args, result);
452 } 434 }
453 435
454
455 void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) { 436 void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) {
456 Socket* socket = 437 Socket* socket =
457 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 438 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
458 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); 439 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1);
459 ASSERT(Dart_IsList(buffer_obj)); 440 ASSERT(Dart_IsList(buffer_obj));
460 intptr_t offset = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); 441 intptr_t offset = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2));
461 intptr_t length = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); 442 intptr_t length = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3));
462 bool short_write = false; 443 bool short_write = false;
463 if (short_socket_write) { 444 if (short_socket_write) {
464 if (length > 1) { 445 if (length > 1) {
(...skipping 23 matching lines...) Expand all
488 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written)); 469 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written));
489 } 470 }
490 } else { 471 } else {
491 // Extract OSError before we release data, as it may override the error. 472 // Extract OSError before we release data, as it may override the error.
492 OSError os_error; 473 OSError os_error;
493 Dart_TypedDataReleaseData(buffer_obj); 474 Dart_TypedDataReleaseData(buffer_obj);
494 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); 475 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
495 } 476 }
496 } 477 }
497 478
498
499 void FUNCTION_NAME(Socket_SendTo)(Dart_NativeArguments args) { 479 void FUNCTION_NAME(Socket_SendTo)(Dart_NativeArguments args) {
500 Socket* socket = 480 Socket* socket =
501 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 481 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
502 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); 482 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1);
503 intptr_t offset = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); 483 intptr_t offset = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2));
504 intptr_t length = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); 484 intptr_t length = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3));
505 Dart_Handle address_obj = Dart_GetNativeArgument(args, 4); 485 Dart_Handle address_obj = Dart_GetNativeArgument(args, 4);
506 ASSERT(Dart_IsList(address_obj)); 486 ASSERT(Dart_IsList(address_obj));
507 RawAddr addr; 487 RawAddr addr;
508 SocketAddress::GetSockAddr(address_obj, &addr); 488 SocketAddress::GetSockAddr(address_obj, &addr);
(...skipping 16 matching lines...) Expand all
525 Dart_TypedDataReleaseData(buffer_obj); 505 Dart_TypedDataReleaseData(buffer_obj);
526 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written)); 506 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written));
527 } else { 507 } else {
528 // Extract OSError before we release data, as it may override the error. 508 // Extract OSError before we release data, as it may override the error.
529 OSError os_error; 509 OSError os_error;
530 Dart_TypedDataReleaseData(buffer_obj); 510 Dart_TypedDataReleaseData(buffer_obj);
531 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); 511 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
532 } 512 }
533 } 513 }
534 514
535
536 void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) { 515 void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) {
537 Socket* socket = 516 Socket* socket =
538 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 517 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
539 OSError os_error; 518 OSError os_error;
540 intptr_t port = SocketBase::GetPort(socket->fd()); 519 intptr_t port = SocketBase::GetPort(socket->fd());
541 if (port > 0) { 520 if (port > 0) {
542 Dart_SetReturnValue(args, Dart_NewInteger(port)); 521 Dart_SetReturnValue(args, Dart_NewInteger(port));
543 } else { 522 } else {
544 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 523 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
545 } 524 }
546 } 525 }
547 526
548
549 void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) { 527 void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) {
550 Socket* socket = 528 Socket* socket =
551 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 529 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
552 OSError os_error; 530 OSError os_error;
553 intptr_t port = 0; 531 intptr_t port = 0;
554 SocketAddress* addr = SocketBase::GetRemotePeer(socket->fd(), &port); 532 SocketAddress* addr = SocketBase::GetRemotePeer(socket->fd(), &port);
555 if (addr != NULL) { 533 if (addr != NULL) {
556 Dart_Handle list = Dart_NewList(2); 534 Dart_Handle list = Dart_NewList(2);
557 535
558 Dart_Handle entry = Dart_NewList(3); 536 Dart_Handle entry = Dart_NewList(3);
559 Dart_ListSetAt(entry, 0, Dart_NewInteger(addr->GetType())); 537 Dart_ListSetAt(entry, 0, Dart_NewInteger(addr->GetType()));
560 Dart_ListSetAt(entry, 1, Dart_NewStringFromCString(addr->as_string())); 538 Dart_ListSetAt(entry, 1, Dart_NewStringFromCString(addr->as_string()));
561 539
562 RawAddr raw = addr->addr(); 540 RawAddr raw = addr->addr();
563 Dart_ListSetAt(entry, 2, SocketAddress::ToTypedData(raw)); 541 Dart_ListSetAt(entry, 2, SocketAddress::ToTypedData(raw));
564 542
565 Dart_ListSetAt(list, 0, entry); 543 Dart_ListSetAt(list, 0, entry);
566 Dart_ListSetAt(list, 1, Dart_NewInteger(port)); 544 Dart_ListSetAt(list, 1, Dart_NewInteger(port));
567 Dart_SetReturnValue(args, list); 545 Dart_SetReturnValue(args, list);
568 delete addr; 546 delete addr;
569 } else { 547 } else {
570 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 548 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
571 } 549 }
572 } 550 }
573 551
574
575 void FUNCTION_NAME(Socket_GetError)(Dart_NativeArguments args) { 552 void FUNCTION_NAME(Socket_GetError)(Dart_NativeArguments args) {
576 Socket* socket = 553 Socket* socket =
577 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 554 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
578 OSError os_error; 555 OSError os_error;
579 SocketBase::GetError(socket->fd(), &os_error); 556 SocketBase::GetError(socket->fd(), &os_error);
580 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); 557 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
581 } 558 }
582 559
583
584 void FUNCTION_NAME(Socket_GetType)(Dart_NativeArguments args) { 560 void FUNCTION_NAME(Socket_GetType)(Dart_NativeArguments args) {
585 Socket* socket = 561 Socket* socket =
586 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 562 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
587 OSError os_error; 563 OSError os_error;
588 intptr_t type = SocketBase::GetType(socket->fd()); 564 intptr_t type = SocketBase::GetType(socket->fd());
589 if (type >= 0) { 565 if (type >= 0) {
590 Dart_SetReturnValue(args, Dart_NewInteger(type)); 566 Dart_SetReturnValue(args, Dart_NewInteger(type));
591 } else { 567 } else {
592 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 568 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
593 } 569 }
594 } 570 }
595 571
596
597 void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) { 572 void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) {
598 int64_t num = 573 int64_t num =
599 DartUtils::GetInt64ValueCheckRange(Dart_GetNativeArgument(args, 1), 0, 2); 574 DartUtils::GetInt64ValueCheckRange(Dart_GetNativeArgument(args, 1), 0, 2);
600 intptr_t socket = SocketBase::GetStdioHandle(num); 575 intptr_t socket = SocketBase::GetStdioHandle(num);
601 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, 576 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket,
602 Socket::kFinalizerStdio); 577 Socket::kFinalizerStdio);
603 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0)); 578 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0));
604 } 579 }
605 580
606
607 void FUNCTION_NAME(Socket_GetSocketId)(Dart_NativeArguments args) { 581 void FUNCTION_NAME(Socket_GetSocketId)(Dart_NativeArguments args) {
608 Socket* socket = 582 Socket* socket =
609 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 583 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
610 intptr_t id = reinterpret_cast<intptr_t>(socket); 584 intptr_t id = reinterpret_cast<intptr_t>(socket);
611 Dart_SetReturnValue(args, Dart_NewInteger(id)); 585 Dart_SetReturnValue(args, Dart_NewInteger(id));
612 } 586 }
613 587
614
615 void FUNCTION_NAME(Socket_SetSocketId)(Dart_NativeArguments args) { 588 void FUNCTION_NAME(Socket_SetSocketId)(Dart_NativeArguments args) {
616 intptr_t id = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1)); 589 intptr_t id = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1));
617 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), id, 590 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), id,
618 Socket::kFinalizerNormal); 591 Socket::kFinalizerNormal);
619 } 592 }
620 593
621
622 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) { 594 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) {
623 RawAddr addr; 595 RawAddr addr;
624 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); 596 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
625 int64_t port = DartUtils::GetInt64ValueCheckRange( 597 int64_t port = DartUtils::GetInt64ValueCheckRange(
626 Dart_GetNativeArgument(args, 2), 0, 65535); 598 Dart_GetNativeArgument(args, 2), 0, 65535);
627 SocketAddress::SetAddrPort(&addr, port); 599 SocketAddress::SetAddrPort(&addr, port);
628 int64_t backlog = DartUtils::GetInt64ValueCheckRange( 600 int64_t backlog = DartUtils::GetInt64ValueCheckRange(
629 Dart_GetNativeArgument(args, 3), 0, 65535); 601 Dart_GetNativeArgument(args, 3), 0, 65535);
630 bool v6_only = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4)); 602 bool v6_only = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4));
631 bool shared = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 5)); 603 bool shared = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 5));
632 604
633 Dart_Handle socket_object = Dart_GetNativeArgument(args, 0); 605 Dart_Handle socket_object = Dart_GetNativeArgument(args, 0);
634 Dart_Handle result = ListeningSocketRegistry::Instance()->CreateBindListen( 606 Dart_Handle result = ListeningSocketRegistry::Instance()->CreateBindListen(
635 socket_object, addr, backlog, v6_only, shared); 607 socket_object, addr, backlog, v6_only, shared);
636 Dart_SetReturnValue(args, result); 608 Dart_SetReturnValue(args, result);
637 } 609 }
638 610
639
640 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) { 611 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) {
641 Socket* socket = 612 Socket* socket =
642 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 613 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
643 intptr_t new_socket = ServerSocket::Accept(socket->fd()); 614 intptr_t new_socket = ServerSocket::Accept(socket->fd());
644 if (new_socket >= 0) { 615 if (new_socket >= 0) {
645 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 1), new_socket, 616 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 1), new_socket,
646 Socket::kFinalizerNormal); 617 Socket::kFinalizerNormal);
647 Dart_SetReturnValue(args, Dart_True()); 618 Dart_SetReturnValue(args, Dart_True());
648 } else if (new_socket == ServerSocket::kTemporaryFailure) { 619 } else if (new_socket == ServerSocket::kTemporaryFailure) {
649 Dart_SetReturnValue(args, Dart_False()); 620 Dart_SetReturnValue(args, Dart_False());
650 } else { 621 } else {
651 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 622 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
652 } 623 }
653 } 624 }
654 625
655
656 CObject* Socket::LookupRequest(const CObjectArray& request) { 626 CObject* Socket::LookupRequest(const CObjectArray& request) {
657 if ((request.Length() == 2) && request[0]->IsString() && 627 if ((request.Length() == 2) && request[0]->IsString() &&
658 request[1]->IsInt32()) { 628 request[1]->IsInt32()) {
659 CObjectString host(request[0]); 629 CObjectString host(request[0]);
660 CObjectInt32 type(request[1]); 630 CObjectInt32 type(request[1]);
661 CObject* result = NULL; 631 CObject* result = NULL;
662 OSError* os_error = NULL; 632 OSError* os_error = NULL;
663 AddressList<SocketAddress>* addresses = 633 AddressList<SocketAddress>* addresses =
664 SocketBase::LookupAddress(host.CString(), type.Value(), &os_error); 634 SocketBase::LookupAddress(host.CString(), type.Value(), &os_error);
665 if (addresses != NULL) { 635 if (addresses != NULL) {
(...skipping 22 matching lines...) Expand all
688 delete addresses; 658 delete addresses;
689 } else { 659 } else {
690 result = CObject::NewOSError(os_error); 660 result = CObject::NewOSError(os_error);
691 delete os_error; 661 delete os_error;
692 } 662 }
693 return result; 663 return result;
694 } 664 }
695 return CObject::IllegalArgumentError(); 665 return CObject::IllegalArgumentError();
696 } 666 }
697 667
698
699 CObject* Socket::ReverseLookupRequest(const CObjectArray& request) { 668 CObject* Socket::ReverseLookupRequest(const CObjectArray& request) {
700 if ((request.Length() == 1) && request[0]->IsTypedData()) { 669 if ((request.Length() == 1) && request[0]->IsTypedData()) {
701 CObjectUint8Array addr_object(request[0]); 670 CObjectUint8Array addr_object(request[0]);
702 RawAddr addr; 671 RawAddr addr;
703 int len = addr_object.Length(); 672 int len = addr_object.Length();
704 memset(reinterpret_cast<void*>(&addr), 0, sizeof(RawAddr)); 673 memset(reinterpret_cast<void*>(&addr), 0, sizeof(RawAddr));
705 if (len == sizeof(in_addr)) { 674 if (len == sizeof(in_addr)) {
706 addr.in.sin_family = AF_INET; 675 addr.in.sin_family = AF_INET;
707 memmove(reinterpret_cast<void*>(&addr.in.sin_addr), addr_object.Buffer(), 676 memmove(reinterpret_cast<void*>(&addr.in.sin_addr), addr_object.Buffer(),
708 len); 677 len);
(...skipping 11 matching lines...) Expand all
720 return new CObjectString(CObject::NewString(host)); 689 return new CObjectString(CObject::NewString(host));
721 } else { 690 } else {
722 CObject* result = CObject::NewOSError(os_error); 691 CObject* result = CObject::NewOSError(os_error);
723 delete os_error; 692 delete os_error;
724 return result; 693 return result;
725 } 694 }
726 } 695 }
727 return CObject::IllegalArgumentError(); 696 return CObject::IllegalArgumentError();
728 } 697 }
729 698
730
731 CObject* Socket::ListInterfacesRequest(const CObjectArray& request) { 699 CObject* Socket::ListInterfacesRequest(const CObjectArray& request) {
732 if ((request.Length() == 1) && request[0]->IsInt32()) { 700 if ((request.Length() == 1) && request[0]->IsInt32()) {
733 CObjectInt32 type(request[0]); 701 CObjectInt32 type(request[0]);
734 CObject* result = NULL; 702 CObject* result = NULL;
735 OSError* os_error = NULL; 703 OSError* os_error = NULL;
736 AddressList<InterfaceSocketAddress>* addresses = 704 AddressList<InterfaceSocketAddress>* addresses =
737 SocketBase::ListInterfaces(type.Value(), &os_error); 705 SocketBase::ListInterfaces(type.Value(), &os_error);
738 if (addresses != NULL) { 706 if (addresses != NULL) {
739 CObjectArray* array = 707 CObjectArray* array =
740 new CObjectArray(CObject::NewArray(addresses->count() + 1)); 708 new CObjectArray(CObject::NewArray(addresses->count() + 1));
(...skipping 29 matching lines...) Expand all
770 delete addresses; 738 delete addresses;
771 } else { 739 } else {
772 result = CObject::NewOSError(os_error); 740 result = CObject::NewOSError(os_error);
773 delete os_error; 741 delete os_error;
774 } 742 }
775 return result; 743 return result;
776 } 744 }
777 return CObject::IllegalArgumentError(); 745 return CObject::IllegalArgumentError();
778 } 746 }
779 747
780
781 void FUNCTION_NAME(Socket_GetOption)(Dart_NativeArguments args) { 748 void FUNCTION_NAME(Socket_GetOption)(Dart_NativeArguments args) {
782 Socket* socket = 749 Socket* socket =
783 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 750 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
784 int64_t option = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); 751 int64_t option = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1));
785 intptr_t protocol = static_cast<intptr_t>( 752 intptr_t protocol = static_cast<intptr_t>(
786 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2))); 753 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2)));
787 bool ok = false; 754 bool ok = false;
788 switch (option) { 755 switch (option) {
789 case 0: { // TCP_NODELAY. 756 case 0: { // TCP_NODELAY.
790 bool enabled; 757 bool enabled;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 default: 792 default:
826 UNREACHABLE(); 793 UNREACHABLE();
827 break; 794 break;
828 } 795 }
829 // In case of failure the return value is not set above. 796 // In case of failure the return value is not set above.
830 if (!ok) { 797 if (!ok) {
831 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 798 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
832 } 799 }
833 } 800 }
834 801
835
836 void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) { 802 void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) {
837 bool result = false; 803 bool result = false;
838 Socket* socket = 804 Socket* socket =
839 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 805 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
840 int64_t option = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); 806 int64_t option = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1));
841 int64_t protocol = DartUtils::GetInt64ValueCheckRange( 807 int64_t protocol = DartUtils::GetInt64ValueCheckRange(
842 Dart_GetNativeArgument(args, 2), SocketAddress::TYPE_IPV4, 808 Dart_GetNativeArgument(args, 2), SocketAddress::TYPE_IPV4,
843 SocketAddress::TYPE_IPV6); 809 SocketAddress::TYPE_IPV6);
844 switch (option) { 810 switch (option) {
845 case 0: // TCP_NODELAY. 811 case 0: // TCP_NODELAY.
(...skipping 24 matching lines...) Expand all
870 Dart_PropagateError(Dart_NewApiError("Value outside expected range")); 836 Dart_PropagateError(Dart_NewApiError("Value outside expected range"));
871 break; 837 break;
872 } 838 }
873 if (result) { 839 if (result) {
874 Dart_SetReturnValue(args, Dart_Null()); 840 Dart_SetReturnValue(args, Dart_Null());
875 } else { 841 } else {
876 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 842 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
877 } 843 }
878 } 844 }
879 845
880
881 void FUNCTION_NAME(Socket_JoinMulticast)(Dart_NativeArguments args) { 846 void FUNCTION_NAME(Socket_JoinMulticast)(Dart_NativeArguments args) {
882 Socket* socket = 847 Socket* socket =
883 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 848 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
884 RawAddr addr; 849 RawAddr addr;
885 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); 850 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
886 RawAddr interface; 851 RawAddr interface;
887 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) { 852 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) {
888 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 2), &interface); 853 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 2), &interface);
889 } 854 }
890 int interfaceIndex = 855 int interfaceIndex =
891 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); 856 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3));
892 if (SocketBase::JoinMulticast(socket->fd(), addr, interface, 857 if (SocketBase::JoinMulticast(socket->fd(), addr, interface,
893 interfaceIndex)) { 858 interfaceIndex)) {
894 Dart_SetReturnValue(args, Dart_Null()); 859 Dart_SetReturnValue(args, Dart_Null());
895 } else { 860 } else {
896 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 861 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
897 } 862 }
898 } 863 }
899 864
900
901 void FUNCTION_NAME(Socket_LeaveMulticast)(Dart_NativeArguments args) { 865 void FUNCTION_NAME(Socket_LeaveMulticast)(Dart_NativeArguments args) {
902 Socket* socket = 866 Socket* socket =
903 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 867 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
904 RawAddr addr; 868 RawAddr addr;
905 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); 869 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
906 RawAddr interface; 870 RawAddr interface;
907 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) { 871 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) {
908 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 2), &interface); 872 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 2), &interface);
909 } 873 }
910 int interfaceIndex = 874 int interfaceIndex =
911 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); 875 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3));
912 if (SocketBase::LeaveMulticast(socket->fd(), addr, interface, 876 if (SocketBase::LeaveMulticast(socket->fd(), addr, interface,
913 interfaceIndex)) { 877 interfaceIndex)) {
914 Dart_SetReturnValue(args, Dart_Null()); 878 Dart_SetReturnValue(args, Dart_Null());
915 } else { 879 } else {
916 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 880 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
917 } 881 }
918 } 882 }
919 883
920
921 static void NormalSocketFinalizer(void* isolate_data, 884 static void NormalSocketFinalizer(void* isolate_data,
922 Dart_WeakPersistentHandle handle, 885 Dart_WeakPersistentHandle handle,
923 void* data) { 886 void* data) {
924 Socket* socket = reinterpret_cast<Socket*>(data); 887 Socket* socket = reinterpret_cast<Socket*>(data);
925 if (socket->fd() >= 0) { 888 if (socket->fd() >= 0) {
926 const int64_t flags = 1 << kCloseCommand; 889 const int64_t flags = 1 << kCloseCommand;
927 socket->Retain(); 890 socket->Retain();
928 EventHandler::SendFromNative(reinterpret_cast<intptr_t>(socket), 891 EventHandler::SendFromNative(reinterpret_cast<intptr_t>(socket),
929 socket->port(), flags); 892 socket->port(), flags);
930 } 893 }
931 socket->Release(); 894 socket->Release();
932 } 895 }
933 896
934
935 static void ListeningSocketFinalizer(void* isolate_data, 897 static void ListeningSocketFinalizer(void* isolate_data,
936 Dart_WeakPersistentHandle handle, 898 Dart_WeakPersistentHandle handle,
937 void* data) { 899 void* data) {
938 Socket* socket = reinterpret_cast<Socket*>(data); 900 Socket* socket = reinterpret_cast<Socket*>(data);
939 if (socket->fd() >= 0) { 901 if (socket->fd() >= 0) {
940 const int64_t flags = (1 << kListeningSocket) | (1 << kCloseCommand); 902 const int64_t flags = (1 << kListeningSocket) | (1 << kCloseCommand);
941 socket->Retain(); 903 socket->Retain();
942 EventHandler::SendFromNative(reinterpret_cast<intptr_t>(socket), 904 EventHandler::SendFromNative(reinterpret_cast<intptr_t>(socket),
943 socket->port(), flags); 905 socket->port(), flags);
944 } 906 }
945 socket->Release(); 907 socket->Release();
946 } 908 }
947 909
948
949 static void StdioSocketFinalizer(void* isolate_data, 910 static void StdioSocketFinalizer(void* isolate_data,
950 Dart_WeakPersistentHandle handle, 911 Dart_WeakPersistentHandle handle,
951 void* data) { 912 void* data) {
952 Socket* socket = reinterpret_cast<Socket*>(data); 913 Socket* socket = reinterpret_cast<Socket*>(data);
953 if (socket->fd() >= 0) { 914 if (socket->fd() >= 0) {
954 socket->SetClosedFd(); 915 socket->SetClosedFd();
955 } 916 }
956 socket->Release(); 917 socket->Release();
957 } 918 }
958 919
959
960 void Socket::ReuseSocketIdNativeField(Dart_Handle handle, 920 void Socket::ReuseSocketIdNativeField(Dart_Handle handle,
961 Socket* socket, 921 Socket* socket,
962 SocketFinalizer finalizer) { 922 SocketFinalizer finalizer) {
963 Dart_Handle err = Dart_SetNativeInstanceField( 923 Dart_Handle err = Dart_SetNativeInstanceField(
964 handle, kSocketIdNativeField, reinterpret_cast<intptr_t>(socket)); 924 handle, kSocketIdNativeField, reinterpret_cast<intptr_t>(socket));
965 if (Dart_IsError(err)) { 925 if (Dart_IsError(err)) {
966 Dart_PropagateError(err); 926 Dart_PropagateError(err);
967 } 927 }
968 Dart_WeakPersistentHandleFinalizer callback; 928 Dart_WeakPersistentHandleFinalizer callback;
969 switch (finalizer) { 929 switch (finalizer) {
(...skipping 10 matching lines...) Expand all
980 callback = NULL; 940 callback = NULL;
981 UNREACHABLE(); 941 UNREACHABLE();
982 break; 942 break;
983 } 943 }
984 if (callback != NULL) { 944 if (callback != NULL) {
985 Dart_NewWeakPersistentHandle(handle, reinterpret_cast<void*>(socket), 945 Dart_NewWeakPersistentHandle(handle, reinterpret_cast<void*>(socket),
986 sizeof(Socket), callback); 946 sizeof(Socket), callback);
987 } 947 }
988 } 948 }
989 949
990
991 void Socket::SetSocketIdNativeField(Dart_Handle handle, 950 void Socket::SetSocketIdNativeField(Dart_Handle handle,
992 intptr_t id, 951 intptr_t id,
993 SocketFinalizer finalizer) { 952 SocketFinalizer finalizer) {
994 Socket* socket = new Socket(id); 953 Socket* socket = new Socket(id);
995 ReuseSocketIdNativeField(handle, socket, finalizer); 954 ReuseSocketIdNativeField(handle, socket, finalizer);
996 } 955 }
997 956
998
999 Socket* Socket::GetSocketIdNativeField(Dart_Handle socket_obj) { 957 Socket* Socket::GetSocketIdNativeField(Dart_Handle socket_obj) {
1000 intptr_t id; 958 intptr_t id;
1001 Dart_Handle err = 959 Dart_Handle err =
1002 Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &id); 960 Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &id);
1003 if (Dart_IsError(err)) { 961 if (Dart_IsError(err)) {
1004 Dart_PropagateError(err); 962 Dart_PropagateError(err);
1005 } 963 }
1006 Socket* socket = reinterpret_cast<Socket*>(id); 964 Socket* socket = reinterpret_cast<Socket*>(id);
1007 return socket; 965 return socket;
1008 } 966 }
1009 967
1010 } // namespace bin 968 } // namespace bin
1011 } // namespace dart 969 } // namespace dart
1012 970
1013 #endif // !defined(DART_IO_DISABLED) 971 #endif // !defined(DART_IO_DISABLED)
OLDNEW
« no previous file with comments | « runtime/bin/socket.h ('k') | runtime/bin/socket_android.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698