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

Unified Diff: runtime/bin/process_linux.cc

Issue 1156313004: Clean up process spawning. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 6 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 | « no previous file | tests/standalone/io/platform_executable_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/bin/process_linux.cc
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index cd9c639b9fa6abdb9bee4784a50faa7c8e3996cd..79957c28ce34934b5c03bd47602c6d0e3631aadd 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -23,9 +23,6 @@
#include "bin/thread.h"
-extern char **environ;
-
-
namespace dart {
namespace bin {
@@ -153,7 +150,7 @@ class ExitCodeHandler {
// Fork to wake up waitpid.
if (TEMP_FAILURE_RETRY(fork()) == 0) {
- exit(0);
+ _exit(0);
}
monitor_->Notify();
@@ -413,7 +410,7 @@ class ProcessStarter {
int bytes_read = FDUtils::ReadFromBlocking(read_in_[0], &msg, sizeof(msg));
if (bytes_read != sizeof(msg)) {
perror("Failed receiving notification message");
- exit(1);
+ _exit(1);
Søren Gjesse 2015/06/10 07:20:25 Good catch!
}
if (mode_ == kNormal) {
ExecProcess();
@@ -442,11 +439,14 @@ class ProcessStarter {
}
if (program_environment_ != NULL) {
- environ = program_environment_;
+ VOID_TEMP_FAILURE_RETRY(
+ execvpe(path_, const_cast<char* const*>(program_arguments_),
+ program_environment_));
+ } else {
+ VOID_TEMP_FAILURE_RETRY(
+ execvp(path_, const_cast<char* const*>(program_arguments_)));
}
- VOID_TEMP_FAILURE_RETRY(
- execvp(path_, const_cast<char* const*>(program_arguments_)));
ReportChildError();
}
@@ -500,12 +500,12 @@ class ProcessStarter {
ReportChildError();
} else {
// Exit the intermeiate process.
Søren Gjesse 2015/06/10 07:20:25 Not you fault, but please change intermeiate -> i
Anders Johnsen 2015/06/10 08:00:45 Done.
- exit(0);
+ _exit(0);
}
}
} else {
// Exit the intermeiate process.
Søren Gjesse 2015/06/10 07:20:25 ditto.
Anders Johnsen 2015/06/10 08:00:45 Done.
- exit(0);
+ _exit(0);
}
}
@@ -535,7 +535,7 @@ class ProcessStarter {
FDUtils::ReadFromBlocking(
exec_control_[0], &child_errno, sizeof(child_errno));
if (bytes_read == sizeof(child_errno)) {
- ReadChildError();
+ ReadChildError(child_errno);
return child_errno;
} else if (bytes_read == -1) {
return errno;
@@ -559,7 +559,7 @@ class ProcessStarter {
} else if (bytes_read == 2 * sizeof(int)) {
*pid = result[0];
child_errno = result[1];
- ReadChildError();
+ ReadChildError(child_errno);
return child_errno;
} else if (bytes_read == -1) {
return errno;
@@ -648,21 +648,12 @@ class ProcessStarter {
void ReportChildError() {
- // In the case of failure in the child process write the errno and
- // the OS error message to the exec control pipe and exit.
+ // In the case of failure in the child process write the errno to the exec
+ // control pipe and exit.
int child_errno = errno;
- const int kBufferSize = 1024;
- char error_buf[kBufferSize];
- char* os_error_message = strerror_r(errno, error_buf, kBufferSize);
- int bytes_written =
- FDUtils::WriteToBlocking(
- exec_control_[1], &child_errno, sizeof(child_errno));
- if (bytes_written == sizeof(child_errno)) {
- FDUtils::WriteToBlocking(
- exec_control_[1], os_error_message, strlen(os_error_message) + 1);
- }
- VOID_TEMP_FAILURE_RETRY(close(exec_control_[1]));
- exit(1);
+ FDUtils::WriteToBlocking(
+ exec_control_[1], &child_errno, sizeof(child_errno));
+ _exit(1);
}
@@ -676,16 +667,16 @@ class ProcessStarter {
}
- void ReadChildError() {
+ void ReadChildError(int child_errno) {
Søren Gjesse 2015/06/10 07:20:25 Please rename this to e.g. SetOSErrorMessage.
Anders Johnsen 2015/06/10 08:00:45 Done.
const int kMaxMessageSize = 256;
- char* message = static_cast<char*>(malloc(kMaxMessageSize));
- if (message != NULL) {
- FDUtils::ReadFromBlocking(exec_control_[0], message, kMaxMessageSize);
- message[kMaxMessageSize - 1] = '\0';
+ char* message = static_cast<char*>(calloc(kMaxMessageSize, 0));
+ char* os_error_message = strerror_r(
+ child_errno, message, kMaxMessageSize - 1);
+ if (message == os_error_message) {
*os_error_message_ = message;
} else {
- // Could not get error message. It will be NULL.
- ASSERT(*os_error_message_ == NULL);
+ free(message);
+ *os_error_message_ = strdup(os_error_message);
}
}
« no previous file with comments | « no previous file | tests/standalone/io/platform_executable_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698