Browse Source

Add ProcessorCount support for QNX via pidin. (#11302)

Thanks to Rolf Eike Beer <[email protected]> for the code snippet
parsing the pidin output.
David Cole 15 years ago
parent
commit
3430955d5f
2 changed files with 27 additions and 3 deletions
  1. 22 2
      Modules/ProcessorCount.cmake
  2. 5 1
      Tests/CMakeTests/ProcessorCountTest.cmake.in

+ 22 - 2
Modules/ProcessorCount.cmake

@@ -42,7 +42,7 @@ function(ProcessorCount var)
       message("ProcessorCount: using sysctl '${ProcessorCount_cmd_sysctl}'")
     endif()
   else()
-    # Linux (and other systems with getconf):
+    # Linux (systems with getconf):
     find_program(ProcessorCount_cmd_getconf getconf)
     if(ProcessorCount_cmd_getconf)
       execute_process(COMMAND ${ProcessorCount_cmd_getconf} _NPROCESSORS_ONLN
@@ -50,9 +50,22 @@ function(ProcessorCount var)
         OUTPUT_VARIABLE count)
       message("ProcessorCount: using getconf '${ProcessorCount_cmd_getconf}'")
     endif()
+
+    if(NOT count)
+      # QNX (systems with pidin):
+      find_program(ProcessorCount_cmd_pidin pidin)
+      if(ProcessorCount_cmd_pidin)
+        execute_process(COMMAND ${ProcessorCount_cmd_pidin} info
+          OUTPUT_STRIP_TRAILING_WHITESPACE
+          OUTPUT_VARIABLE pidin_output)
+        string(REGEX MATCHALL "Processor[0-9]+: " procs "${pidin_output}")
+        list(LENGTH procs count)
+        message("ProcessorCount: using pidin '${ProcessorCount_cmd_pidin}'")
+      endif()
+    endif()
   endif()
 
-  # Execute this code when there is no 'sysctl' or 'getconf' or
+  # Execute this code when there is no 'sysctl' or 'getconf' or 'pidin' or
   # when previously executed methods return empty output:
   #
   if(NOT count)
@@ -65,5 +78,12 @@ function(ProcessorCount var)
     endif()
   endif()
 
+  # Ensure an integer return (avoid inadvertently returning an empty string
+  # or an error string)... If it's not a decimal integer, return 0:
+  #
+  if(NOT count MATCHES "^[0-9]+$")
+    set(count 0)
+  endif()
+
   set(${var} ${count} PARENT_SCOPE)
 endfunction()

+ 5 - 1
Tests/CMakeTests/ProcessorCountTest.cmake.in

@@ -3,7 +3,11 @@ include(ProcessorCount)
 ProcessorCount(processor_count)
 message("processor_count='${processor_count}'")
 
+if(NOT processor_count MATCHES "^[0-9]+$")
+  message(FATAL_ERROR "ProcessorCount function returned a non-integer")
+endif()
+
 if(processor_count EQUAL 0)
   message(FATAL_ERROR "could not determine number of processors
-- Additional code needed in ProcessorCount.cmake?")
+- Additional code for this platform needed in ProcessorCount.cmake?")
 endif()