(root)/
glibc-2.38/
posix/
sched_cpucount.c
       1  /* Copyright (C) 2007-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <sched.h>
      19  
      20  /* Counting bits set, Brian Kernighan's way.
      21     Using a open-coded routine is slight better for architectures that
      22     do not have a popcount instruction (compiler might emit a library
      23     call).  */
      24  static inline int
      25  countbits (__cpu_mask v)
      26  {
      27    int s = 0;
      28    for (; v != 0; s++)
      29      v &= v - 1;
      30    return s;
      31  }
      32  
      33  int
      34  __sched_cpucount (size_t setsize, const cpu_set_t *setp)
      35  {
      36    int s = 0;
      37    for (int i = 0; i < setsize / sizeof (__cpu_mask); i++)
      38      s += countbits (setp->__bits[i]);
      39    return s;
      40  }
      41  libc_hidden_def (__sched_cpucount)