busybox/libbb/get_cpu_count.c
<<
>>
Prefs
   1/* vi: set sw=4 ts=4: */
   2/*
   3 * Factored out of mpstat/iostat.
   4 *
   5 * Copyright (C) 2010 Marek Polacek <mmpolacek@gmail.com>
   6 *
   7 * Licensed under GPLv2, see file LICENSE in this source tree.
   8 */
   9#include "libbb.h"
  10
  11/* Does str start with "cpu"? */
  12int FAST_FUNC starts_with_cpu(const char *str)
  13{
  14        return ((str[0] - 'c') | (str[1] - 'p') | (str[2] - 'u')) == 0;
  15}
  16
  17/*
  18 * Get number of processors. Uses /proc/stat.
  19 * Return value 0 means one CPU and non SMP kernel.
  20 * Otherwise N means N processor(s) and SMP kernel.
  21 */
  22unsigned FAST_FUNC get_cpu_count(void)
  23{
  24        FILE *fp;
  25        char line[256];
  26        int proc_nr = -1;
  27
  28        fp = xfopen_for_read("/proc/stat");
  29        while (fgets(line, sizeof(line), fp)) {
  30                if (!starts_with_cpu(line)) {
  31                        if (proc_nr >= 0)
  32                                break; /* we are past "cpuN..." lines */
  33                        continue;
  34                }
  35                if (line[3] != ' ') { /* "cpuN" */
  36                        int num_proc;
  37                        if (sscanf(line + 3, "%u", &num_proc) == 1
  38                         && num_proc > proc_nr
  39                        ) {
  40                                proc_nr = num_proc;
  41                        }
  42                }
  43        }
  44
  45        fclose(fp);
  46        return proc_nr + 1;
  47}
  48