Merge "Fix pty.bug_28979140 test in Bionic" into nyc-mr1-dev
diff --git a/tests/pty_test.cpp b/tests/pty_test.cpp
index a371434..74415d5 100644
--- a/tests/pty_test.cpp
+++ b/tests/pty_test.cpp
@@ -72,17 +72,18 @@
 }
 
 struct PtyReader_28979140_Arg {
- int slave_fd;
- uint32_t data_count;
- bool finished;
- std::atomic<bool> matched;
+  int main_cpu_id;
+  int slave_fd;
+  uint32_t data_count;
+  bool finished;
+  std::atomic<bool> matched;
 };
 
 static void PtyReader_28979140(PtyReader_28979140_Arg* arg) {
   arg->finished = false;
   cpu_set_t cpus;
   ASSERT_EQ(0, sched_getaffinity(0, sizeof(cpu_set_t), &cpus));
-  CPU_CLR(0, &cpus);
+  CPU_CLR(arg->main_cpu_id, &cpus);
   ASSERT_EQ(0, sched_setaffinity(0, sizeof(cpu_set_t), &cpus));
 
   uint32_t counter = 0;
@@ -105,7 +106,9 @@
 TEST(pty, bug_28979140) {
   // This test is to test a kernel bug, which uses a lock free ring-buffer to
   // pass data through a raw pty, but missing necessary memory barriers.
-  if (sysconf(_SC_NPROCESSORS_ONLN) == 1) {
+  cpu_set_t cpus;
+  ASSERT_EQ(0, sched_getaffinity(0, sizeof(cpu_set_t), &cpus));
+  if (CPU_COUNT(&cpus) < 2) {
     GTEST_LOG_(INFO) << "This test tests bug happens only on multiprocessors.";
     return;
   }
@@ -120,9 +123,20 @@
   cfmakeraw(&tattr);
   ASSERT_EQ(0, tcsetattr(slave, TCSADRAIN, &tattr));
 
-  // 2. Create thread for slave reader.
-  pthread_t thread;
+  // 2. Make master thread and slave thread running on different cpus:
+  // master thread uses first available cpu, and slave thread uses other cpus.
   PtyReader_28979140_Arg arg;
+  arg.main_cpu_id = -1;
+  for (int i = 0; i < CPU_SETSIZE; i++) {
+    if (CPU_ISSET(i, &cpus)) {
+      arg.main_cpu_id = i;
+      break;
+    }
+  }
+  ASSERT_GE(arg.main_cpu_id, 0);
+
+  // 3. Create thread for slave reader.
+  pthread_t thread;
   arg.slave_fd = slave;
   arg.data_count = TEST_DATA_COUNT;
   arg.matched = true;
@@ -130,11 +144,8 @@
                               reinterpret_cast<void*(*)(void*)>(PtyReader_28979140),
                               &arg));
 
-  // 3. Make master thread and slave thread running on different cpus:
-  // master thread uses cpu 0, and slave thread uses other cpus.
-  cpu_set_t cpus;
   CPU_ZERO(&cpus);
-  CPU_SET(0, &cpus);
+  CPU_SET(arg.main_cpu_id, &cpus);
   ASSERT_EQ(0, sched_setaffinity(0, sizeof(cpu_set_t), &cpus));
 
   // 4. Send data to slave.