Browse Source

Move compute_num_cpus to lib/thread

Nick Mathewson 5 years ago
parent
commit
6178a9f758
7 changed files with 109 additions and 78 deletions
  1. 0 75
      src/common/compat.c
  2. 0 2
      src/common/compat.h
  3. 3 1
      src/lib/thread/include.am
  4. 93 0
      src/lib/thread/numcpus.c
  5. 11 0
      src/lib/thread/numcpus.h
  6. 1 0
      src/or/config.c
  7. 1 0
      src/test/test_util.c

+ 0 - 75
src/common/compat.c

@@ -354,81 +354,6 @@ get_uname,(void))
  *   Process control
  */
 
-/** Implementation logic for compute_num_cpus(). */
-static int
-compute_num_cpus_impl(void)
-{
-#ifdef _WIN32
-  SYSTEM_INFO info;
-  memset(&info, 0, sizeof(info));
-  GetSystemInfo(&info);
-  if (info.dwNumberOfProcessors >= 1 && info.dwNumberOfProcessors < INT_MAX)
-    return (int)info.dwNumberOfProcessors;
-  else
-    return -1;
-#elif defined(HAVE_SYSCONF)
-#ifdef _SC_NPROCESSORS_CONF
-  long cpus_conf = sysconf(_SC_NPROCESSORS_CONF);
-#else
-  long cpus_conf = -1;
-#endif
-#ifdef _SC_NPROCESSORS_ONLN
-  long cpus_onln = sysconf(_SC_NPROCESSORS_ONLN);
-#else
-  long cpus_onln = -1;
-#endif
-  long cpus = -1;
-
-  if (cpus_conf > 0 && cpus_onln < 0) {
-    cpus = cpus_conf;
-  } else if (cpus_onln > 0 && cpus_conf < 0) {
-    cpus = cpus_onln;
-  } else if (cpus_onln > 0 && cpus_conf > 0) {
-    if (cpus_onln < cpus_conf) {
-      log_notice(LD_GENERAL, "I think we have %ld CPUS, but only %ld of them "
-                 "are available. Telling Tor to only use %ld. You can over"
-                 "ride this with the NumCPUs option",
-                 cpus_conf, cpus_onln, cpus_onln);
-    }
-    cpus = cpus_onln;
-  }
-
-  if (cpus >= 1 && cpus < INT_MAX)
-    return (int)cpus;
-  else
-    return -1;
-#else
-  return -1;
-#endif /* defined(_WIN32) || ... */
-}
-
-#define MAX_DETECTABLE_CPUS 16
-
-/** Return how many CPUs we are running with.  We assume that nobody is
- * using hot-swappable CPUs, so we don't recompute this after the first
- * time.  Return -1 if we don't know how to tell the number of CPUs on this
- * system.
- */
-int
-compute_num_cpus(void)
-{
-  static int num_cpus = -2;
-  if (num_cpus == -2) {
-    num_cpus = compute_num_cpus_impl();
-    tor_assert(num_cpus != -2);
-    if (num_cpus > MAX_DETECTABLE_CPUS) {
-      /* LCOV_EXCL_START */
-      log_notice(LD_GENERAL, "Wow!  I detected that you have %d CPUs. I "
-                 "will not autodetect any more than %d, though.  If you "
-                 "want to configure more, set NumCPUs in your torrc",
-                 num_cpus, MAX_DETECTABLE_CPUS);
-      num_cpus = MAX_DETECTABLE_CPUS;
-      /* LCOV_EXCL_STOP */
-    }
-  }
-  return num_cpus;
-}
-
 #if defined(HW_PHYSMEM64)
 /* This appears to be an OpenBSD thing */
 #define INT64_HW_MEM HW_PHYSMEM64

+ 0 - 2
src/common/compat.h

@@ -133,8 +133,6 @@ typedef unsigned long rlim_t;
 int set_max_file_descriptors(rlim_t limit, int *max);
 MOCK_DECL(int, get_total_system_memory, (size_t *mem_out));
 
-int compute_num_cpus(void);
-
 /** Macros for MIN/MAX.  Never use these when the arguments could have
  * side-effects.
  * {With GCC extensions we could probably define a safer MIN/MAX.  But

+ 3 - 1
src/lib/thread/include.am

@@ -14,6 +14,7 @@ endif
 
 src_lib_libtor_thread_a_SOURCES =			\
 	src/lib/thread/compat_threads.c			\
+	src/lib/thread/numcpus.c			\
 	$(threads_impl_source)
 
 src_lib_libtor_thread_testing_a_SOURCES = \
@@ -22,4 +23,5 @@ src_lib_libtor_thread_testing_a_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_CPPFLAGS)
 src_lib_libtor_thread_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
 
 noinst_HEADERS +=					\
-	src/lib/thread/threads.h
+	src/lib/thread/threads.h			\
+	src/lib/thread/numcpus.h

+ 93 - 0
src/lib/thread/numcpus.c

@@ -0,0 +1,93 @@
+/* Copyright (c) 2003-2004, Roger Dingledine
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2018, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "orconfig.h"
+#include "lib/thread/numcpus.h"
+#include "lib/log/torlog.h"
+#include "lib/log/util_bug.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
+#include <stdlib.h>
+
+/** Implementation logic for compute_num_cpus(). */
+static int
+compute_num_cpus_impl(void)
+{
+#ifdef _WIN32
+  SYSTEM_INFO info;
+  memset(&info, 0, sizeof(info));
+  GetSystemInfo(&info);
+  if (info.dwNumberOfProcessors >= 1 && info.dwNumberOfProcessors < INT_MAX)
+    return (int)info.dwNumberOfProcessors;
+  else
+    return -1;
+#elif defined(HAVE_SYSCONF)
+#ifdef _SC_NPROCESSORS_CONF
+  long cpus_conf = sysconf(_SC_NPROCESSORS_CONF);
+#else
+  long cpus_conf = -1;
+#endif
+#ifdef _SC_NPROCESSORS_ONLN
+  long cpus_onln = sysconf(_SC_NPROCESSORS_ONLN);
+#else
+  long cpus_onln = -1;
+#endif
+  long cpus = -1;
+
+  if (cpus_conf > 0 && cpus_onln < 0) {
+    cpus = cpus_conf;
+  } else if (cpus_onln > 0 && cpus_conf < 0) {
+    cpus = cpus_onln;
+  } else if (cpus_onln > 0 && cpus_conf > 0) {
+    if (cpus_onln < cpus_conf) {
+      log_notice(LD_GENERAL, "I think we have %ld CPUS, but only %ld of them "
+                 "are available. Telling Tor to only use %ld. You can over"
+                 "ride this with the NumCPUs option",
+                 cpus_conf, cpus_onln, cpus_onln);
+    }
+    cpus = cpus_onln;
+  }
+
+  if (cpus >= 1 && cpus < INT_MAX)
+    return (int)cpus;
+  else
+    return -1;
+#else
+  return -1;
+#endif /* defined(_WIN32) || ... */
+}
+
+#define MAX_DETECTABLE_CPUS 16
+
+/** Return how many CPUs we are running with.  We assume that nobody is
+ * using hot-swappable CPUs, so we don't recompute this after the first
+ * time.  Return -1 if we don't know how to tell the number of CPUs on this
+ * system.
+ */
+int
+compute_num_cpus(void)
+{
+  static int num_cpus = -2;
+  if (num_cpus == -2) {
+    num_cpus = compute_num_cpus_impl();
+    tor_assert(num_cpus != -2);
+    if (num_cpus > MAX_DETECTABLE_CPUS) {
+      /* LCOV_EXCL_START */
+      log_notice(LD_GENERAL, "Wow!  I detected that you have %d CPUs. I "
+                 "will not autodetect any more than %d, though.  If you "
+                 "want to configure more, set NumCPUs in your torrc",
+                 num_cpus, MAX_DETECTABLE_CPUS);
+      num_cpus = MAX_DETECTABLE_CPUS;
+      /* LCOV_EXCL_STOP */
+    }
+  }
+  return num_cpus;
+}

+ 11 - 0
src/lib/thread/numcpus.h

@@ -0,0 +1,11 @@
+/* Copyright (c) 2003-2004, Roger Dingledine
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2018, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#ifndef TOR_NUMCPUS_H
+#define TOR_NUMCPUS_H
+
+int compute_num_cpus(void);
+
+#endif

+ 1 - 0
src/or/config.c

@@ -117,6 +117,7 @@
 #include "lib/process/setuid.h"
 #include "lib/process/subprocess.h"
 #include "lib/net/gethostname.h"
+#include "lib/thread/numcpus.h"
 
 #include "lib/encoding/keyval.h"
 #include "lib/fs/conffile.h"

+ 1 - 0
src/test/test_util.c

@@ -28,6 +28,7 @@
 #include "lib/process/pidfile.h"
 #include "lib/process/subprocess.h"
 #include "lib/intmath/weakrng.h"
+#include "lib/thread/numcpus.h"
 
 #ifdef HAVE_PWD_H
 #include <pwd.h>