Index: base/process/launch_posix.cc |
diff --git a/base/process/launch_posix.cc b/base/process/launch_posix.cc |
index 77edc1283191c9a6ad77b9a323cbd9cdf7d00153..99d8e3aa64da8963aa212542bb7871d3a6c642d7 100644 |
--- a/base/process/launch_posix.cc |
+++ b/base/process/launch_posix.cc |
@@ -65,6 +65,8 @@ extern char** environ; |
namespace base { |
+#if !defined(OS_NACL_NONSFI) |
+ |
namespace { |
// Get the process's "environment" (i.e. the thing that setenv/getenv |
@@ -188,55 +190,6 @@ void ResetChildSignalHandlersToDefaults(void) { |
} |
#endif // !defined(OS_LINUX) || |
// (!defined(__i386__) && !defined(__x86_64__) && !defined(__arm__)) |
- |
-#if defined(OS_LINUX) |
-bool IsRunningOnValgrind() { |
- return RUNNING_ON_VALGRIND; |
-} |
- |
-// This function runs on the stack specified on the clone call. It uses longjmp |
-// to switch back to the original stack so the child can return from sys_clone. |
-int CloneHelper(void* arg) { |
- jmp_buf* env_ptr = reinterpret_cast<jmp_buf*>(arg); |
- longjmp(*env_ptr, 1); |
- |
- // Should not be reached. |
- RAW_CHECK(false); |
- return 1; |
-} |
- |
-// This function is noinline to ensure that stack_buf is below the stack pointer |
-// that is saved when setjmp is called below. This is needed because when |
-// compiled with FORTIFY_SOURCE, glibc's longjmp checks that the stack is moved |
-// upwards. See crbug.com/442912 for more details. |
-#if defined(ADDRESS_SANITIZER) |
-// Disable AddressSanitizer instrumentation for this function to make sure |
-// |stack_buf| is allocated on thread stack instead of ASan's fake stack. |
-// Under ASan longjmp() will attempt to clean up the area between the old and |
-// new stack pointers and print a warning that may confuse the user. |
-__attribute__((no_sanitize_address)) |
-#endif |
-NOINLINE pid_t CloneAndLongjmpInChild(unsigned long flags, |
- pid_t* ptid, |
- pid_t* ctid, |
- jmp_buf* env) { |
- // We use the libc clone wrapper instead of making the syscall |
- // directly because making the syscall may fail to update the libc's |
- // internal pid cache. The libc interface unfortunately requires |
- // specifying a new stack, so we use setjmp/longjmp to emulate |
- // fork-like behavior. |
- char stack_buf[PTHREAD_STACK_MIN]; |
-#if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM_FAMILY) || \ |
- defined(ARCH_CPU_MIPS64_FAMILY) || defined(ARCH_CPU_MIPS_FAMILY) |
- // The stack grows downward. |
- void* stack = stack_buf + sizeof(stack_buf); |
-#else |
-#error "Unsupported architecture" |
-#endif |
- return clone(&CloneHelper, stack, flags, env, ptid, nullptr, ctid); |
-} |
-#endif // defined(OS_LINUX) |
- |
} // anonymous namespace |
// Functor for |ScopedDIR| (below). |
@@ -741,7 +694,59 @@ bool GetAppOutputWithExitCode(const CommandLine& cl, |
return result == EXECUTE_SUCCESS; |
} |
-#if defined(OS_LINUX) |
+#endif // !defined(OS_NACL_NONSFI) |
+ |
+#if defined(OS_LINUX) || defined(OS_NACL_NONSFI) |
+namespace { |
+ |
+bool IsRunningOnValgrind() { |
+ return RUNNING_ON_VALGRIND; |
+} |
+ |
+// This function runs on the stack specified on the clone call. It uses longjmp |
+// to switch back to the original stack so the child can return from sys_clone. |
+int CloneHelper(void* arg) { |
+ jmp_buf* env_ptr = reinterpret_cast<jmp_buf*>(arg); |
+ longjmp(*env_ptr, 1); |
+ |
+ // Should not be reached. |
+ RAW_CHECK(false); |
+ return 1; |
+} |
+ |
+// This function is noinline to ensure that stack_buf is below the stack pointer |
+// that is saved when setjmp is called below. This is needed because when |
+// compiled with FORTIFY_SOURCE, glibc's longjmp checks that the stack is moved |
+// upwards. See crbug.com/442912 for more details. |
+#if defined(ADDRESS_SANITIZER) |
+// Disable AddressSanitizer instrumentation for this function to make sure |
+// |stack_buf| is allocated on thread stack instead of ASan's fake stack. |
+// Under ASan longjmp() will attempt to clean up the area between the old and |
+// new stack pointers and print a warning that may confuse the user. |
+__attribute__((no_sanitize_address)) |
+#endif |
+NOINLINE pid_t CloneAndLongjmpInChild(unsigned long flags, |
+ pid_t* ptid, |
+ pid_t* ctid, |
+ jmp_buf* env) { |
+ // We use the libc clone wrapper instead of making the syscall |
+ // directly because making the syscall may fail to update the libc's |
+ // internal pid cache. The libc interface unfortunately requires |
+ // specifying a new stack, so we use setjmp/longjmp to emulate |
+ // fork-like behavior. |
+ char stack_buf[PTHREAD_STACK_MIN]; |
+#if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM_FAMILY) || \ |
+ defined(ARCH_CPU_MIPS64_FAMILY) || defined(ARCH_CPU_MIPS_FAMILY) |
+ // The stack grows downward. |
+ void* stack = stack_buf + sizeof(stack_buf); |
+#else |
+#error "Unsupported architecture" |
+#endif |
+ return clone(&CloneHelper, stack, flags, env, ptid, nullptr, ctid); |
+} |
+ |
+} // anonymous namespace |
+ |
pid_t ForkWithFlags(unsigned long flags, pid_t* ptid, pid_t* ctid) { |
const bool clone_tls_used = flags & CLONE_SETTLS; |
const bool invalid_ctid = |
@@ -780,6 +785,6 @@ pid_t ForkWithFlags(unsigned long flags, pid_t* ptid, pid_t* ctid) { |
return 0; |
} |
-#endif // defined(OS_LINUX) |
+#endif // defined(OS_LINUX) || defined(OS_NACL_NONSFI) |
} // namespace base |