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

Unified Diff: runtime/bin/socket.h

Issue 2231123002: Retry: Fixes memory leaks in the eventhandler (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Remove include of <map> Created 4 years, 4 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/eventhandler_macos.cc ('k') | runtime/bin/socket.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/bin/socket.h
diff --git a/runtime/bin/socket.h b/runtime/bin/socket.h
index 6a50d796da61ab37c81820a7c5098ef07dba7cca..ea8dade66514571bafc5cbb788263e1a806877f9 100644
--- a/runtime/bin/socket.h
+++ b/runtime/bin/socket.h
@@ -25,12 +25,11 @@
#error Unknown target os.
#endif
-#include <map>
-
#include "bin/builtin.h"
#include "bin/dartutils.h"
#include "bin/thread.h"
#include "bin/utils.h"
+#include "platform/hashmap.h"
namespace dart {
namespace bin {
@@ -372,40 +371,24 @@ class ServerSocket {
class ListeningSocketRegistry {
- private:
- struct OSSocket {
- RawAddr address;
- int port;
- bool v6_only;
- bool shared;
- int ref_count;
- intptr_t socketfd;
-
- // Singly linked lists of OSSocket instances which listen on the same port
- // but on different addresses.
- OSSocket *next;
+ public:
+ ListeningSocketRegistry() :
+ sockets_by_port_(SameIntptrValue, kInitialSocketsCount),
+ sockets_by_fd_(SameIntptrValue, kInitialSocketsCount),
+ mutex_(new Mutex()) {}
- OSSocket(RawAddr address, int port, bool v6_only, bool shared,
- intptr_t socketfd)
- : address(address), port(port), v6_only(v6_only), shared(shared),
- ref_count(0), socketfd(socketfd), next(NULL) {}
- };
+ ~ListeningSocketRegistry() {
+ CloseAllSafe();
+ delete mutex_;
+ mutex_ = NULL;
+ }
- public:
static void Initialize();
static ListeningSocketRegistry *Instance();
static void Cleanup();
-
- ListeningSocketRegistry() : mutex_(new Mutex()) {}
-
- ~ListeningSocketRegistry() {
- delete mutex_;
- mutex_ = NULL;
- }
-
// 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,
@@ -427,6 +410,26 @@ class ListeningSocketRegistry {
Mutex *mutex() { return mutex_; }
private:
+ struct OSSocket {
+ RawAddr address;
+ int port;
+ bool v6_only;
+ bool shared;
+ int ref_count;
+ intptr_t 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,
+ intptr_t 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)) {
@@ -437,13 +440,35 @@ class ListeningSocketRegistry {
return NULL;
}
- std::map<intptr_t, OSSocket*> sockets_by_port_;
- std::map<intptr_t, OSSocket*> sockets_by_fd_;
- Mutex *mutex_;
+ static bool SameIntptrValue(void* key1, void* key2) {
+ return reinterpret_cast<intptr_t>(key1) == reinterpret_cast<intptr_t>(key2);
+ }
- typedef std::map<intptr_t, OSSocket*>::iterator SocketsIterator;
+ 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(intptr_t fd);
+ void InsertByFd(intptr_t fd, OSSocket* socket);
+ void RemoveByFd(intptr_t fd);
+
+ bool CloseOneSafe(OSSocket* os_socket);
+ void CloseAllSafe();
+
+ HashMap sockets_by_port_;
+ HashMap sockets_by_fd_;
+
+ Mutex *mutex_;
- private:
DISALLOW_COPY_AND_ASSIGN(ListeningSocketRegistry);
};
« no previous file with comments | « runtime/bin/eventhandler_macos.cc ('k') | runtime/bin/socket.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698