Index: runtime/bin/socket.cc |
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc |
index 500252487edf67b8a9766a6683d96ae65d04b51b..a208613d07c1006e8c62db7236729fcac556a779 100644 |
--- a/runtime/bin/socket.cc |
+++ b/runtime/bin/socket.cc |
@@ -147,7 +147,7 @@ Dart_Handle ListeningSocketRegistry::CreateBindListen(Dart_Handle socket_object, |
// We set as a side-effect the file descriptor on the dart |
// socket_object. |
Socket::ReuseSocketIdNativeField(socket_object, os_socket->socketfd, |
- true); |
+ Socket::kFinalizerListening); |
return Dart_True(); |
} |
@@ -199,7 +199,8 @@ Dart_Handle ListeningSocketRegistry::CreateBindListen(Dart_Handle socket_object, |
InsertByFd(socketfd, os_socket); |
// We set as a side-effect the port on the dart socket_object. |
- Socket::ReuseSocketIdNativeField(socket_object, socketfd, true); |
+ Socket::ReuseSocketIdNativeField(socket_object, socketfd, |
+ Socket::kFinalizerListening); |
return Dart_True(); |
} |
@@ -305,7 +306,7 @@ void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) { |
OSError error; |
if (socket >= 0) { |
Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, |
- false); |
+ Socket::kFinalizerNormal); |
Dart_SetReturnValue(args, Dart_True()); |
} else { |
Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); |
@@ -325,7 +326,7 @@ void FUNCTION_NAME(Socket_CreateBindConnect)(Dart_NativeArguments args) { |
OSError error; |
if (socket >= 0) { |
Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, |
- false); |
+ Socket::kFinalizerNormal); |
Dart_SetReturnValue(args, Dart_True()); |
} else { |
Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); |
@@ -349,7 +350,7 @@ void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) { |
intptr_t socket = Socket::CreateBindDatagram(addr, reuse_addr); |
if (socket >= 0) { |
Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, |
- false); |
+ Socket::kFinalizerNormal); |
Dart_SetReturnValue(args, Dart_True()); |
} else { |
OSError error; |
@@ -628,7 +629,7 @@ void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) { |
DartUtils::GetInt64ValueCheckRange(Dart_GetNativeArgument(args, 1), 0, 2); |
intptr_t socket = Socket::GetStdioHandle(num); |
Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, |
- false); |
+ Socket::kFinalizerStdio); |
Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0)); |
} |
@@ -643,7 +644,8 @@ void FUNCTION_NAME(Socket_GetSocketId)(Dart_NativeArguments args) { |
void FUNCTION_NAME(Socket_SetSocketId)(Dart_NativeArguments args) { |
intptr_t id = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1)); |
- Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), id, false); |
+ Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), id, |
+ Socket::kFinalizerNormal); |
} |
@@ -671,7 +673,7 @@ void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) { |
intptr_t new_socket = ServerSocket::Accept(socket->fd()); |
if (new_socket >= 0) { |
Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 1), new_socket, |
- false); |
+ Socket::kFinalizerNormal); |
Dart_SetReturnValue(args, Dart_True()); |
} else if (new_socket == ServerSocket::kTemporaryFailure) { |
Dart_SetReturnValue(args, Dart_False()); |
@@ -944,9 +946,9 @@ void FUNCTION_NAME(Socket_LeaveMulticast)(Dart_NativeArguments args) { |
} |
-static void SocketFinalizer(void* isolate_data, |
- Dart_WeakPersistentHandle handle, |
- void* data) { |
+static void NormalSocketFinalizer(void* isolate_data, |
+ Dart_WeakPersistentHandle handle, |
+ void* data) { |
Socket* socket = reinterpret_cast<Socket*>(data); |
if (socket->fd() >= 0) { |
const int64_t flags = 1 << kCloseCommand; |
@@ -972,29 +974,53 @@ static void ListeningSocketFinalizer(void* isolate_data, |
} |
+static void StdioSocketFinalizer(void* isolate_data, |
+ Dart_WeakPersistentHandle handle, |
+ void* data) { |
+ Socket* socket = reinterpret_cast<Socket*>(data); |
+ if (socket->fd() >= 0) { |
+ socket->SetClosedFd(); |
+ } |
+ socket->Release(); |
+} |
+ |
+ |
void Socket::ReuseSocketIdNativeField(Dart_Handle handle, |
Socket* socket, |
- bool listening) { |
+ SocketFinalizer finalizer) { |
Dart_Handle err = Dart_SetNativeInstanceField( |
handle, kSocketIdNativeField, reinterpret_cast<intptr_t>(socket)); |
if (Dart_IsError(err)) { |
Dart_PropagateError(err); |
} |
- if (listening) { |
- Dart_NewWeakPersistentHandle(handle, reinterpret_cast<void*>(socket), |
- sizeof(Socket), ListeningSocketFinalizer); |
- } else { |
+ Dart_WeakPersistentHandleFinalizer callback; |
+ switch (finalizer) { |
+ case kFinalizerNormal: |
+ callback = NormalSocketFinalizer; |
+ break; |
+ case kFinalizerListening: |
+ callback = ListeningSocketFinalizer; |
+ break; |
+ case kFinalizerStdio: |
+ callback = StdioSocketFinalizer; |
+ break; |
+ default: |
+ callback = NULL; |
+ UNREACHABLE(); |
+ break; |
+ } |
+ if (callback != NULL) { |
Dart_NewWeakPersistentHandle(handle, reinterpret_cast<void*>(socket), |
- sizeof(Socket), SocketFinalizer); |
+ sizeof(Socket), callback); |
} |
} |
void Socket::SetSocketIdNativeField(Dart_Handle handle, |
intptr_t id, |
- bool listening) { |
+ SocketFinalizer finalizer) { |
Socket* socket = new Socket(id); |
- ReuseSocketIdNativeField(handle, socket, listening); |
+ ReuseSocketIdNativeField(handle, socket, finalizer); |
} |