diff options
author | Elliott Hughes <enh@google.com> | 2014-09-04 16:09:25 -0700 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2014-09-04 20:34:03 -0700 |
commit | 5beddb7d642524ecb6655ab2823caf2add679917 (patch) | |
tree | 711cd3603a4a36b27cf330ec6e33a2a17aee9e32 /tests | |
parent | 1e010d60397db706cd3d1c4d5701a2bced441aa8 (diff) | |
download | bionic-5beddb7d642524ecb6655ab2823caf2add679917.zip bionic-5beddb7d642524ecb6655ab2823caf2add679917.tar.gz bionic-5beddb7d642524ecb6655ab2823caf2add679917.tar.bz2 |
Fix pthread_attr_getstack__main_thread.
There were two problems here:
* This would fail when run with unlimited stack, because it didn't know
that bionic reports unlimited stacks as 8MiB.
* This would leave RLIMIT_STACK small, causing failures to exec (so the
popen and system tests would fail).
(cherry-pick of 27a9aed81978af792cb06035a1619c8141a5fb5b plus the
new ScopeGuard.h from a3ad450a2e3fb6b3fe359683b247eba20896f646.)
Bug: 17394276
Change-Id: I5b92dc64ca089400223b2d9a3743e9b9d57c1bc2
Diffstat (limited to 'tests')
-rw-r--r-- | tests/pthread_test.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/tests/pthread_test.cpp b/tests/pthread_test.cpp index 6557738..4a7c6bd 100644 --- a/tests/pthread_test.cpp +++ b/tests/pthread_test.cpp @@ -27,6 +27,7 @@ #include <time.h> #include <unistd.h> +#include "private/ScopeGuard.h" #include "ScopedSignalHandler.h" TEST(pthread, pthread_key_create) { @@ -860,8 +861,19 @@ TEST(pthread, pthread_attr_getstack__main_thread) { // The stack size should correspond to RLIMIT_STACK. rlimit rl; ASSERT_EQ(0, getrlimit(RLIMIT_STACK, &rl)); + uint64_t original_rlim_cur = rl.rlim_cur; +#if defined(__BIONIC__) + if (rl.rlim_cur == RLIM_INFINITY) { + rl.rlim_cur = 8 * 1024 * 1024; // Bionic reports unlimited stacks as 8MiB. + } +#endif EXPECT_EQ(rl.rlim_cur, stack_size); + auto guard = create_scope_guard([&rl, original_rlim_cur]() { + rl.rlim_cur = original_rlim_cur; + ASSERT_EQ(0, setrlimit(RLIMIT_STACK, &rl)); + }); + // The high address of the /proc/self/maps [stack] region should equal stack_base + stack_size. // Remember that the stack grows down (and is mapped in on demand), so the low address of the // region isn't very interesting. |