| Index: dart/runtime/bin/socket.cc
|
| diff --git a/dart/runtime/bin/socket.cc b/dart/runtime/bin/socket.cc
|
| index cb14968c27ac13254407a38c6b2759acae73890f..dcacf6ac34b1bb42783b03a8e1978a324dbdf84a 100644
|
| --- a/dart/runtime/bin/socket.cc
|
| +++ b/dart/runtime/bin/socket.cc
|
| @@ -7,7 +7,6 @@
|
| #include "bin/dartutils.h"
|
| #include "bin/socket.h"
|
| #include "bin/thread.h"
|
| -#include "bin/lockers.h"
|
| #include "bin/utils.h"
|
|
|
| #include "platform/globals.h"
|
| @@ -18,144 +17,6 @@
|
| namespace dart {
|
| namespace bin {
|
|
|
| -Dart_Handle ListeningSocketRegistry::CreateBindListen(Dart_Handle socket_object,
|
| - RawAddr addr,
|
| - intptr_t port,
|
| - intptr_t backlog,
|
| - bool v6_only,
|
| - bool shared) {
|
| - MutexLocker ml(ListeningSocketRegistry::mutex_);
|
| -
|
| - SocketsIterator it = sockets_by_port_.find(port);
|
| - OSSocket *first_os_socket = NULL;
|
| - if (it != sockets_by_port_.end()) {
|
| - first_os_socket = it->second;
|
| - }
|
| -
|
| - if (first_os_socket != NULL) {
|
| - // There is already a socket listening on this port. We need to ensure
|
| - // that if there is one also listening on the same address, it was created
|
| - // with `shared = true`, ...
|
| -
|
| - OSSocket *os_socket = it->second;
|
| - OSSocket *os_socket_same_addr = findOSSocketWithAddress(os_socket, addr);
|
| -
|
| - if (os_socket_same_addr != NULL) {
|
| - if (!os_socket_same_addr->shared || !shared) {
|
| - OSError os_error(-1,
|
| - "The shared flag to bind() needs to be `true` if "
|
| - "binding multiple times on the same (address, port) "
|
| - "combination.",
|
| - OSError::kUnknown);
|
| - return DartUtils::NewDartOSError(&os_error);
|
| - }
|
| - if (os_socket_same_addr->v6_only != v6_only) {
|
| - OSError os_error(-1,
|
| - "The v6Only flag to bind() needs to be the same if "
|
| - "binding multiple times on the same (address, port) "
|
| - "combination.",
|
| - OSError::kUnknown);
|
| - return DartUtils::NewDartOSError(&os_error);
|
| - }
|
| -
|
| - // This socket creation is the exact same as the one which originally
|
| - // created the socket. We therefore increment the refcount and return
|
| - // the file descriptor.
|
| - os_socket->ref_count++;
|
| -
|
| - // We set as a side-effect the file descriptor on the dart socket_object.
|
| - Socket::SetSocketIdNativeField(socket_object, os_socket->socketfd);
|
| -
|
| - return Dart_True();
|
| - }
|
| - }
|
| -
|
| - // There is no socket listening on that (address, port), so we create new one.
|
| - intptr_t socketfd = ServerSocket::CreateBindListen(
|
| - addr, port, backlog, v6_only);
|
| - if (socketfd == -5) {
|
| - OSError os_error(-1, "Invalid host", OSError::kUnknown);
|
| - return DartUtils::NewDartOSError(&os_error);
|
| - }
|
| - if (socketfd < 0) {
|
| - OSError error;
|
| - return DartUtils::NewDartOSError(&error);
|
| - }
|
| - if (!ServerSocket::StartAccept(socketfd)) {
|
| - OSError os_error(-1, "Failed to start accept", OSError::kUnknown);
|
| - return DartUtils::NewDartOSError(&os_error);
|
| - }
|
| - intptr_t allocated_port = Socket::GetPort(socketfd);
|
| - ASSERT(allocated_port > 0);
|
| -
|
| - OSSocket *os_socket =
|
| - new OSSocket(addr, allocated_port, v6_only, shared, socketfd);
|
| - os_socket->ref_count = 1;
|
| - os_socket->next = first_os_socket;
|
| - sockets_by_port_[allocated_port] = os_socket;
|
| - sockets_by_fd_[socketfd] = os_socket;
|
| -
|
| - // We set as a side-effect the port on the dart socket_object.
|
| - Socket::SetSocketIdNativeField(socket_object, socketfd);
|
| -
|
| - return Dart_True();
|
| -}
|
| -
|
| -bool ListeningSocketRegistry::CloseSafe(int socketfd) {
|
| - ASSERT(!mutex_->TryLock());
|
| -
|
| - SocketsIterator it = sockets_by_fd_.find(socketfd);
|
| - if (it != sockets_by_fd_.end()) {
|
| - OSSocket *os_socket = it->second;
|
| -
|
| - ASSERT(os_socket->ref_count > 0);
|
| - os_socket->ref_count--;
|
| - if (os_socket->ref_count == 0) {
|
| - // We free the OS socket by removing it from two datastructures.
|
| - sockets_by_fd_.erase(socketfd);
|
| -
|
| - OSSocket *prev = NULL;
|
| - OSSocket *current = sockets_by_port_[os_socket->port];
|
| - while (current != os_socket) {
|
| - ASSERT(current != NULL);
|
| - prev = current;
|
| - current = current->next;
|
| - }
|
| -
|
| - if (prev == NULL && current->next == NULL) {
|
| - sockets_by_port_.erase(os_socket->port);
|
| - } else if (prev == NULL) {
|
| - sockets_by_port_[os_socket->port] = current->next;
|
| - } else {
|
| - prev->next = os_socket->next;
|
| - }
|
| -
|
| - delete os_socket;
|
| - return true;
|
| - }
|
| - return false;
|
| - } else {
|
| - // It should be impossible for the event handler to close something that
|
| - // hasn't been created before.
|
| - UNREACHABLE();
|
| - return false;
|
| - }
|
| -}
|
| -
|
| -Dart_Handle ListeningSocketRegistry::MarkSocketFdAsSharableHack(int socketfd) {
|
| - MutexLocker ml(ListeningSocketRegistry::mutex_);
|
| -
|
| - SocketsIterator it = sockets_by_fd_.find(socketfd);
|
| - if (it != sockets_by_fd_.end()) {
|
| - it->second->shared = true;
|
| - return Dart_True();
|
| - } else {
|
| - return Dart_False();
|
| - }
|
| -}
|
| -
|
| -ListeningSocketRegistry globalTcpListeningSocketRegistry;
|
| -
|
| static const int kSocketIdNativeField = 0;
|
|
|
| void FUNCTION_NAME(InternetAddress_Parse)(Dart_NativeArguments args) {
|
| @@ -515,12 +376,20 @@ void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) {
|
| 0,
|
| 65535);
|
| bool v6_only = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4));
|
| - bool shared = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 5));
|
| -
|
| - Dart_Handle socket_object = Dart_GetNativeArgument(args, 0);
|
| - Dart_Handle result = globalTcpListeningSocketRegistry.CreateBindListen(
|
| - socket_object, addr, port, backlog, v6_only, shared);
|
| - Dart_SetReturnValue(args, result);
|
| + intptr_t socket = ServerSocket::CreateBindListen(
|
| + addr, port, backlog, v6_only);
|
| + OSError error;
|
| + if (socket >= 0 && ServerSocket::StartAccept(socket)) {
|
| + Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket);
|
| + Dart_SetReturnValue(args, Dart_True());
|
| + } else {
|
| + if (socket == -5) {
|
| + OSError os_error(-1, "Invalid host", OSError::kUnknown);
|
| + Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
|
| + } else {
|
| + Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error));
|
| + }
|
| + }
|
| }
|
|
|
|
|
| @@ -809,15 +678,6 @@ void FUNCTION_NAME(Socket_LeaveMulticast)(Dart_NativeArguments args) {
|
| }
|
|
|
|
|
| -void FUNCTION_NAME(Socket_MarkSocketAsSharedHack)(Dart_NativeArguments args) {
|
| - intptr_t socketfd =
|
| - Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
|
| -
|
| - Dart_SetReturnValue(args,
|
| - globalTcpListeningSocketRegistry.MarkSocketFdAsSharableHack(socketfd));
|
| -}
|
| -
|
| -
|
| void Socket::SetSocketIdNativeField(Dart_Handle socket, intptr_t id) {
|
| Dart_Handle err =
|
| Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id);
|
|
|