From 8cc058d16abc8b75b675173c6c416c5ac7a30849 Mon Sep 17 00:00:00 2001 From: Brian Aker Date: Sun, 4 Mar 2012 02:47:47 -0800 Subject: [PATCH] Implement function to determine how many cores are available. --- libtest/cpu.cc | 59 +++++++++++++++++++++++++++++++++++++++++++++ libtest/cpu.hpp | 28 +++++++++++++++++++++ libtest/include.am | 2 ++ libtest/test.hpp | 1 + libtest/unittest.cc | 13 ++++++++++ 5 files changed, 103 insertions(+) create mode 100644 libtest/cpu.cc create mode 100644 libtest/cpu.hpp diff --git a/libtest/cpu.cc b/libtest/cpu.cc new file mode 100644 index 00000000..203796bc --- /dev/null +++ b/libtest/cpu.cc @@ -0,0 +1,59 @@ +/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: + * + * libtest + * + * Copyright (C) 2012 Data Differential, http://datadifferential.com/ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include + +namespace libtest { + +size_t number_of_cpus() +{ + size_t number_of_cpu= 1; +#ifdef TARGET_OS_LINUX + number_of_cpu= sysconf(_SC_NPROCESSORS_ONLN); +#elif TARGET_OS_OSX || TARGET_OS_FREEBSD + int mib[4]; + size_t len= sizeof(number_of_cpu); + + /* set the mib for hw.ncpu */ + mib[0] = CTL_HW; + mib[1] = HW_AVAILCPU; // alternatively, try HW_NCPU; + + /* get the number of CPUs from the system */ + sysctl(mib, 2, &number_of_cpu, &len, NULL, 0); + + if (number_of_cpu < 1) + { + mib[1]= HW_NCPU; + sysctl(mib, 2, &number_of_cpu, &len, NULL, 0 ); + + if (number_of_cpu < 1 ) + { + number_of_cpu = 1; + } + } +#endif + + return number_of_cpu; +} + +} // namespace libtest diff --git a/libtest/cpu.hpp b/libtest/cpu.hpp new file mode 100644 index 00000000..78dabc30 --- /dev/null +++ b/libtest/cpu.hpp @@ -0,0 +1,28 @@ +/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: + * + * libtest + * + * Copyright (C) 2012 Data Differential, http://datadifferential.com/ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#pragma once + +namespace libtest { + +size_t number_of_cpus(); + +} // namespace libtest diff --git a/libtest/include.am b/libtest/include.am index 257b1f7f..76392eca 100644 --- a/libtest/include.am +++ b/libtest/include.am @@ -57,6 +57,7 @@ distclean-libtest-check: noinst_HEADERS+= \ libtest/binaries.h \ + libtest/cpu.hpp \ libtest/blobslap_worker.h \ libtest/callbacks.h \ libtest/cmdline.h \ @@ -99,6 +100,7 @@ libtest_libtest_la_SOURCES= \ libtest/binaries.cc \ libtest/cmdline.cc \ libtest/core.cc \ + libtest/cpu.cc \ libtest/dream.cc \ libtest/fatal.cc \ libtest/framework.cc \ diff --git a/libtest/test.hpp b/libtest/test.hpp index eae8ca34..c0d91938 100644 --- a/libtest/test.hpp +++ b/libtest/test.hpp @@ -59,3 +59,4 @@ #include #include #include +#include diff --git a/libtest/unittest.cc b/libtest/unittest.cc index 95ab7ce1..33309a7c 100644 --- a/libtest/unittest.cc +++ b/libtest/unittest.cc @@ -534,6 +534,13 @@ static test_return_t fatal_TEST(void *) return TEST_SUCCESS; } +static test_return_t number_of_cpus_TEST(void *) +{ + test_true(number_of_cpus() >= 1); + + return TEST_SUCCESS; +} + static test_return_t fatal_message_TEST(void *) { test_compare(fatal_calls++, fatal::disabled_counter()); @@ -648,6 +655,11 @@ test_st fatal_message_TESTS[] ={ {0, 0, 0} }; +test_st number_of_cpus_TESTS[] ={ + {"libtest::number_of_cpus()", 0, number_of_cpus_TEST }, + {0, 0, 0} +}; + test_st application_tests[] ={ {"vchar_t", 0, vchar_t_TEST }, {"true", 0, application_true_BINARY }, @@ -697,6 +709,7 @@ collection_st collection[] ={ {"http", check_for_curl, 0, http_tests}, {"get_free_port()", 0, 0, get_free_port_TESTS }, {"fatal", disable_fatal_exception, enable_fatal_exception, fatal_message_TESTS }, + {"number_of_cpus()", 0, 0, number_of_cpus_TESTS }, {0, 0, 0, 0} }; -- 2.30.2