am 3d00f79f
: Merge "Increase alternative signal stack size on 64-bit devices."
* commit '3d00f79f98c8b981a36a79657f07a303a2288a55': Increase alternative signal stack size on 64-bit devices.
This commit is contained in:
commit
042a61de21
3 changed files with 31 additions and 2 deletions
|
@ -130,8 +130,13 @@ __LIBC_HIDDEN__ void pthread_key_clean_all(void);
|
|||
*/
|
||||
#define PTHREAD_STACK_SIZE_DEFAULT ((1 * 1024 * 1024) - SIGSTKSZ)
|
||||
|
||||
/* Leave room for a guard page in the internally created signal stacks. */
|
||||
// Leave room for a guard page in the internally created signal stacks.
|
||||
#if defined(__LP64__)
|
||||
// SIGSTKSZ is not big enough for 64-bit arch. See http://b/23041777.
|
||||
#define SIGNAL_STACK_SIZE (16 * 1024 + PAGE_SIZE)
|
||||
#else
|
||||
#define SIGNAL_STACK_SIZE (SIGSTKSZ + PAGE_SIZE)
|
||||
#endif
|
||||
|
||||
/* Needed by fork. */
|
||||
__LIBC_HIDDEN__ extern void __bionic_atfork_run_prepare();
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include <sys/syscall.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <unwind.h>
|
||||
|
||||
#include <atomic>
|
||||
#include <regex>
|
||||
|
@ -1632,3 +1633,26 @@ TEST_F(pthread_DeathTest, pthread_mutex_unlock_null_64) {
|
|||
GTEST_LOG_(INFO) << "This test tests bionic implementation details on 64 bit devices.";
|
||||
#endif
|
||||
}
|
||||
|
||||
extern _Unwind_Reason_Code FrameCounter(_Unwind_Context* ctx, void* arg);
|
||||
|
||||
static volatile bool signal_handler_on_altstack_done;
|
||||
|
||||
static void SignalHandlerOnAltStack(int signo, siginfo_t*, void*) {
|
||||
ASSERT_EQ(SIGUSR1, signo);
|
||||
// Check if we have enough stack space for unwinding.
|
||||
int count = 0;
|
||||
_Unwind_Backtrace(FrameCounter, &count);
|
||||
ASSERT_GT(count, 0);
|
||||
// Check if we have enough stack space for logging.
|
||||
std::string s(2048, '*');
|
||||
GTEST_LOG_(INFO) << s;
|
||||
signal_handler_on_altstack_done = true;
|
||||
}
|
||||
|
||||
TEST(pthread, big_enough_signal_stack_for_64bit_arch) {
|
||||
signal_handler_on_altstack_done = false;
|
||||
ScopedSignalHandler handler(SIGUSR1, SignalHandlerOnAltStack, SA_SIGINFO | SA_ONSTACK);
|
||||
kill(getpid(), SIGUSR1);
|
||||
ASSERT_TRUE(signal_handler_on_altstack_done);
|
||||
}
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
#define noinline __attribute__((__noinline__))
|
||||
#define __unused __attribute__((__unused__))
|
||||
|
||||
static _Unwind_Reason_Code FrameCounter(_Unwind_Context* ctx __unused, void* arg) {
|
||||
_Unwind_Reason_Code FrameCounter(_Unwind_Context* ctx __unused, void* arg) {
|
||||
int* count_ptr = reinterpret_cast<int*>(arg);
|
||||
|
||||
#if SHOW_FRAME_LOCATIONS
|
||||
|
|
Loading…
Reference in a new issue