Fix several issues
authorJan Vorlicek <janvorli@microsoft.com>
Tue, 9 Apr 2019 00:50:28 +0000 (02:50 +0200)
committerJan Vorlicek <janvorli@microsoft.com>
Tue, 9 Apr 2019 01:16:24 +0000 (03:16 +0200)
* Fix build on OSX and Linux machines without NUMA installed - there were
couple of places where I was missing ifdefs
* Fix bug in nodeMaskLength computation
* Remove testing change in eeconfig.cpp that has leaked into the PR
* Fix GCToOSInterface::GetTotalProcessorCount for embedded GC to return
all processors on the system, not just the ones enabled for the current
process.

src/dlls/mscordac/mscordac_unixexports.src
src/gc/unix/gcenv.unix.cpp
src/pal/inc/pal.h
src/pal/src/include/pal/palinternal.h
src/pal/src/misc/sysinfo.cpp
src/pal/src/numa/numa.cpp
src/pal/src/thread/thread.cpp
src/vm/eeconfig.cpp
src/vm/gcenv.os.cpp

index 3709d55..9902cb6 100644 (file)
@@ -123,7 +123,6 @@ nativeStringResourceTable_mscorrc_debug
 #GetLongPathNameW
 #GetModuleFileNameW
 #GetProcAddress
-#GetProcessAffinityMask
 #GetProcessHeap
 #GetShortPathNameW
 #GetStdHandle
index a6d56f2..105a958 100644 (file)
@@ -573,7 +573,7 @@ bool GCToOSInterface::VirtualCommit(void* address, size_t size, uint16_t node)
     {
         if ((int)node <= g_highestNumaNode)
         {
-            int nodeMaskLength = (g_highestNumaNode + 1 + sizeof(unsigned long) - 1) / sizeof(unsigned long);
+            int nodeMaskLength = (g_highestNumaNode + sizeof(unsigned long) - 1) / sizeof(unsigned long);
             unsigned long *nodeMask = (unsigned long*)alloca(nodeMaskLength * sizeof(unsigned long));
             memset(nodeMask, 0, nodeMaskLength);
 
@@ -916,13 +916,14 @@ bool GCToOSInterface::GetProcessorForHeap(uint16_t heap_number, uint16_t* proc_n
             if (availableProcNumber == heap_number)
             {
                 *proc_no = procNumber;
-
+#if HAVE_NUMA_H
                 if (GCToOSInterface::CanEnableGCNumaAware())
                 {
                     int result = numa_node_of_cpu(procNumber);
                     *node_no = (result >= 0) ? (uint16_t)result : NUMA_NODE_UNDEFINED;
                 }
                 else
+#endif // HAVE_NUMA_H
                 {
                     *node_no = NUMA_NODE_UNDEFINED;
                 }
index 79bc677..f4a726e 100644 (file)
@@ -2450,6 +2450,11 @@ PALAPI
 PAL_GetLogicalCpuCountFromOS(VOID);
 
 PALIMPORT
+DWORD
+PALAPI
+PAL_GetTotalCpuCount(VOID);
+
+PALIMPORT
 size_t
 PALAPI
 PAL_GetRestrictedPhysicalMemoryLimit(VOID);
index 6f64208..67236aa 100644 (file)
@@ -679,9 +679,6 @@ typedef enum _TimeConversionConstants
 bool
 ReadMemoryValueFromFile(const char* filename, size_t* val);
 
-DWORD
-GetTotalCpuCount();
-
 #ifdef __APPLE__
 bool
 GetApplicationContainerFolder(PathCharString& buffer, const char *applicationGroupId, int applicationGroupIdLength);
index 419c3f6..1a1a12f 100644 (file)
@@ -95,7 +95,9 @@ SET_DEFAULT_DEBUG_CHANNEL(MISC);
 #endif
 #endif // __APPLE__
 
-DWORD GetTotalCpuCount()
+DWORD
+PALAPI
+PAL_GetTotalCpuCount()
 {
     int nrcpus = 0;
 
@@ -150,7 +152,7 @@ PAL_GetLogicalCpuCountFromOS()
 
     nrcpus = CPU_COUNT(&cpuSet);
 #else // HAVE_SCHED_GETAFFINITY
-    nrcpus = GetTotalCpuCount();
+    nrcpus = PAL_GetTotalCpuCount();
 #endif // HAVE_SCHED_GETAFFINITY
 
     return nrcpus;
index 0c9d409..aabb800 100644 (file)
@@ -25,11 +25,6 @@ SET_DEFAULT_DEBUG_CHANNEL(NUMA);
 #include "pal/corunix.hpp"
 #include "pal/thread.hpp"
 
-#if HAVE_PTHREAD_NP_H
-#include <pthread_np.h>
-#endif
-
-#include <pthread.h>
 #include <dlfcn.h>
 #ifdef __FreeBSD__
 #include <stdlib.h>
@@ -43,10 +38,6 @@ SET_DEFAULT_DEBUG_CHANNEL(NUMA);
 
 using namespace CorUnix;
 
-#if HAVE_CPUSET_T
-typedef cpuset_t cpu_set_t;
-#endif
-
 // The highest NUMA node available
 int g_highestNumaNode = 0;
 // Is numa available
@@ -213,7 +204,7 @@ VirtualAllocExNuma(
 #if HAVE_NUMA_H
             if (result != NULL && g_numaAvailable)
             {
-                int nodeMaskLength = (g_highestNumaNode + 1 + sizeof(unsigned long) - 1) / sizeof(unsigned long);
+                int nodeMaskLength = (g_highestNumaNode + sizeof(unsigned long) - 1) / sizeof(unsigned long);
                 unsigned long *nodeMask = (unsigned long*)alloca(nodeMaskLength * sizeof(unsigned long));
                 memset(nodeMask, 0, nodeMaskLength);
 
index 122e860..ecbf725 100644 (file)
@@ -77,6 +77,10 @@ SET_DEFAULT_DEBUG_CHANNEL(THREAD); // some headers have code with asserts, so do
 extern "C" int _lwp_self ();
 #endif
 
+#if HAVE_CPUSET_T
+typedef cpuset_t cpu_set_t;
+#endif
+
 using namespace CorUnix;
 
 
@@ -2977,16 +2981,16 @@ BOOL
 PALAPI
 PAL_GetCurrentThreadAffinitySet(SIZE_T size, UINT_PTR* data)
 {
+#if HAVE_PTHREAD_GETAFFINITY_NP
     cpu_set_t cpuSet;
     CPU_ZERO(&cpuSet);
 
-#if HAVE_PTHREAD_GETAFFINITY_NP
     int st = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuSet);
 
     if (st == 0)
     {
         const SIZE_T BitsPerBitsetEntry = 8 * sizeof(UINT_PTR);
-        int nrcpus = GetTotalCpuCount();
+        int nrcpus = PAL_GetTotalCpuCount();
 
         // Get info for as much processors as it is possible to fit into the resulting set
         SIZE_T remainingCount = std::min(size * BitsPerBitsetEntry, (SIZE_T)nrcpus);
index 6bd0edd..9cb07fc 100644 (file)
@@ -1228,7 +1228,7 @@ HRESULT EEConfig::sync()
         CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_TC_StartupTier_CallCountingDelayMs);
 
 #ifndef FEATURE_PAL
-    bool hadSingleProcessorAtStartup = g_SystemInfo.dwNumberOfProcessors == 1;//CPUGroupInfo::HadSingleProcessorAtStartup();
+    bool hadSingleProcessorAtStartup = CPUGroupInfo::HadSingleProcessorAtStartup();
 #else // !FEATURE_PAL
     bool hadSingleProcessorAtStartup = g_SystemInfo.dwNumberOfProcessors == 1;
 #endif // !FEATURE_PAL
index 8f9e1ba..2334d95 100644 (file)
@@ -928,7 +928,7 @@ uint32_t GCToOSInterface::GetTotalProcessorCount()
         return g_SystemInfo.dwNumberOfProcessors;
     }
 #else // !FEATURE_PAL
-    return g_currentProcessCpuCount;
+    return PAL_GetTotalCpuCount();
 #endif // !FEATURE_PAL
 }