diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2018-08-07 15:51:10 +0300 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2018-08-07 15:51:10 +0300 |
commit | 1e0a1f59d9e64430ce796c578e0813100c0cf0d7 (patch) | |
tree | dda23756b72c4ee6cf58b0b3a51f95fb8691767b /winsup/cygwin/fhandler_proc.cc | |
parent | c233d42264846f11e1d99b6664c8394b3ff32a78 (diff) |
Cygwin: implement sched_getcpu
* create new function __get_cpus_per_group to evaluate # of CPU groups
* Call from format_proc_cpuinfo and sched_getcpu
* Bump API minor version
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup/cygwin/fhandler_proc.cc')
-rw-r--r-- | winsup/cygwin/fhandler_proc.cc | 42 |
1 files changed, 1 insertions, 41 deletions
diff --git a/winsup/cygwin/fhandler_proc.cc b/winsup/cygwin/fhandler_proc.cc index 3e25bdc80..c9761b5b9 100644 --- a/winsup/cygwin/fhandler_proc.cc +++ b/winsup/cygwin/fhandler_proc.cc @@ -600,7 +600,6 @@ format_proc_stat (void *, char *&destbuf) return eobuf - buf; } -#define add_size(p,s) ((p) = ((__typeof__(p))((PBYTE)(p)+(s)))) #define print(x) { bufptr = stpcpy (bufptr, (x)); } static inline uint32_t @@ -640,46 +639,7 @@ format_proc_cpuinfo (void *, char *&destbuf) char *bufptr = buf; //WORD num_cpu_groups = 1; /* Pre Windows 7, only one group... */ - WORD num_cpu_per_group = 64; /* ...and a max of 64 CPUs. */ - - PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX lpi = - (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX) tp.c_get (); - DWORD lpi_size = NT_MAX_PATH; - - /* Fake a SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX group info block on Vista - systems. This may be over the top but if the below code just using - ActiveProcessorCount turns out to be insufficient, we can build on that. */ - if (!wincap.has_processor_groups () - || !GetLogicalProcessorInformationEx (RelationGroup, lpi, &lpi_size)) - { - lpi_size = sizeof *lpi; - lpi->Relationship = RelationGroup; - lpi->Size = lpi_size; - lpi->Group.MaximumGroupCount = 1; - lpi->Group.ActiveGroupCount = 1; - lpi->Group.GroupInfo[0].MaximumProcessorCount = wincap.cpu_count (); - lpi->Group.GroupInfo[0].ActiveProcessorCount - = __builtin_popcountl (wincap.cpu_mask ()); - lpi->Group.GroupInfo[0].ActiveProcessorMask = wincap.cpu_mask (); - } - - PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX plpi = lpi; - for (DWORD size = lpi_size; size > 0; - size -= plpi->Size, add_size (plpi, plpi->Size)) - if (plpi->Relationship == RelationGroup) - { - //num_cpu_groups = plpi->Group.MaximumGroupCount; - /* Turns out, there are systems with a MaximumProcessorCount not - reflecting the actually available CPUs. The ActiveProcessorCount - is correct though. So we just use ActiveProcessorCount for now, - hoping the best. If it turns out that we have to handle more - complex CPU layouts with weird ActiveProcessorMasks, we can - do that by restructuring the subsequent CPU loop. */ - num_cpu_per_group - = plpi->Group.GroupInfo[0].ActiveProcessorCount; - break; - } - + WORD num_cpu_per_group = __get_cpus_per_group (); cpu_num_p = wcpcpy (cpu_key, L"\\Registry\\Machine\\HARDWARE\\DESCRIPTION" "\\System\\CentralProcessor\\"); |