summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
authorpliard@chromium.org <pliard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-27 13:44:52 +0000
committerpliard@chromium.org <pliard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-27 13:44:52 +0000
commit5c6aa5046ec9a100b27b33013418f122461d21e5 (patch)
treedccf8c7a1a97fa675209bd949ef6b909f7f76210 /base
parent947e96a18fdffe3dd74d9858760d8910e08a617a (diff)
downloadchromium_src-5c6aa5046ec9a100b27b33013418f122461d21e5.zip
chromium_src-5c6aa5046ec9a100b27b33013418f122461d21e5.tar.gz
chromium_src-5c6aa5046ec9a100b27b33013418f122461d21e5.tar.bz2
Fix ProcessUtilTest.FDRemapping on Android.
This provides a simple implementation of file descriptors remapping on Android. BUG=136720 Review URL: https://chromiumcodereview.appspot.com/11417115 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@169652 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base')
-rw-r--r--base/test/multiprocess_test_android.cc42
1 files changed, 33 insertions, 9 deletions
diff --git a/base/test/multiprocess_test_android.cc b/base/test/multiprocess_test_android.cc
index cc45d06..a61441f 100644
--- a/base/test/multiprocess_test_android.cc
+++ b/base/test/multiprocess_test_android.cc
@@ -6,7 +6,9 @@
#include <unistd.h>
+#include "base/hash_tables.h"
#include "base/logging.h"
+#include "base/posix/eintr_wrapper.h"
#include "base/process.h"
#include "testing/multiprocess_func_list.h"
@@ -15,24 +17,46 @@ namespace base {
// A very basic implementation for android. On Android tests can run in an APK
// and we don't have an executable to exec*. This implementation does the bare
// minimum to execute the method specified by procname (in the child process).
-// - File descriptors are not closed and hence |fds_to_map| is ignored.
// - |debug_on_start| is ignored.
ProcessHandle MultiProcessTest::SpawnChildImpl(
const std::string& procname,
- const FileHandleMappingVector& fds_to_map,
+ const FileHandleMappingVector& fds_to_remap,
bool debug_on_start) {
pid_t pid = fork();
if (pid < 0) {
- DPLOG(ERROR) << "fork";
+ PLOG(ERROR) << "fork";
return kNullProcessHandle;
- } else if (pid == 0) {
- // Child process.
- _exit(multi_process_function_list::InvokeChildProcessTest(procname));
}
-
- // Parent process.
- return pid;
+ if (pid > 0) {
+ // Parent process.
+ return pid;
+ }
+ // Child process.
+ std::hash_set<int> fds_to_keep_open;
+ for (FileHandleMappingVector::const_iterator it = fds_to_remap.begin();
+ it != fds_to_remap.end(); ++it) {
+ fds_to_keep_open.insert(it->first);
+ }
+ // Keep stdin, stdout and stderr open since this is not meant to spawn a
+ // daemon.
+ const int kFdForAndroidLogging = 3; // FD used by __android_log_write().
+ for (int fd = kFdForAndroidLogging + 1; fd < getdtablesize(); ++fd) {
+ if (fds_to_keep_open.find(fd) == fds_to_keep_open.end()) {
+ HANDLE_EINTR(close(fd));
+ }
+ }
+ for (FileHandleMappingVector::const_iterator it = fds_to_remap.begin();
+ it != fds_to_remap.end(); ++it) {
+ int old_fd = it->first;
+ int new_fd = it->second;
+ if (dup2(old_fd, new_fd) < 0) {
+ PLOG(FATAL) << "dup2";
+ }
+ HANDLE_EINTR(close(old_fd));
+ }
+ _exit(multi_process_function_list::InvokeChildProcessTest(procname));
+ return 0;
}
} // namespace base