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

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

Issue 2229973002: Revert: Fixes memory leaks in the eventhandler (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: 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
« no previous file with comments | « runtime/bin/socket.h ('k') | runtime/platform/hashmap.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
131 ASSERT(!mutex_->TryLock());
132 ASSERT(os_socket != NULL);
133 ASSERT(os_socket->ref_count > 0);
134 os_socket->ref_count--;
135 if (os_socket->ref_count > 0) {
136 return false;
137 }
138 // We free the OS socket by removing it from two datastructures.
139 sockets_by_fd_.erase(os_socket->socketfd);
140
141 OSSocket *prev = NULL;
142 OSSocket *current = sockets_by_port_[os_socket->port];
143 while (current != os_socket) {
144 ASSERT(current != NULL);
145 prev = current;
146 current = current->next;
147 }
148
149 if ((prev == NULL) && (current->next == NULL)) {
150 // Remove last element from the list.
151 sockets_by_port_.erase(os_socket->port);
152 } else if (prev == NULL) {
153 // Remove first element of the list.
154 sockets_by_port_[os_socket->port] = current->next;
155 } else {
156 // Remove element from the list which is not the first one.
157 prev->next = os_socket->next;
158 }
159
160 ASSERT(os_socket->ref_count == 0);
161 delete os_socket;
162 return true;
163 }
164
165
166 void ListeningSocketRegistry::CloseAllSafe() {
167 MutexLocker ml(mutex_);
168 SocketsIterator it = sockets_by_fd_.begin();
169 while (it != sockets_by_fd_.end()) {
170 CloseOneSafe(it->second);
171 it++;
172 }
173 }
174
175
176 bool ListeningSocketRegistry::CloseSafe(intptr_t socketfd) { 130 bool ListeningSocketRegistry::CloseSafe(intptr_t socketfd) {
177 ASSERT(!mutex_->TryLock()); 131 ASSERT(!mutex_->TryLock());
132
178 SocketsIterator it = sockets_by_fd_.find(socketfd); 133 SocketsIterator it = sockets_by_fd_.find(socketfd);
179 if (it != sockets_by_fd_.end()) { 134 if (it != sockets_by_fd_.end()) {
180 return CloseOneSafe(it->second); 135 OSSocket *os_socket = it->second;
136
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;
181 } else { 166 } else {
182 // It should be impossible for the event handler to close something that 167 // It should be impossible for the event handler to close something that
183 // hasn't been created before. 168 // hasn't been created before.
184 UNREACHABLE(); 169 UNREACHABLE();
185 return false; 170 return false;
186 } 171 }
187 } 172 }
188 173
189 174
190 void FUNCTION_NAME(InternetAddress_Parse)(Dart_NativeArguments args) { 175 void FUNCTION_NAME(InternetAddress_Parse)(Dart_NativeArguments args) {
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after
898 if (Dart_IsError(err)) { 883 if (Dart_IsError(err)) {
899 Dart_PropagateError(err); 884 Dart_PropagateError(err);
900 } 885 }
901 return socket; 886 return socket;
902 } 887 }
903 888
904 } // namespace bin 889 } // namespace bin
905 } // namespace dart 890 } // namespace dart
906 891
907 #endif // !defined(DART_IO_DISABLED) 892 #endif // !defined(DART_IO_DISABLED)
OLDNEW
« no previous file with comments | « runtime/bin/socket.h ('k') | runtime/platform/hashmap.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698