Fix MemoryBarrier
authorBen Adams <thundercat@illyriad.co.uk>
Wed, 10 Aug 2016 00:10:43 +0000 (01:10 +0100)
committerBen Adams <thundercat@illyriad.co.uk>
Wed, 10 Aug 2016 00:10:43 +0000 (01:10 +0100)
src/vm/win32threadpool.cpp
src/vm/win32threadpool.h

index 2ec7ded..23ed911 100644 (file)
@@ -1263,10 +1263,10 @@ void ThreadpoolMgr::AdjustMaxWorkersActive()
         }
 
         PriorCompletedWorkRequests = totalNumCompletions;
-        PriorCompletedWorkRequestsTime = currentTicks;
         NextCompletedWorkRequestsTime = currentTicks + ThreadAdjustmentInterval;
-        CurrentSampleStartTime = endTime;
-        MemoryBarrier();
+        MemoryBarrier(); // flush previous writes (especially NextCompletedWorkRequestsTime)
+        PriorCompletedWorkRequestsTime = currentTicks;
+        CurrentSampleStartTime = endTime;;
     }
 }
 
index 50eb708..45880d0 100644 (file)
@@ -1142,9 +1142,9 @@ public:
         if (CLRThreadpoolHosted())
             return false;
 
-        MemoryBarrier();
-        DWORD priorTime = PriorCompletedWorkRequestsTime; 
-        DWORD requiredInterval = NextCompletedWorkRequestsTime - priorTime; // fences above read
+        DWORD priorTime = PriorCompletedWorkRequestsTime;
+        MemoryBarrier(); // read fresh value for NextCompletedWorkRequestsTime below
+        DWORD requiredInterval = NextCompletedWorkRequestsTime - priorTime;
         DWORD elapsedInterval = GetTickCount() - priorTime;
         if (elapsedInterval >= requiredInterval)
         {