| Index: runtime/bin/socket_base.h
|
| diff --git a/runtime/bin/socket.h b/runtime/bin/socket_base.h
|
| similarity index 60%
|
| copy from runtime/bin/socket.h
|
| copy to runtime/bin/socket_base.h
|
| index a34fd73585921e228659da9b65137bb819e5d183..b51d484c810510835c6aa2cb870766588dcf437b 100644
|
| --- a/runtime/bin/socket.h
|
| +++ b/runtime/bin/socket_base.h
|
| @@ -1,35 +1,35 @@
|
| -// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
|
| +// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
|
| // for details. All rights reserved. Use of this source code is governed by a
|
| // BSD-style license that can be found in the LICENSE file.
|
|
|
| -#ifndef RUNTIME_BIN_SOCKET_H_
|
| -#define RUNTIME_BIN_SOCKET_H_
|
| +#ifndef RUNTIME_BIN_SOCKET_BASE_H_
|
| +#define RUNTIME_BIN_SOCKET_BASE_H_
|
|
|
| #if defined(DART_IO_DISABLED)
|
| -#error "socket.h can only be included on builds with IO enabled"
|
| +#error "socket_base.h can only be included on builds with IO enabled"
|
| #endif
|
|
|
| #include "platform/globals.h"
|
| // Declare the OS-specific types ahead of defining the generic class.
|
| #if defined(HOST_OS_ANDROID)
|
| -#include "bin/socket_android.h"
|
| +#include "bin/socket_base_android.h"
|
| #elif defined(HOST_OS_FUCHSIA)
|
| -#include "bin/socket_fuchsia.h"
|
| +#include "bin/socket_base_fuchsia.h"
|
| #elif defined(HOST_OS_LINUX)
|
| -#include "bin/socket_linux.h"
|
| +#include "bin/socket_base_linux.h"
|
| #elif defined(HOST_OS_MACOS)
|
| -#include "bin/socket_macos.h"
|
| +#include "bin/socket_base_macos.h"
|
| #elif defined(HOST_OS_WINDOWS)
|
| -#include "bin/socket_win.h"
|
| +#include "bin/socket_base_win.h"
|
| #else
|
| #error Unknown target os.
|
| #endif
|
|
|
| #include "bin/builtin.h"
|
| #include "bin/dartutils.h"
|
| -#include "bin/reference_counting.h"
|
| #include "bin/thread.h"
|
| #include "bin/utils.h"
|
| +#include "platform/allocation.h"
|
| #include "platform/hashmap.h"
|
|
|
| namespace dart {
|
| @@ -247,12 +247,7 @@ class AddressList {
|
| DISALLOW_COPY_AND_ASSIGN(AddressList);
|
| };
|
|
|
| -
|
| -// We write Sockets into the native field of the _NativeSocket object
|
| -// on the Dart side. They are allocated in SetSocketIdNativeField(), and are
|
| -// deallocated either from the finalizer attached to _NativeSockets there, or
|
| -// from the eventhandler, whichever drops the last reference.
|
| -class Socket : public ReferenceCounted<Socket> {
|
| +class SocketBase : public AllStatic {
|
| public:
|
| enum SocketRequest {
|
| kLookupRequest = 0,
|
| @@ -260,20 +255,6 @@ class Socket : public ReferenceCounted<Socket> {
|
| kReverseLookupRequest = 2,
|
| };
|
|
|
| - enum SocketFinalizer {
|
| - kFinalizerNormal,
|
| - kFinalizerListening,
|
| - kFinalizerStdio,
|
| - };
|
| -
|
| - explicit Socket(intptr_t fd);
|
| -
|
| - intptr_t fd() const { return fd_; }
|
| - void SetClosedFd();
|
| -
|
| - Dart_Port port() const { return port_; }
|
| - void set_port(Dart_Port port) { port_ = port; }
|
| -
|
| // TODO(dart:io): Convert these to instance methods where possible.
|
| static bool Initialize();
|
| static intptr_t Available(intptr_t fd);
|
| @@ -290,19 +271,9 @@ class Socket : public ReferenceCounted<Socket> {
|
| void* buffer,
|
| intptr_t num_bytes,
|
| RawAddr* addr);
|
| - // Creates a socket which is bound and connected. The port to connect to is
|
| - // specified as the port component of the passed RawAddr structure.
|
| - static intptr_t CreateConnect(const RawAddr& addr);
|
| - // Creates a socket which is bound and connected. The port to connect to is
|
| - // specified as the port component of the passed RawAddr structure.
|
| - static intptr_t CreateBindConnect(const RawAddr& addr,
|
| - const RawAddr& source_addr);
|
| // Returns true if the given error-number is because the system was not able
|
| // to bind the socket to a specific IP.
|
| static bool IsBindError(intptr_t error_number);
|
| - // Creates a datagram socket which is bound. The port to bind
|
| - // to is specified as the port component of the RawAddr structure.
|
| - static intptr_t CreateBindDatagram(const RawAddr& addr, bool reuseAddress);
|
| static intptr_t GetPort(intptr_t fd);
|
| static SocketAddress* GetRemotePeer(intptr_t fd, intptr_t* port);
|
| static void GetError(intptr_t fd, OSError* os_error);
|
| @@ -347,172 +318,12 @@ class Socket : public ReferenceCounted<Socket> {
|
| int type,
|
| OSError** os_error);
|
|
|
| - static CObject* LookupRequest(const CObjectArray& request);
|
| - static CObject* ListInterfacesRequest(const CObjectArray& request);
|
| - static CObject* ReverseLookupRequest(const CObjectArray& request);
|
| -
|
| - static Dart_Port GetServicePort();
|
| -
|
| - static void SetSocketIdNativeField(Dart_Handle handle,
|
| - intptr_t id,
|
| - SocketFinalizer finalizer);
|
| - static void ReuseSocketIdNativeField(Dart_Handle handle,
|
| - Socket* socket,
|
| - SocketFinalizer finalizer);
|
| - static Socket* GetSocketIdNativeField(Dart_Handle socket);
|
| -
|
| - private:
|
| - ~Socket() { ASSERT(fd_ == kClosedFd); }
|
| -
|
| - static const int kClosedFd = -1;
|
| -
|
| - intptr_t fd_;
|
| - Dart_Port port_;
|
| -
|
| - friend class ReferenceCounted<Socket>;
|
| - DISALLOW_COPY_AND_ASSIGN(Socket);
|
| -};
|
| -
|
| -
|
| -class ServerSocket {
|
| - public:
|
| - static const intptr_t kTemporaryFailure = -2;
|
| -
|
| - static intptr_t Accept(intptr_t fd);
|
| -
|
| - // Creates a socket which is bound and listens. The port to listen on is
|
| - // specified in the port component of the passed RawAddr structure.
|
| - //
|
| - // Returns a positive integer if the call is successful. In case of failure
|
| - // it returns:
|
| - //
|
| - // -1: system error (errno set)
|
| - // -5: invalid bindAddress
|
| - static intptr_t CreateBindListen(const RawAddr& addr,
|
| - intptr_t backlog,
|
| - bool v6_only = false);
|
| -
|
| - // Start accepting on a newly created listening socket. If it was unable to
|
| - // start accepting incoming sockets, the fd is invalidated.
|
| - static bool StartAccept(intptr_t fd);
|
| -
|
| private:
|
| DISALLOW_ALLOCATION();
|
| - DISALLOW_IMPLICIT_CONSTRUCTORS(ServerSocket);
|
| -};
|
| -
|
| -
|
| -class ListeningSocketRegistry {
|
| - public:
|
| - ListeningSocketRegistry()
|
| - : sockets_by_port_(SameIntptrValue, kInitialSocketsCount),
|
| - sockets_by_fd_(SameIntptrValue, kInitialSocketsCount),
|
| - mutex_(new Mutex()) {}
|
| -
|
| - ~ListeningSocketRegistry() {
|
| - CloseAllSafe();
|
| - delete mutex_;
|
| - mutex_ = NULL;
|
| - }
|
| -
|
| - static void Initialize();
|
| -
|
| - static ListeningSocketRegistry* Instance();
|
| -
|
| - static void Cleanup();
|
| -
|
| - // This function should be called from a dart runtime call in order to create
|
| - // a new (potentially shared) socket.
|
| - Dart_Handle CreateBindListen(Dart_Handle socket_object,
|
| - RawAddr addr,
|
| - intptr_t backlog,
|
| - bool v6_only,
|
| - bool shared);
|
| -
|
| - // This should be called from the event handler for every kCloseEvent it gets
|
| - // on listening sockets.
|
| - //
|
| - // Returns `true` if the last reference has been dropped and the underlying
|
| - // socket can be closed.
|
| - //
|
| - // The caller is responsible for obtaining the mutex first, before calling
|
| - // this function.
|
| - bool CloseSafe(Socket* socketfd);
|
| -
|
| - Mutex* mutex() { return mutex_; }
|
| -
|
| - private:
|
| - struct OSSocket {
|
| - RawAddr address;
|
| - int port;
|
| - bool v6_only;
|
| - bool shared;
|
| - int ref_count;
|
| - Socket* socketfd;
|
| -
|
| - // Singly linked lists of OSSocket instances which listen on the same port
|
| - // but on different addresses.
|
| - OSSocket* next;
|
| -
|
| - OSSocket(RawAddr address,
|
| - int port,
|
| - bool v6_only,
|
| - bool shared,
|
| - Socket* socketfd)
|
| - : address(address),
|
| - port(port),
|
| - v6_only(v6_only),
|
| - shared(shared),
|
| - ref_count(0),
|
| - socketfd(socketfd),
|
| - next(NULL) {}
|
| - };
|
| -
|
| - static const intptr_t kInitialSocketsCount = 8;
|
| -
|
| - OSSocket* FindOSSocketWithAddress(OSSocket* current, const RawAddr& addr) {
|
| - while (current != NULL) {
|
| - if (SocketAddress::AreAddressesEqual(current->address, addr)) {
|
| - return current;
|
| - }
|
| - current = current->next;
|
| - }
|
| - return NULL;
|
| - }
|
| -
|
| - static bool SameIntptrValue(void* key1, void* key2) {
|
| - return reinterpret_cast<intptr_t>(key1) == reinterpret_cast<intptr_t>(key2);
|
| - }
|
| -
|
| - static uint32_t GetHashmapHashFromIntptr(intptr_t i) {
|
| - return static_cast<uint32_t>((i + 1) & 0xFFFFFFFF);
|
| - }
|
| -
|
| -
|
| - static void* GetHashmapKeyFromIntptr(intptr_t i) {
|
| - return reinterpret_cast<void*>(i + 1);
|
| - }
|
| -
|
| - OSSocket* LookupByPort(intptr_t port);
|
| - void InsertByPort(intptr_t port, OSSocket* socket);
|
| - void RemoveByPort(intptr_t port);
|
| -
|
| - OSSocket* LookupByFd(Socket* fd);
|
| - void InsertByFd(Socket* fd, OSSocket* socket);
|
| - void RemoveByFd(Socket* fd);
|
| -
|
| - bool CloseOneSafe(OSSocket* os_socket, bool update_hash_maps);
|
| - void CloseAllSafe();
|
| -
|
| - HashMap sockets_by_port_;
|
| - HashMap sockets_by_fd_;
|
| -
|
| - Mutex* mutex_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ListeningSocketRegistry);
|
| + DISALLOW_IMPLICIT_CONSTRUCTORS(SocketBase);
|
| };
|
|
|
| } // namespace bin
|
| } // namespace dart
|
|
|
| -#endif // RUNTIME_BIN_SOCKET_H_
|
| +#endif // RUNTIME_BIN_SOCKET_BASE_H_
|
|
|