File: BackEnd\RequestCoresTask.cs
Web Access
Project: ..\..\..\src\Build.UnitTests\Microsoft.Build.Engine.UnitTests.csproj (Microsoft.Build.Engine.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
 
namespace Microsoft.Build.UnitTests.BackEnd
{
    /// <summary>
    /// A test task that calls IBuildEngine9.RequestCores and optionally ReleaseCores.
    /// Used by TaskHostCallback_Tests (in-process) and NetTaskHost_E2E_Tests (cross-runtime).
    /// The E2E project includes this file via linked compile to avoid duplication.
    /// </summary>
    public class RequestCoresTask : Task
    {
        /// <summary>
        /// Number of cores to request. Defaults to 1.
        /// </summary>
        public int CoreCount { get; set; } = 1;
 
        /// <summary>
        /// Whether to release the granted cores after requesting them.
        /// </summary>
        public bool ReleaseAfter { get; set; }
 
        /// <summary>
        /// Number of cores granted by the build engine.
        /// </summary>
        [Output]
        public int GrantedCores { get; set; }
 
        public override bool Execute()
        {
            if (BuildEngine is IBuildEngine9 engine9)
            {
                GrantedCores = engine9.RequestCores(CoreCount);
                Log.LogMessage(MessageImportance.High, $"RequestCores({CoreCount}) = {GrantedCores}");
 
                if (ReleaseAfter && GrantedCores > 0)
                {
                    engine9.ReleaseCores(GrantedCores);
                    Log.LogMessage(MessageImportance.High, $"ReleaseCores({GrantedCores}) completed");
                }
 
                return true;
            }
 
            Log.LogError("BuildEngine does not implement IBuildEngine9");
            return false;
        }
    }
}