Fix the way to count online cpus.
Read /proc/stat to count online cpus is not correct for all android
kernels. Change to reading /sys/devices/system/cpu/online instead.
Bug: 24376925
Change-Id: I3785a6c7aa15a467022a9a261b457194d688fb38
diff --git a/tests/unistd_test.cpp b/tests/unistd_test.cpp
index 8e1f412..500377c 100644
--- a/tests/unistd_test.cpp
+++ b/tests/unistd_test.cpp
@@ -30,6 +30,11 @@
#include <sys/wait.h>
#include <unistd.h>
+#include <base/file.h>
+#include <base/strings.h>
+
+#include "private/get_cpu_count_from_string.h"
+
static void* get_brk() {
return sbrk(0);
}
@@ -819,6 +824,29 @@
#endif // defined(__BIONIC__)
}
+TEST(unistd, get_cpu_count_from_string) {
+ ASSERT_EQ(0, GetCpuCountFromString(" "));
+ ASSERT_EQ(1, GetCpuCountFromString("0"));
+ ASSERT_EQ(40, GetCpuCountFromString("0-39"));
+ ASSERT_EQ(4, GetCpuCountFromString("0, 1-2, 4\n"));
+}
+
+TEST(unistd, sysconf_SC_NPROCESSORS_ONLN) {
+ std::string s;
+ ASSERT_TRUE(android::base::ReadFileToString("/sys/devices/system/cpu/online", &s));
+ std::vector<std::string> strs = android::base::Split(s, ",");
+ long online_cpus = 0;
+ for (auto& s : strs) {
+ std::vector<std::string> numbers = android::base::Split(s, "-");
+ if (numbers.size() == 1u) {
+ online_cpus++;
+ } else {
+ online_cpus += atoi(numbers[1].c_str()) - atoi(numbers[0].c_str()) + 1;
+ }
+ }
+ ASSERT_EQ(online_cpus, sysconf(_SC_NPROCESSORS_ONLN));
+}
+
TEST(unistd, dup2_same) {
// POSIX says of dup2:
// If fildes2 is already a valid open file descriptor ...