117b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner/*
217b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * ptw32_getprocessors.c
317b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *
417b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * Description:
517b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * This translation unit implements routines which are private to
617b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * the implementation and may be used throughout it.
717b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *
817b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * --------------------------------------------------------------------------
917b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *
1017b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      Pthreads-win32 - POSIX Threads Library for Win32
1117b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      Copyright(C) 1998 John E. Bossom
1217b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      Copyright(C) 1999,2005 Pthreads-win32 contributors
1317b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *
1417b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      Contact Email: rpj@callisto.canberra.edu.au
1517b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *
1617b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      The current list of contributors is contained
1717b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      in the file CONTRIBUTORS included with the source
1817b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      code distribution. The list can also be seen at the
1917b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      following World Wide Web location:
2017b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      http://sources.redhat.com/pthreads-win32/contributors.html
2117b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *
2217b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      This library is free software; you can redistribute it and/or
2317b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      modify it under the terms of the GNU Lesser General Public
2417b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      License as published by the Free Software Foundation; either
2517b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      version 2 of the License, or (at your option) any later version.
2617b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *
2717b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      This library is distributed in the hope that it will be useful,
2817b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      but WITHOUT ANY WARRANTY; without even the implied warranty of
2917b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
3017b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      Lesser General Public License for more details.
3117b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *
3217b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      You should have received a copy of the GNU Lesser General Public
3317b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      License along with this library in the file COPYING.LIB;
3417b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      if not, write to the Free Software Foundation, Inc.,
3517b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
3617b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner */
3717b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner
3817b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner#include "pthread.h"
3917b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner#include "implement.h"
4017b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner
4117b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner
4217b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner/*
4317b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * ptw32_getprocessors()
4417b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *
4517b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * Get the number of CPUs available to the process.
4617b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *
4717b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * If the available number of CPUs is 1 then pthread_spin_lock()
4817b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * will block rather than spin if the lock is already owned.
4917b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner *
5017b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * pthread_spin_init() calls this routine when initialising
5117b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * a spinlock. If the number of available processors changes
5217b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * (after a call to SetProcessAffinityMask()) then only
5317b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * newly initialised spinlocks will notice.
5417b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner */
5517b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turnerint
5617b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turnerptw32_getprocessors (int *count)
5717b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner{
5817b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner  DWORD_PTR vProcessCPUs;
5917b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner  DWORD_PTR vSystemCPUs;
6017b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner  int result = 0;
6117b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner
6217b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner#if defined(NEED_PROCESS_AFFINITY_MASK)
6317b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner
6417b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner  *count = 1;
6517b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner
6617b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner#else
6717b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner
6817b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner  if (GetProcessAffinityMask (GetCurrentProcess (),
6917b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner			      &vProcessCPUs, &vSystemCPUs))
7017b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner    {
7117b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner      DWORD_PTR bit;
7217b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner      int CPUs = 0;
7317b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner
7417b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner      for (bit = 1; bit != 0; bit <<= 1)
7517b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner	{
7617b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner	  if (vProcessCPUs & bit)
7717b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner	    {
7817b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner	      CPUs++;
7917b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner	    }
8017b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner	}
8117b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner      *count = CPUs;
8217b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner    }
8317b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner  else
8417b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner    {
8517b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner      result = EAGAIN;
8617b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner    }
8717b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner
8817b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner#endif
8917b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner
9017b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner  return (result);
9117b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner}
9217b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner