Chromium Code Reviews| Index: dart/runtime/bin/socket.h |
| diff --git a/dart/runtime/bin/socket.h b/dart/runtime/bin/socket.h |
| index ff5444daa585f4546d8c2421e657565bd99e393b..c84bdd8953aa7f093d89210b5665d49b0f2bf63a 100644 |
| --- a/dart/runtime/bin/socket.h |
| +++ b/dart/runtime/bin/socket.h |
| @@ -5,6 +5,8 @@ |
| #ifndef BIN_SOCKET_H_ |
| #define BIN_SOCKET_H_ |
| +#include <map> |
|
Søren Gjesse
2015/01/29 09:05:51
As some point we where avoiding using STL, which i
kustermann
2015/01/29 11:14:05
Yes, I thought there might be a 50/50 chance of be
|
| + |
| #include "platform/globals.h" |
| #include "bin/builtin.h" |
| @@ -312,6 +314,77 @@ class ServerSocket { |
| DISALLOW_IMPLICIT_CONSTRUCTORS(ServerSocket); |
| }; |
| +class ListeningSocketRegistry { |
| + private: |
| + struct OSSocket { |
| + RawAddr address; |
| + int port; |
| + bool v6_only; |
| + bool shared; |
| + int ref_count; |
| + int socketfd; |
|
Søren Gjesse
2015/01/29 09:05:51
To support Windows where this is a pointer this sh
kustermann
2015/01/29 11:14:05
Done.
|
| + |
| + // 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, int socketfd) |
| + : address(address), port(port), v6_only(v6_only), shared(shared), |
| + ref_count(0), socketfd(socketfd), next(NULL) {} |
| + }; |
| + typedef std::map<int, OSSocket*>::iterator SocketsIterator; |
| + |
| + public: |
| + ListeningSocketRegistry() : mutex_(new Mutex()) {} |
| + |
| + // 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 port, |
| + 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 droped and the underlying |
|
wibling
2015/01/29 09:42:01
NIT: droped -> dropped
kustermann
2015/01/29 11:14:05
Done.
|
| + // socket can be closed. |
| + // |
| + // The caller is responsible for obtaining the mutex first, before calling |
| + // this function. |
| + bool CloseSafe(int socketfd); |
| + |
| + // Mark an existing socket as sharable if it is not already marked as |
| + // sharable. |
| + // |
| + // NOTE: This is a temporary measure until ServerSocketReferenc'es are |
|
wibling
2015/01/29 09:42:01
NIT: ServerSocketReferenc'es -> ServerSocketRefere
kustermann
2015/01/29 11:14:05
Done.
|
| + // removed. |
| + Dart_Handle MarkSocketFdAsSharableHack(int socketfd); |
| + |
| + Mutex *mutex() { return mutex_; } |
| + |
| + private: |
| + bool addressesAreEqual(const RawAddr& a, const RawAddr& b); |
| + |
| + OSSocket *findOSSocketWithAddress(OSSocket *current, const RawAddr& addr) { |
| + while (current != NULL) { |
| + if (addressesAreEqual(current->address, addr)) { |
| + return current; |
| + } |
| + current = current->next; |
| + } |
| + return NULL; |
| + } |
| + |
| + std::map<int, OSSocket*> sockets_by_port_; |
| + std::map<int, OSSocket*> sockets_by_fd_; |
| + Mutex *mutex_; |
| +}; |
| + |
| +extern ListeningSocketRegistry globalTcpListeningSocketRegistry; |
| + |
| } // namespace bin |
| } // namespace dart |