aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Vakulenko <avakulenko@google.com>2016-07-11 17:26:35 -0700
committerAlex Vakulenko <avakulenko@google.com>2016-08-23 21:26:37 +0000
commit766275e7f697c30164678e1fed55b2a2fcbf8546 (patch)
tree2a751cd67b4e9c6ab83fdce7bb8799aa0ae4bd0b
parent8bbcc61b54cf8ce95c4bbae7db7883442b7d1fd9 (diff)
downloadbionic-766275e7f697c30164678e1fed55b2a2fcbf8546.tar.gz
Fix pty.bug_28979140 test in Bionic
The test relies on the fact/assumes that CPU 0 is available to the test process. This is not necessarily the case. Instead of allocating CPU 0 to the main thread, find the first available CPU and use that instead. BUG=b/29991929 TEST=All Bionic unit tests pass Change-Id: I36b311cdba57112d663d652757fd5114183fc780
-rw-r--r--tests/pty_test.cpp35
1 files changed, 23 insertions, 12 deletions
diff --git a/tests/pty_test.cpp b/tests/pty_test.cpp
index a3714341b..74415d539 100644
--- a/tests/pty_test.cpp
+++ b/tests/pty_test.cpp
@@ -72,17 +72,18 @@ TEST(pty, forkpty) {
}
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 @@ static void PtyReader_28979140(PtyReader_28979140_Arg* arg) {
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 @@ TEST(pty, bug_28979140) {
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 @@ TEST(pty, bug_28979140) {
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.