Index: base/process_util_posix.cc |
diff --git a/base/process_util_posix.cc b/base/process_util_posix.cc |
index a6e816af4484eeeb545cded16f9e4dd25533a62b..37c64aeca22c2dfd803302ca3b387cd296eaa8b0 100644 |
--- a/base/process_util_posix.cc |
+++ b/base/process_util_posix.cc |
@@ -33,6 +33,13 @@ |
#include "base/threading/platform_thread.h" |
#include "base/threading/thread_restrictions.h" |
+// TODO(dmikurube): Consider always calling {Suspend|Resume}AllocatedType..., |
+// and make them empty functions when !USE_ALLOCATED_TYPE. |
+// This is a temporary comment which should be removed when landing. |
+#ifdef USE_ALLOCATED_TYPE |
+#include "base/allocator/allocated_type_tcmalloc.h" |
+#endif |
+ |
#if defined(OS_CHROMEOS) |
#include <sys/ioctl.h> |
#endif |
@@ -641,6 +648,9 @@ bool LaunchProcess(const std::vector<std::string>& argv, |
} |
if (options.maximize_rlimits) { |
+#ifdef USE_ALLOCATED_TYPE |
+ SuspendAllocatedTypeIntercept(); |
+#endif |
// Some resource limits need to be maximal in this child. |
std::set<int>::const_iterator resource; |
for (resource = options.maximize_rlimits->begin(); |
@@ -656,6 +666,9 @@ bool LaunchProcess(const std::vector<std::string>& argv, |
} |
} |
} |
+#ifdef USE_ALLOCATED_TYPE |
+ ResumeAllocatedTypeIntercept(); |
+#endif |
} |
#if defined(OS_MACOSX) |
@@ -698,32 +711,54 @@ bool LaunchProcess(const std::vector<std::string>& argv, |
#endif // defined(OS_CHROMEOS) |
if (options.fds_to_remap) { |
+#ifdef USE_ALLOCATED_TYPE |
+ SuspendAllocatedTypeIntercept(); |
+#endif |
for (FileHandleMappingVector::const_iterator |
it = options.fds_to_remap->begin(); |
it != options.fds_to_remap->end(); ++it) { |
fd_shuffle1.push_back(InjectionArc(it->first, it->second, false)); |
fd_shuffle2.push_back(InjectionArc(it->first, it->second, false)); |
} |
+#ifdef USE_ALLOCATED_TYPE |
+ ResumeAllocatedTypeIntercept(); |
+#endif |
} |
#if defined(OS_MACOSX) |
if (options.synchronize) { |
+#ifdef USE_ALLOCATED_TYPE |
+ SuspendAllocatedTypeIntercept(); |
+#endif |
// Remap the read side of the synchronization pipe back onto itself, |
// ensuring that it won't be closed by CloseSuperfluousFds. |
int keep_fd = *synchronization_read_fd.get(); |
fd_shuffle1.push_back(InjectionArc(keep_fd, keep_fd, false)); |
fd_shuffle2.push_back(InjectionArc(keep_fd, keep_fd, false)); |
+#ifdef USE_ALLOCATED_TYPE |
+ ResumeAllocatedTypeIntercept(); |
+#endif |
} |
#endif // defined(OS_MACOSX) |
if (options.environ) |
SetEnvironment(new_environ.get()); |
+#ifdef USE_ALLOCATED_TYPE |
+ SuspendAllocatedTypeIntercept(); |
+#endif |
// fd_shuffle1 is mutated by this call because it cannot malloc. |
- if (!ShuffleFileDescriptors(&fd_shuffle1)) |
+ if (!ShuffleFileDescriptors(&fd_shuffle1)) { |
+#ifdef USE_ALLOCATED_TYPE |
+ ResumeAllocatedTypeIntercept(); |
+#endif |
_exit(127); |
+ } |
CloseSuperfluousFds(fd_shuffle2); |
+#ifdef USE_ALLOCATED_TYPE |
+ ResumeAllocatedTypeIntercept(); |
+#endif |
#if defined(OS_MACOSX) |
if (options.synchronize) { |
@@ -743,9 +778,17 @@ bool LaunchProcess(const std::vector<std::string>& argv, |
} |
#endif // defined(OS_MACOSX) |
+#ifdef USE_ALLOCATED_TYPE |
+ SuspendAllocatedTypeIntercept(); |
+#endif |
for (size_t i = 0; i < argv.size(); i++) |
argv_cstr[i] = const_cast<char*>(argv[i].c_str()); |
argv_cstr[argv.size()] = NULL; |
+#ifdef USE_ALLOCATED_TYPE |
+ // TODO(dmikurube): Consider removing it. It's just befor exec. |
+ // This is a temporary comment which should be removed when landing. |
+ ResumeAllocatedTypeIntercept(); |
+#endif |
execvp(argv_cstr[0], argv_cstr.get()); |
RAW_LOG(ERROR, "LaunchProcess: failed to execvp:"); |
@@ -1108,6 +1151,9 @@ static GetAppOutputInternalResult GetAppOutputInternal( |
if (dev_null < 0) |
_exit(127); |
+#ifdef USE_ALLOCATED_TYPE |
+ SuspendAllocatedTypeIntercept(); |
+#endif |
fd_shuffle1.push_back(InjectionArc(pipe_fd[1], STDOUT_FILENO, true)); |
fd_shuffle1.push_back(InjectionArc(dev_null, STDERR_FILENO, true)); |
fd_shuffle1.push_back(InjectionArc(dev_null, STDIN_FILENO, true)); |
@@ -1117,14 +1163,23 @@ static GetAppOutputInternalResult GetAppOutputInternal( |
std::copy(fd_shuffle1.begin(), fd_shuffle1.end(), |
std::back_inserter(fd_shuffle2)); |
- if (!ShuffleFileDescriptors(&fd_shuffle1)) |
+ if (!ShuffleFileDescriptors(&fd_shuffle1)) { |
+#ifdef USE_ALLOCATED_TYPE |
+ ResumeAllocatedTypeIntercept(); |
+#endif |
_exit(127); |
+ } |
CloseSuperfluousFds(fd_shuffle2); |
for (size_t i = 0; i < argv.size(); i++) |
argv_cstr[i] = const_cast<char*>(argv[i].c_str()); |
argv_cstr[argv.size()] = NULL; |
+#ifdef USE_ALLOCATED_TYPE |
+ // TODO(dmikurube): Consider removing it. It's just befor exec. |
+ // This is a temporary comment which should be removed when landing. |
+ ResumeAllocatedTypeIntercept(); |
+#endif |
if (do_search_path) |
execvp(argv_cstr[0], argv_cstr.get()); |
else |