OSDN Git Service

Adjust test to let it pass on libhoudini.
authorYabin Cui <yabinc@google.com>
Tue, 8 Mar 2016 01:44:58 +0000 (17:44 -0800)
committerElliott Hughes <enh@google.com>
Thu, 24 Mar 2016 23:28:21 +0000 (16:28 -0700)
When using libhoudini to run arm code on x86 platforms, we can't
assume the main thread allocates local variables at the stack
declared by kernel.

(cherry picked from commit 61e4d461e5c1c5108fdfe2a9f1edec6717e7461e)

Bug: http://b/27815309
Change-Id: Ic714a8e633a0bb6e85b38ee0e01e3439d0a0cea5

tests/pthread_test.cpp

index d11ea3f..aab78ad 100755 (executable)
@@ -1347,6 +1347,9 @@ static void getstack_signal_handler(int sig) {
 // the wrong map with [stack]. This test verifies that when the above situation happens, the main
 // thread's stack is found correctly.
 TEST(pthread, pthread_attr_getstack_in_signal_handler) {
+  // This test is only meaningful for the main thread, so make sure we're running on it!
+  ASSERT_EQ(getpid(), syscall(__NR_gettid));
+
   const size_t sig_stack_size = 16 * 1024;
   void* sig_stack = mmap(NULL, sig_stack_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS,
                          -1, 0);
@@ -1358,6 +1361,12 @@ TEST(pthread, pthread_attr_getstack_in_signal_handler) {
   stack_t oss;
   ASSERT_EQ(0, sigaltstack(&ss, &oss));
 
+  pthread_attr_t attr;
+  ASSERT_EQ(0, pthread_getattr_np(pthread_self(), &attr));
+  void* main_stack_base;
+  size_t main_stack_size;
+  ASSERT_EQ(0, pthread_attr_getstack(&attr, &main_stack_base, &main_stack_size));
+
   ScopedSignalHandler handler(SIGUSR1, getstack_signal_handler, SA_ONSTACK);
   getstack_signal_handler_arg.done = false;
   kill(getpid(), SIGUSR1);
@@ -1369,9 +1378,8 @@ TEST(pthread, pthread_attr_getstack_in_signal_handler) {
             getstack_signal_handler_arg.signal_handler_sp);
 
   // Verify if the main thread's stack got in the signal handler is correct.
-  ASSERT_LE(getstack_signal_handler_arg.main_stack_base, &ss);
-  ASSERT_GE(reinterpret_cast<char*>(getstack_signal_handler_arg.main_stack_base) +
-            getstack_signal_handler_arg.main_stack_size, reinterpret_cast<void*>(&ss));
+  ASSERT_EQ(main_stack_base, getstack_signal_handler_arg.main_stack_base);
+  ASSERT_LE(main_stack_size, getstack_signal_handler_arg.main_stack_size);
 
   ASSERT_EQ(0, sigaltstack(&oss, nullptr));
   ASSERT_EQ(0, munmap(sig_stack, sig_stack_size));