From a4ee776bcc69b9ca41663939a0261810c9890446 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Wed, 8 Jan 2014 22:30:17 -0800 Subject: [PATCH] Added priority support Also improved the test harness a bit. --- Main.cs | 4 +++ ServiceDescriptor.cs | 29 ++++++++++++++++ Tests/winswTests/ServiceDescriptorTests.cs | 40 ++++++++++------------ winsw.sln | 2 +- 4 files changed, 53 insertions(+), 22 deletions(-) diff --git a/Main.cs b/Main.cs index a6c3f7e..6fb4d48 100644 --- a/Main.cs +++ b/Main.cs @@ -421,6 +421,10 @@ namespace winsw process.Start(); WriteEvent("Started " + process.Id); + var priority = descriptor.Priority; + if (priority != ProcessPriorityClass.Normal) + process.PriorityClass = priority; + // monitor the completion of the process StartThread(delegate() { diff --git a/ServiceDescriptor.cs b/ServiceDescriptor.cs index 92b99a4..bc097df 100755 --- a/ServiceDescriptor.cs +++ b/ServiceDescriptor.cs @@ -72,6 +72,21 @@ namespace winsw dom.Load(BasePath + ".xml"); } + /// + /// Loads descriptor from existing DOM + /// + public ServiceDescriptor(XmlDocument dom) + { + this.dom = dom; + } + + public static ServiceDescriptor FromXML(string xml) + { + var dom = new XmlDocument(); + dom.LoadXml(xml); + return new ServiceDescriptor(dom); + } + private string SingleElement(string tagName) { return SingleElement(tagName, false); @@ -571,5 +586,19 @@ namespace winsw return SingleTimeSpanElement(dom, "stoptimeout", TimeSpan.FromSeconds(15)); } } + + /// + /// Desired process priority or null if not specified. + /// + public ProcessPriorityClass Priority + { + get + { + var p = SingleElement("priority",true); + if (p == null) return ProcessPriorityClass.Normal; // default value + + return (ProcessPriorityClass)Enum.Parse(typeof(ProcessPriorityClass), p, true); + } + } } } diff --git a/Tests/winswTests/ServiceDescriptorTests.cs b/Tests/winswTests/ServiceDescriptorTests.cs index c5dfb34..c7a7f1d 100644 --- a/Tests/winswTests/ServiceDescriptorTests.cs +++ b/Tests/winswTests/ServiceDescriptorTests.cs @@ -1,29 +1,15 @@ using NUnit.Framework; -using winsw; +using winsw; +using System.Diagnostics; +using System.Xml; namespace winswTests { - - public class ServiceDescriptorExtended : ServiceDescriptor - { - - public ServiceDescriptorExtended(string descriptorXml) - { - LoadTestXml(descriptorXml); - } - - private void LoadTestXml(string xml) - { - dom.LoadXml(xml); - } - } - - [TestFixture] public class ServiceDescriptorTests { - private ServiceDescriptorExtended extendedServiceDescriptor; + private ServiceDescriptor extendedServiceDescriptor; private const string ExpectedWorkingDirectory = @"Z:\Path\SubPath"; private const string Username = "User"; @@ -49,9 +35,8 @@ namespace winswTests + ExpectedWorkingDirectory + "" + @"C:\logs" - + ""; - - extendedServiceDescriptor = new ServiceDescriptorExtended(SeedXml); + + ""; + extendedServiceDescriptor = ServiceDescriptor.FromXML(SeedXml); } [Test] @@ -73,6 +58,19 @@ namespace winswTests { System.Diagnostics.Debug.WriteLine("_extendedServiceDescriptor.WorkingDirectory :: " + extendedServiceDescriptor.WorkingDirectory); Assert.That(extendedServiceDescriptor.ServiceAccountPassword, Is.EqualTo(Password)); + } + + [Test] + public void Priority() + { + var sd = ServiceDescriptor.FromXML("testnormal"); + Assert.That(sd.Priority, Is.EqualTo(ProcessPriorityClass.Normal)); + + sd = ServiceDescriptor.FromXML("testidle"); + Assert.That(sd.Priority, Is.EqualTo(ProcessPriorityClass.Idle)); + + sd = ServiceDescriptor.FromXML("test"); + Assert.That(sd.Priority, Is.EqualTo(ProcessPriorityClass.Normal)); } } } diff --git a/winsw.sln b/winsw.sln index e9f8b36..9672aad 100644 --- a/winsw.sln +++ b/winsw.sln @@ -1,6 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual C# Express 2008 +# Visual Studio 2008 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "winsw", "winsw.csproj", "{0DE77F55-ADE5-43C1-999A-0BC81153B039}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "winswTests", "Tests\winswTests\winswTests.csproj", "{93843402-842B-44B4-B303-AEE829BE0B43}"