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

Unified Diff: base/process_util_posix.cc

Issue 173141: Switch to using vfork() instead of fork() when we can. (Closed)
Patch Set: Created 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/process_util_posix.cc
diff --git a/base/process_util_posix.cc b/base/process_util_posix.cc
index ecb49371e3de32a942706f198c74760ecf8b05ad..d81776f189499cd4ddabe58779be5b87f0838dce 100644
--- a/base/process_util_posix.cc
+++ b/base/process_util_posix.cc
@@ -224,25 +224,40 @@ bool LaunchApp(const std::vector<std::string>& argv,
const environment_vector& environ,
const file_handle_mapping_vector& fds_to_remap,
bool wait, ProcessHandle* process_handle) {
- pid_t pid = fork();
+ // We call vfork() for additional performance (avoids touching the page
+ // tables). This makes things a bit more dangerous since the child and
+ // parent share the same address space and stack. Try to do most of our
+ // operations before the fork, and hope that everything we do have to do
+ // will be ok...
+ bool use_vfork = (environ.size() == 0);
agl 2009/08/20 20:35:16 const
agl 2009/08/20 20:35:16 Comment about why we can't modify the environment
+
+ InjectiveMultimap fd_shuffle;
+ for (file_handle_mapping_vector::const_iterator
+ it = fds_to_remap.begin(); it != fds_to_remap.end(); ++it) {
+ fd_shuffle.push_back(InjectionArc(it->first, it->second, false));
+ }
+
+ scoped_array<char*> argv_cstr(new char*[argv.size() + 1]);
+ for (size_t i = 0; i < argv.size(); i++)
+ argv_cstr[i] = const_cast<char*>(argv[i].c_str());
+ argv_cstr[argv.size()] = NULL;
+
+ pid_t pid = use_vfork ? vfork() : fork();
if (pid < 0)
return false;
if (pid == 0) {
// Child process
- InjectiveMultimap fd_shuffle;
- for (file_handle_mapping_vector::const_iterator
- it = fds_to_remap.begin(); it != fds_to_remap.end(); ++it) {
- fd_shuffle.push_back(InjectionArc(it->first, it->second, false));
- }
- for (environment_vector::const_iterator it = environ.begin();
- it != environ.end(); ++it) {
- if (it->first) {
- if (it->second) {
- setenv(it->first, it->second, 1);
- } else {
- unsetenv(it->first);
+ if (!use_vfork) {
+ for (environment_vector::const_iterator it = environ.begin();
+ it != environ.end(); ++it) {
+ if (it->first) {
+ if (it->second) {
+ setenv(it->first, it->second, 1);
+ } else {
+ unsetenv(it->first);
+ }
}
}
}
@@ -255,17 +270,8 @@ bool LaunchApp(const std::vector<std::string>& argv,
if (!ShuffleFileDescriptors(fd_shuffle))
_exit(127);
- // If we are using the SUID sandbox, it sets a magic environment variable
- // ("SBX_D"), so we remove that variable from the environment here on the
- // off chance that it's already set.
- unsetenv("SBX_D");
-
CloseSuperfluousFds(fd_shuffle);
- scoped_array<char*> argv_cstr(new char*[argv.size() + 1]);
- for (size_t i = 0; i < argv.size(); i++)
- argv_cstr[i] = const_cast<char*>(argv[i].c_str());
- argv_cstr[argv.size()] = NULL;
execvp(argv_cstr[0], argv_cstr.get());
LOG(ERROR) << "LaunchApp: exec failed!, argv_cstr[0] " << argv_cstr[0]
<< ", errno " << errno;
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698