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>
This commit is contained in:
Corinna Vinschen
2018-08-07 14:51:10 +02:00
parent c233d42264
commit 1e0a1f59d9
10 changed files with 77 additions and 44 deletions

View File

@ -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\\");