Implement function to determine how many cores are available.
authorBrian Aker <brian@tangent.org>
Sun, 4 Mar 2012 10:47:47 +0000 (02:47 -0800)
committerBrian Aker <brian@tangent.org>
Sun, 4 Mar 2012 10:47:47 +0000 (02:47 -0800)
libtest/cpu.cc [new file with mode: 0644]
libtest/cpu.hpp [new file with mode: 0644]
libtest/include.am
libtest/test.hpp
libtest/unittest.cc

diff --git a/libtest/cpu.cc b/libtest/cpu.cc
new file mode 100644 (file)
index 0000000..203796b
--- /dev/null
@@ -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 <libtest/common.h>
+
+#include <unistd.h>
+
+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 (file)
index 0000000..78dabc3
--- /dev/null
@@ -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
index 257b1f7f587f08d3eb28a2e00f0a334f8be86583..76392eca803336dfc76a9a4b336f3a3de841a381 100644 (file)
@@ -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 \
index eae8ca347925ded6fa2944bc94ed69b38d7e0160..c0d9193806320f017dcda8171998ce80cedbd601 100644 (file)
@@ -59,3 +59,4 @@
 #include <libtest/string.hpp>
 #include <libtest/binaries.h>
 #include <libtest/http.hpp>
+#include <libtest/cpu.hpp>
index 95ab7ce1b632fc0391ce20078fad370d4a009cc5..33309a7c1fc216f18a37411901efde3b67d68654 100644 (file)
@@ -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}
 };