Browse Source

Merge pull request #135 from oleg-nenashev/bug/Issue124_Milliseconds_vs_TotalMs

[Issue #124] - Prevent the CPU overutilization due to the usage of Milliseconds instead of TotalMsec
Oleg Nenashev 9 years ago
parent
commit
8acca04bd8
1 changed files with 27 additions and 2 deletions
  1. 27 2
      src/Core/ServiceWrapper/Main.cs

+ 27 - 2
src/Core/ServiceWrapper/Main.cs

@@ -440,12 +440,24 @@ namespace winsw
         private void WaitForProcessToExit(Process processoWait)
         {
             SignalShutdownPending();
+            
+            int effectiveProcessWaitSleepTime;
+            if (_descriptor.SleepTime.TotalMilliseconds > Int32.MaxValue)
+            {
+                Log.Warn("The requested sleep time " + _descriptor.SleepTime.TotalMilliseconds + "is greater that the max value " + 
+                    Int32.MaxValue + ". The value will be truncated");
+                effectiveProcessWaitSleepTime = Int32.MaxValue;
+            }
+            else
+            {
+                effectiveProcessWaitSleepTime = (int)_descriptor.SleepTime.TotalMilliseconds;
+            }
 
             try
             {
 //                WriteEvent("WaitForProcessToExit [start]");
 
-                while (!processoWait.WaitForExit(_descriptor.SleepTime.Milliseconds))
+                while (!processoWait.WaitForExit(effectiveProcessWaitSleepTime))
                 {
                     SignalShutdownPending();
 //                    WriteEvent("WaitForProcessToExit [repeat]");
@@ -461,9 +473,22 @@ namespace winsw
 
         private void SignalShutdownPending()
         {
+            int effectiveWaitHint;
+            if (_descriptor.WaitHint.TotalMilliseconds > Int32.MaxValue)
+            {
+                Log.Warn("The requested WaitHint value (" + _descriptor.WaitHint.TotalMilliseconds + " ms)  is greater that the max value " + 
+                    Int32.MaxValue + ". The value will be truncated");
+                effectiveWaitHint = Int32.MaxValue;
+            }
+            else
+            {
+                effectiveWaitHint = (int)_descriptor.WaitHint.TotalMilliseconds;
+            }
+
+
             IntPtr handle = ServiceHandle;
             _wrapperServiceStatus.checkPoint++;
-            _wrapperServiceStatus.waitHint = _descriptor.WaitHint.Milliseconds;
+            _wrapperServiceStatus.waitHint = effectiveWaitHint;
 //            WriteEvent("SignalShutdownPending " + wrapperServiceStatus.checkPoint + ":" + wrapperServiceStatus.waitHint);
             _wrapperServiceStatus.currentState = (int)State.SERVICE_STOP_PENDING;
             Advapi32.SetServiceStatus(handle, ref _wrapperServiceStatus);