diff options
Diffstat (limited to 'mcs/class/Microsoft.Build/Microsoft.Build.Execution/BuildManager.cs')
-rw-r--r-- | mcs/class/Microsoft.Build/Microsoft.Build.Execution/BuildManager.cs | 176 |
1 files changed, 127 insertions, 49 deletions
diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Execution/BuildManager.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Execution/BuildManager.cs index 3b4384b2f6..0c179afa48 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Execution/BuildManager.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Execution/BuildManager.cs @@ -2,8 +2,9 @@ // // Author: // Rolf Bjarne Kvinge (rolf@xamarin.com) +// Atsushi Enomoto (atsushi@xamarin.com) // -// Copyright (C) 2011 Xamarin Inc. +// Copyright (C) 2011,2013 Xamarin Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the @@ -26,66 +27,143 @@ // using Microsoft.Build.Evaluation; - using System; +using System.Collections.Generic; +using System.Threading; +using Microsoft.Build.Internal; +using System.Linq; namespace Microsoft.Build.Execution { - public class BuildManager - { - public BuildManager () - { - throw new NotImplementedException (); - } + public class BuildManager + { + static BuildManager default_manager = new BuildManager (); - public BuildManager (string hostName) - { - throw new NotImplementedException (); - } + public static BuildManager DefaultBuildManager { + get { return default_manager; } + } + + public BuildManager () + { + } - public void BeginBuild (BuildParameters parameters) - { - throw new NotImplementedException (); - } + public BuildManager (string hostName) + { + throw new NotImplementedException (); + } + + public void Dispose () + { + WaitHandle.WaitAll (submissions.Select (s => s.WaitHandle).ToArray ()); + BuildNodeManager.Stop (); + } - public BuildResult Build (BuildParameters parameters, BuildRequestData requestData) - { - throw new NotImplementedException (); - } + ~BuildManager () + { + // maybe processes created by out-of-process nodes should be signaled. + BuildNodeManager.Stop (); + } - public BuildResult BuildRequest (BuildRequestData requestData) - { - throw new NotImplementedException (); - } + readonly List<BuildSubmission> submissions = new List<BuildSubmission> (); + + BuildParameters ongoing_build_parameters; + + internal BuildParameters OngoingBuildParameters { + get { return ongoing_build_parameters; } + } - public void CancelAllSubmissions () - { - throw new NotImplementedException (); - } + public void BeginBuild (BuildParameters parameters) + { + if (ongoing_build_parameters != null) + throw new InvalidOperationException ("There is already ongoing build"); + ongoing_build_parameters = parameters.Clone (); + } - public void EndBuild () - { - throw new NotImplementedException (); - } + public BuildResult Build (BuildParameters parameters, BuildRequestData requestData) + { + BeginBuild (parameters); + var ret = BuildRequest (requestData); + EndBuild (); + return ret; + } - public ProjectInstance GetProjectInstanceForBuild (Project project) - { - throw new NotImplementedException (); - } + public BuildResult BuildRequest (BuildRequestData requestData) + { + var sub = PendBuildRequest (requestData); + sub.Execute (); + return sub.BuildResult; + } + + public void CancelAllSubmissions () + { + foreach (var sub in submissions) { + try { + if (!sub.IsCompleted) + sub.Cancel (); + } catch (InvalidOperationException) { + // some submissions could be already done during this iteration. Ignore that. + } + } + submissions.Clear (); + } - public BuildSubmission PendBuildRequest (BuildRequestData requestData) - { - throw new NotImplementedException (); - } + public void EndBuild () + { + if (ongoing_build_parameters == null) + throw new InvalidOperationException ("Build has not started"); + if (submissions.Count > 0) + WaitHandle.WaitAll (submissions.Select (s => s.WaitHandle).ToArray ()); + BuildNodeManager.Stop (); + ongoing_build_parameters = null; + } + + Dictionary<Project,ProjectInstance> instances = new Dictionary<Project, ProjectInstance> (); - public void ResetCaches () - { - throw new NotImplementedException (); - } + public ProjectInstance GetProjectInstanceForBuild (Project project) + { + if (project == null) + throw new ArgumentNullException ("project"); + if (project.FullPath == null) + throw new ArgumentNullException ("project", "FullPath parameter in the project cannot be null."); + if (project.FullPath == string.Empty) + throw new ArgumentException ("FullPath parameter in the project cannot be empty.", "project"); + // other than that, any invalid path character is accepted... + + return GetProjectInstanceForBuildInternal (project); + } + + internal ProjectInstance GetProjectInstanceForBuildInternal (Project project) + { + if (!instances.ContainsKey (project)) + instances [project] = project.CreateProjectInstance (); + return instances [project]; + } - public static BuildManager DefaultBuildManager { - get { throw new NotImplementedException (); } - } - } -} + public BuildSubmission PendBuildRequest (BuildRequestData requestData) + { + if (ongoing_build_parameters == null) + throw new InvalidOperationException ("This method cannot be called before calling BeginBuild method."); + var sub = new BuildSubmission (this, requestData); + submissions.Add (sub); + return sub; + } + public void ResetCaches () + { + if (OngoingBuildParameters != null) + throw new InvalidOperationException ("Cannot reset caches while builds are in progress."); + + BuildNodeManager.ResetCaches (); + } + + BuildNodeManager build_node_manager; + + internal BuildNodeManager BuildNodeManager { + get { + if (build_node_manager == null) + build_node_manager = new BuildNodeManager (this); + return build_node_manager; + } + } + } +} |