Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ PerformBlockingAdjustment() [2/2]

uint System.Threading.PortableThreadPool.PerformBlockingAdjustment ( bool previousDelayElapsed,
out bool addWorker )
inlineprivate

Definition at line 1682 of file PortableThreadPool.cs.

1683 {
1684 _pendingBlockingAdjustment = PendingBlockingAdjustment.None;
1685 addWorker = false;
1686 short targetThreadsGoalForBlockingAdjustment = TargetThreadsGoalForBlockingAdjustment;
1687 ThreadCounts counts = _separated.counts;
1688 short num = counts.NumThreadsGoal;
1689 if (num == targetThreadsGoalForBlockingAdjustment)
1690 {
1691 return 0u;
1692 }
1693 if (num > targetThreadsGoalForBlockingAdjustment)
1694 {
1696 {
1697 return 0u;
1698 }
1699 short num2 = Math.Min((short)(num - targetThreadsGoalForBlockingAdjustment), _numThreadsAddedDueToBlocking);
1701 num -= num2;
1703 HillClimbing.ThreadPoolHillClimber.ForceChange(num, HillClimbing.StateOrTransition.CooperativeBlocking);
1704 return 0u;
1705 }
1706 short num3 = (short)Math.Min((ushort)(_minThreads + BlockingConfig.ThreadsToAddWithoutDelay), (ushort)_maxThreads);
1707 short val = Math.Max(num3, Math.Min(counts.NumExistingThreads, _maxThreads));
1708 short num4 = Math.Min(targetThreadsGoalForBlockingAdjustment, val);
1709 short num5;
1710 if (num < num4)
1711 {
1712 num5 = num4;
1713 }
1714 else
1715 {
1716 if (!previousDelayElapsed)
1717 {
1718 goto IL_019f;
1719 }
1720 num5 = (short)(num + 1);
1721 }
1722 if (num5 > counts.NumExistingThreads)
1723 {
1724 long memoryLimitBytes = _memoryLimitBytes;
1725 if (memoryLimitBytes > 0)
1726 {
1727 long num6 = _memoryUsageBytes + (long)counts.NumExistingThreads * 65536L;
1728 long num7 = memoryLimitBytes * 8 / 10;
1729 if (num6 >= num7)
1730 {
1731 return 0u;
1732 }
1733 long val2 = counts.NumExistingThreads + (num7 - num6) / 65536;
1734 num5 = (short)Math.Min(num5, val2);
1735 if (num5 <= num)
1736 {
1737 return 0u;
1738 }
1739 }
1740 }
1741 _numThreadsAddedDueToBlocking += (short)(num5 - num);
1743 HillClimbing.ThreadPoolHillClimber.ForceChange(num5, HillClimbing.StateOrTransition.CooperativeBlocking);
1744 if (counts.NumProcessingWork >= num && _separated.numRequestedWorkers > 0)
1745 {
1746 addWorker = true;
1747 }
1748 num = num5;
1749 if (num >= targetThreadsGoalForBlockingAdjustment)
1750 {
1751 return 0u;
1752 }
1753 goto IL_019f;
1754 IL_019f:
1755 _pendingBlockingAdjustment = PendingBlockingAdjustment.WithDelayIfNecessary;
1756 int num8 = 1 + (num - num3) / BlockingConfig.ThreadsPerDelayStep;
1757 return Math.Min((uint)num8 * BlockingConfig.DelayStepMs, BlockingConfig.MaxDelayMs);
1758 }
PendingBlockingAdjustment _pendingBlockingAdjustment

References System.Threading.PortableThreadPool._maxThreads, System.Threading.PortableThreadPool._memoryLimitBytes, System.Threading.PortableThreadPool._memoryUsageBytes, System.Threading.PortableThreadPool._minThreads, System.Threading.PortableThreadPool._numThreadsAddedDueToBlocking, System.Threading.PortableThreadPool._pendingBlockingAdjustment, System.Threading.PortableThreadPool._separated, System.Threading.PortableThreadPool.CacheLineSeparated.counts, System.Threading.PortableThreadPool.BlockingConfig.DelayStepMs, System.Threading.PortableThreadPool.ThreadCounts.InterlockedSetNumThreadsGoal(), System.L, System.Math.Max(), System.Threading.PortableThreadPool.BlockingConfig.MaxDelayMs, System.Math.Min(), System.Threading.PortableThreadPool.ThreadCounts.NumExistingThreads, System.Threading.PortableThreadPool.ThreadCounts.NumProcessingWork, System.Threading.PortableThreadPool.CacheLineSeparated.numRequestedWorkers, System.Threading.PortableThreadPool.ThreadCounts.NumThreadsGoal, System.Threading.PortableThreadPool.TargetThreadsGoalForBlockingAdjustment, System.Threading.PortableThreadPool.HillClimbing.ThreadPoolHillClimber, System.Threading.PortableThreadPool.BlockingConfig.ThreadsPerDelayStep, and System.Threading.PortableThreadPool.BlockingConfig.ThreadsToAddWithoutDelay.