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

Unified Diff: runtime/bin/socket_base.h

Issue 2797993005: Re-land socket refactor with fixes for Windows. (Closed)
Patch Set: Rebased + reverted original revert Created 3 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/bin/socket_android.cc ('k') | runtime/bin/socket_base.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_
« no previous file with comments | « runtime/bin/socket_android.cc ('k') | runtime/bin/socket_base.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698