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

Unified Diff: runtime/bin/process.cc

Issue 2760293002: [dart:io] Adds a finalizer to _NativeSocket to avoid socket leaks (Closed)
Patch Set: Address comments Created 3 years, 9 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/process.h ('k') | runtime/bin/process_win.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/bin/process.cc
diff --git a/runtime/bin/process.cc b/runtime/bin/process.cc
index 9720d39e75093baeed6236c5707e5354e084147a..f6366579652090d6e9c38b2ac020011f390bc089 100644
--- a/runtime/bin/process.cc
+++ b/runtime/bin/process.cc
@@ -72,6 +72,14 @@ static char** ExtractCStringList(Dart_Handle strings,
return string_args;
}
+
+void Process::ClearAllSignalHandlers() {
+ for (intptr_t i = 1; i <= kLastSignal; i++) {
+ ClearSignalHandler(i);
+ }
+}
+
+
void FUNCTION_NAME(Process_Start)(Dart_NativeArguments args) {
Dart_Handle process = Dart_GetNativeArgument(args, 0);
intptr_t process_stdin;
@@ -153,12 +161,12 @@ void FUNCTION_NAME(Process_Start)(Dart_NativeArguments args) {
&process_stdin, &process_stderr, &pid, &exit_event, &os_error_message);
if (error_code == 0) {
if (mode != kDetached) {
- Socket::SetSocketIdNativeField(stdin_handle, process_stdin);
- Socket::SetSocketIdNativeField(stdout_handle, process_stdout);
- Socket::SetSocketIdNativeField(stderr_handle, process_stderr);
+ Socket::SetSocketIdNativeField(stdin_handle, process_stdin, false);
+ Socket::SetSocketIdNativeField(stdout_handle, process_stdout, false);
+ Socket::SetSocketIdNativeField(stderr_handle, process_stderr, false);
}
if (mode == kNormal) {
- Socket::SetSocketIdNativeField(exit_handle, exit_event);
+ Socket::SetSocketIdNativeField(exit_handle, exit_event, false);
}
Process::SetProcessIdNativeField(process, pid);
} else {
@@ -181,19 +189,26 @@ void FUNCTION_NAME(Process_Start)(Dart_NativeArguments args) {
void FUNCTION_NAME(Process_Wait)(Dart_NativeArguments args) {
Dart_Handle process = Dart_GetNativeArgument(args, 0);
- intptr_t process_stdin =
+ Socket* process_stdin =
Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 1));
- intptr_t process_stdout =
+ Socket* process_stdout =
Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 2));
- intptr_t process_stderr =
+ Socket* process_stderr =
Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 3));
- intptr_t exit_event =
+ Socket* exit_event =
Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 4));
ProcessResult result;
intptr_t pid;
Process::GetProcessIdNativeField(process, &pid);
- if (Process::Wait(pid, process_stdin, process_stdout, process_stderr,
- exit_event, &result)) {
+ bool success = Process::Wait(pid, process_stdin->fd(), process_stdout->fd(),
+ process_stderr->fd(), exit_event->fd(), &result);
+ // Process::Wait() closes the file handles, so blow away the fds in the
+ // Sockets so that they don't get picked up by the finalizer on _NativeSocket.
+ process_stdin->SetClosedFd();
+ process_stdout->SetClosedFd();
+ process_stderr->SetClosedFd();
+ exit_event->SetClosedFd();
+ if (success) {
Dart_Handle out = result.stdout_data();
if (Dart_IsError(out)) {
Dart_PropagateError(out);
« no previous file with comments | « runtime/bin/process.h ('k') | runtime/bin/process_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698