summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2014-09-04 16:09:25 -0700
committerElliott Hughes <enh@google.com>2014-09-04 20:34:03 -0700
commit5beddb7d642524ecb6655ab2823caf2add679917 (patch)
tree711cd3603a4a36b27cf330ec6e33a2a17aee9e32 /tests
parent1e010d60397db706cd3d1c4d5701a2bced441aa8 (diff)
downloadbionic-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.cpp12
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.