Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2018-08-07 15:51:10 +0300
committerCorinna Vinschen <corinna@vinschen.de>2018-08-07 15:51:10 +0300
commit1e0a1f59d9e64430ce796c578e0813100c0cf0d7 (patch)
treedda23756b72c4ee6cf58b0b3a51f95fb8691767b /winsup/cygwin/fhandler_proc.cc
parentc233d42264846f11e1d99b6664c8394b3ff32a78 (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.cc42
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\\");