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