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

Side by Side Diff: runtime/bin/socket.cc

Issue 2228503007: Fixes memory leaks in the eventhandler (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Cleanup 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #if !defined(DART_IO_DISABLED) 5 #if !defined(DART_IO_DISABLED)
6 6
7 #include "bin/socket.h" 7 #include "bin/socket.h"
8 8
9 #include "bin/dartutils.h" 9 #include "bin/dartutils.h"
10 #include "bin/io_buffer.h" 10 #include "bin/io_buffer.h"
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 sockets_by_port_[allocated_port] = os_socket; 120 sockets_by_port_[allocated_port] = os_socket;
121 sockets_by_fd_[socketfd] = os_socket; 121 sockets_by_fd_[socketfd] = os_socket;
122 122
123 // We set as a side-effect the port on the dart socket_object. 123 // We set as a side-effect the port on the dart socket_object.
124 Socket::SetSocketIdNativeField(socket_object, socketfd); 124 Socket::SetSocketIdNativeField(socket_object, socketfd);
125 125
126 return Dart_True(); 126 return Dart_True();
127 } 127 }
128 128
129 129
130 bool ListeningSocketRegistry::CloseOneSafe(OSSocket* os_socket) {
siva 2016/08/09 21:41:43 ASSERT(mutex_ is owned by current thread); ASSERT(
zra 2016/08/09 22:19:27 For the mutexes under bin there is no "is owned by
131 ASSERT(os_socket->ref_count > 0);
132 os_socket->ref_count--;
133 if (os_socket->ref_count > 0) {
134 return false;
135 }
136 // We free the OS socket by removing it from two datastructures.
137 sockets_by_fd_.erase(os_socket->socketfd);
138
139 OSSocket *prev = NULL;
140 OSSocket *current = sockets_by_port_[os_socket->port];
141 while (current != os_socket) {
142 ASSERT(current != NULL);
143 prev = current;
144 current = current->next;
145 }
146
147 if ((prev == NULL) && (current->next == NULL)) {
148 // Remove last element from the list.
149 sockets_by_port_.erase(os_socket->port);
150 } else if (prev == NULL) {
151 // Remove first element of the list.
152 sockets_by_port_[os_socket->port] = current->next;
153 } else {
154 // Remove element from the list which is not the first one.
155 prev->next = os_socket->next;
156 }
157
siva 2016/08/09 21:41:43 ASSERT(os_socket->ref_count == 0);
zra 2016/08/09 22:19:27 Done.
158 delete os_socket;
159 return true;
160 }
161
162
163 void ListeningSocketRegistry::CloseAllSafe() {
164 MutexLocker ml(mutex_);
165 SocketsIterator it = sockets_by_fd_.begin();
166 while (it != sockets_by_fd_.end()) {
167 CloseOneSafe(it->second);
168 it++;
169 }
170 }
171
172
130 bool ListeningSocketRegistry::CloseSafe(intptr_t socketfd) { 173 bool ListeningSocketRegistry::CloseSafe(intptr_t socketfd) {
131 ASSERT(!mutex_->TryLock()); 174 ASSERT(!mutex_->TryLock());
132 175
133 SocketsIterator it = sockets_by_fd_.find(socketfd); 176 SocketsIterator it = sockets_by_fd_.find(socketfd);
134 if (it != sockets_by_fd_.end()) { 177 if (it != sockets_by_fd_.end()) {
135 OSSocket *os_socket = it->second; 178 OSSocket *os_socket = it->second;
136 179 return CloseOneSafe(os_socket);
siva 2016/08/09 21:41:43 why not CloseOneSafe(it->second);
zra 2016/08/09 22:19:27 Done.
137 ASSERT(os_socket->ref_count > 0);
138 os_socket->ref_count--;
139 if (os_socket->ref_count == 0) {
140 // We free the OS socket by removing it from two datastructures.
141 sockets_by_fd_.erase(socketfd);
142
143 OSSocket *prev = NULL;
144 OSSocket *current = sockets_by_port_[os_socket->port];
145 while (current != os_socket) {
146 ASSERT(current != NULL);
147 prev = current;
148 current = current->next;
149 }
150
151 if ((prev == NULL) && (current->next == NULL)) {
152 // Remove last element from the list.
153 sockets_by_port_.erase(os_socket->port);
154 } else if (prev == NULL) {
155 // Remove first element of the list.
156 sockets_by_port_[os_socket->port] = current->next;
157 } else {
158 // Remove element from the list which is not the first one.
159 prev->next = os_socket->next;
160 }
161
162 delete os_socket;
163 return true;
164 }
165 return false;
166 } else { 180 } else {
167 // It should be impossible for the event handler to close something that 181 // It should be impossible for the event handler to close something that
168 // hasn't been created before. 182 // hasn't been created before.
169 UNREACHABLE(); 183 UNREACHABLE();
170 return false; 184 return false;
171 } 185 }
172 } 186 }
173 187
174 188
175 void FUNCTION_NAME(InternetAddress_Parse)(Dart_NativeArguments args) { 189 void FUNCTION_NAME(InternetAddress_Parse)(Dart_NativeArguments args) {
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 if (Dart_IsError(err)) { 897 if (Dart_IsError(err)) {
884 Dart_PropagateError(err); 898 Dart_PropagateError(err);
885 } 899 }
886 return socket; 900 return socket;
887 } 901 }
888 902
889 } // namespace bin 903 } // namespace bin
890 } // namespace dart 904 } // namespace dart
891 905
892 #endif // !defined(DART_IO_DISABLED) 906 #endif // !defined(DART_IO_DISABLED)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698