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 #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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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) |
OLD | NEW |