summaryrefslogtreecommitdiff
path: root/mcs/class/Microsoft.Build/Microsoft.Build.Execution/BuildSubmission.cs
diff options
context:
space:
mode:
Diffstat (limited to 'mcs/class/Microsoft.Build/Microsoft.Build.Execution/BuildSubmission.cs')
-rw-r--r--mcs/class/Microsoft.Build/Microsoft.Build.Execution/BuildSubmission.cs96
1 files changed, 88 insertions, 8 deletions
diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Execution/BuildSubmission.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Execution/BuildSubmission.cs
index 3a8a612b93..91a9823ce8 100644
--- a/mcs/class/Microsoft.Build/Microsoft.Build.Execution/BuildSubmission.cs
+++ b/mcs/class/Microsoft.Build/Microsoft.Build.Execution/BuildSubmission.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,15 +27,94 @@
//
using System;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Linq;
+using Microsoft.Build.Framework;
+using Microsoft.Build.Internal;
+using System.Collections.Generic;
namespace Microsoft.Build.Execution
{
- public class BuildSubmission
- {
- private BuildSubmission ()
- {
- throw new NotImplementedException ();
- }
- }
+ public class BuildSubmission
+ {
+ static Random rnd = new Random ();
+
+ internal BuildSubmission (BuildManager build, BuildRequestData requestData)
+ {
+ BuildManager = build;
+ this.request = requestData;
+ SubmissionId = rnd.Next ();
+ }
+
+ BuildRequestData request;
+ BuildSubmissionCompleteCallback callback;
+ bool is_started, is_completed, is_canceled;
+ ManualResetEvent wait_handle = new ManualResetEvent (true);
+
+ public object AsyncContext { get; private set; }
+ public BuildManager BuildManager { get; private set; }
+ public BuildResult BuildResult { get; set; }
+ public bool IsCompleted {
+ get { return is_completed; }
+ }
+ public int SubmissionId { get; private set; }
+ public WaitHandle WaitHandle {
+ get { return wait_handle; }
+ }
+
+ internal BuildRequestData BuildRequest {
+ get { return this.request; }
+ }
+
+ internal void Cancel ()
+ {
+ if (is_canceled)
+ throw new InvalidOperationException ("Build has already canceled");
+ is_canceled = true;
+ }
+
+ public BuildResult Execute ()
+ {
+ ExecuteAsync (null, null);
+ WaitHandle.WaitOne ();
+ return BuildResult;
+ }
+
+ internal BuildResult InternalExecute ()
+ {
+ BuildResult = new BuildResult () { SubmissionId = SubmissionId };
+ try {
+ var engine = new BuildEngine4 (this);
+ string toolsVersion = request.ExplicitlySpecifiedToolsVersion ?? request.ProjectInstance.ToolsVersion ?? BuildManager.OngoingBuildParameters.DefaultToolsVersion;
+ var outputs = new Dictionary<string,string> ();
+ engine.BuildProject (() => is_canceled, BuildResult, request.ProjectInstance, request.TargetNames, BuildManager.OngoingBuildParameters.GlobalProperties, outputs, toolsVersion);
+ } catch (Exception ex) {
+ BuildResult.Exception = ex;
+ BuildResult.OverallResult = BuildResultCode.Failure;
+ }
+ is_completed = true;
+ if (callback != null)
+ callback (this);
+ wait_handle.Set ();
+ return BuildResult;
+ }
+
+ public void ExecuteAsync (BuildSubmissionCompleteCallback callback, object context)
+ {
+ if (is_completed)
+ throw new InvalidOperationException ("Build has already completed");
+ if (is_canceled)
+ throw new InvalidOperationException ("Build has already canceled");
+ if (is_started)
+ throw new InvalidOperationException ("Build has already started");
+ is_started = true;
+ this.AsyncContext = context;
+ this.callback = callback;
+ wait_handle.Reset ();
+
+ BuildManager.BuildNodeManager.Enqueue (this);
+ }
+ }
}