OLD | NEW |
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 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 InsertByPort(allocated_port, os_socket); | 189 InsertByPort(allocated_port, os_socket); |
190 InsertByFd(socketfd, os_socket); | 190 InsertByFd(socketfd, os_socket); |
191 | 191 |
192 // We set as a side-effect the port on the dart socket_object. | 192 // We set as a side-effect the port on the dart socket_object. |
193 Socket::SetSocketIdNativeField(socket_object, socketfd); | 193 Socket::SetSocketIdNativeField(socket_object, socketfd); |
194 | 194 |
195 return Dart_True(); | 195 return Dart_True(); |
196 } | 196 } |
197 | 197 |
198 | 198 |
199 bool ListeningSocketRegistry::CloseOneSafe(OSSocket* os_socket) { | 199 bool ListeningSocketRegistry::CloseOneSafe(OSSocket* os_socket, |
| 200 bool update_hash_maps) { |
200 ASSERT(!mutex_->TryLock()); | 201 ASSERT(!mutex_->TryLock()); |
201 ASSERT(os_socket != NULL); | 202 ASSERT(os_socket != NULL); |
202 ASSERT(os_socket->ref_count > 0); | 203 ASSERT(os_socket->ref_count > 0); |
203 os_socket->ref_count--; | 204 os_socket->ref_count--; |
204 if (os_socket->ref_count > 0) { | 205 if (os_socket->ref_count > 0) { |
205 return false; | 206 return false; |
206 } | 207 } |
207 // We free the OS socket by removing it from two datastructures. | 208 if (update_hash_maps) { |
208 RemoveByFd(os_socket->socketfd); | 209 // We free the OS socket by removing it from two datastructures. |
| 210 RemoveByFd(os_socket->socketfd); |
209 | 211 |
210 OSSocket* prev = NULL; | 212 OSSocket* prev = NULL; |
211 OSSocket* current = LookupByPort(os_socket->port); | 213 OSSocket* current = LookupByPort(os_socket->port); |
212 while (current != os_socket) { | 214 while (current != os_socket) { |
213 ASSERT(current != NULL); | 215 ASSERT(current != NULL); |
214 prev = current; | 216 prev = current; |
215 current = current->next; | 217 current = current->next; |
216 } | 218 } |
217 | 219 |
218 if ((prev == NULL) && (current->next == NULL)) { | 220 if ((prev == NULL) && (current->next == NULL)) { |
219 // Remove last element from the list. | 221 // Remove last element from the list. |
220 RemoveByPort(os_socket->port); | 222 RemoveByPort(os_socket->port); |
221 } else if (prev == NULL) { | 223 } else if (prev == NULL) { |
222 // Remove first element of the list. | 224 // Remove first element of the list. |
223 InsertByPort(os_socket->port, current->next); | 225 InsertByPort(os_socket->port, current->next); |
224 } else { | 226 } else { |
225 // Remove element from the list which is not the first one. | 227 // Remove element from the list which is not the first one. |
226 prev->next = os_socket->next; | 228 prev->next = os_socket->next; |
| 229 } |
227 } | 230 } |
228 | 231 |
229 ASSERT(os_socket->ref_count == 0); | 232 ASSERT(os_socket->ref_count == 0); |
230 delete os_socket; | 233 delete os_socket; |
231 return true; | 234 return true; |
232 } | 235 } |
233 | 236 |
234 | 237 |
235 void ListeningSocketRegistry::CloseAllSafe() { | 238 void ListeningSocketRegistry::CloseAllSafe() { |
236 MutexLocker ml(mutex_); | 239 MutexLocker ml(mutex_); |
237 for (HashMap::Entry* p = sockets_by_fd_.Start(); p != NULL; | 240 |
238 p = sockets_by_fd_.Next(p)) { | 241 for (HashMap::Entry* cursor = sockets_by_fd_.Start(); cursor != NULL; |
239 CloseOneSafe(reinterpret_cast<OSSocket*>(p->value)); | 242 cursor = sockets_by_fd_.Next(cursor)) { |
| 243 CloseOneSafe(reinterpret_cast<OSSocket*>(cursor->value), false); |
240 } | 244 } |
241 } | 245 } |
242 | 246 |
243 | 247 |
244 bool ListeningSocketRegistry::CloseSafe(intptr_t socketfd) { | 248 bool ListeningSocketRegistry::CloseSafe(intptr_t socketfd) { |
245 ASSERT(!mutex_->TryLock()); | 249 ASSERT(!mutex_->TryLock()); |
246 OSSocket* os_socket = LookupByFd(socketfd); | 250 OSSocket* os_socket = LookupByFd(socketfd); |
247 if (os_socket != NULL) { | 251 if (os_socket != NULL) { |
248 return CloseOneSafe(os_socket); | 252 return CloseOneSafe(os_socket, true); |
249 } else { | 253 } else { |
250 // It should be impossible for the event handler to close something that | 254 // It should be impossible for the event handler to close something that |
251 // hasn't been created before. | 255 // hasn't been created before. |
252 UNREACHABLE(); | 256 UNREACHABLE(); |
253 return false; | 257 return false; |
254 } | 258 } |
255 } | 259 } |
256 | 260 |
257 | 261 |
258 void FUNCTION_NAME(InternetAddress_Parse)(Dart_NativeArguments args) { | 262 void FUNCTION_NAME(InternetAddress_Parse)(Dart_NativeArguments args) { |
(...skipping 682 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
941 if (Dart_IsError(err)) { | 945 if (Dart_IsError(err)) { |
942 Dart_PropagateError(err); | 946 Dart_PropagateError(err); |
943 } | 947 } |
944 return socket; | 948 return socket; |
945 } | 949 } |
946 | 950 |
947 } // namespace bin | 951 } // namespace bin |
948 } // namespace dart | 952 } // namespace dart |
949 | 953 |
950 #endif // !defined(DART_IO_DISABLED) | 954 #endif // !defined(DART_IO_DISABLED) |
OLD | NEW |