Skip to content

Commit 4601b9a

Browse files
JanProvaznikCopilot
andcommitted
Rename TaskHostResource* to TaskHostCores* for specificity
The packet pair only handles RequestCores/ReleaseCores (IBuildEngine9), not generic 'resources'. Rename to TaskHostCoresRequest/Response to make this explicit, matching the Stage 1 pattern (TaskHostIsRunningMultipleNodes*). Also rename HandleResourceRequest to HandleCoresRequest in TaskHostTask. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent f9c4774 commit 4601b9a

9 files changed

Lines changed: 42 additions & 42 deletions

File tree

documentation/specs/multithreading/taskhost-threading.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,18 +102,18 @@ The following `IBuildEngine` members are forwarded from TaskHost to the owning w
102102
| IBuildEngine | Request Packet | Response Packet | Fallback |
103103
|---|---|---|---|
104104
| `IBuildEngine2.IsRunningMultipleNodes` | `TaskHostIsRunningMultipleNodesRequest` (0x24) | `TaskHostIsRunningMultipleNodesResponse` (0x25) | `false` |
105-
| `IBuildEngine9.RequestCores(int)` | `TaskHostResourceRequest` (0x22, `IsRelease=false`) | `TaskHostResourceResponse` (0x23) | `0` |
106-
| `IBuildEngine9.ReleaseCores(int)` | `TaskHostResourceRequest` (0x22, `IsRelease=true`) | `TaskHostResourceResponse` (0x23) | no-op |
105+
| `IBuildEngine9.RequestCores(int)` | `TaskHostCoresRequest` (0x22, `IsRelease=false`) | `TaskHostCoresResponse` (0x23) | `0` |
106+
| `IBuildEngine9.ReleaseCores(int)` | `TaskHostCoresRequest` (0x22, `IsRelease=true`) | `TaskHostCoresResponse` (0x23) | no-op |
107107

108108
### Resource Management (RequestCores/ReleaseCores)
109109

110110
The TaskHost node is a thin proxy for resource management. The real implicit-core/additional-core accounting happens in the in-process `TaskHost` class on the worker node:
111111

112112
1. Task calls `RequestCores(N)` in OutOfProcTaskHostNode
113-
2. Sends `TaskHostResourceRequest` with `IsRelease=false` and `RequestedCores=N`
114-
3. Worker node's `TaskHostTask.HandleResourceRequest()` calls `_buildEngine.RequestCores(N)` on the in-process TaskHost
113+
2. Sends `TaskHostCoresRequest` with `IsRelease=false` and `RequestedCores=N`
114+
3. Worker node's `TaskHostTask.HandleCoresRequest()` calls `_buildEngine.RequestCores(N)` on the in-process TaskHost
115115
4. In-process TaskHost handles implicit core logic, communicates with scheduler, returns granted count
116-
5. Worker node sends `TaskHostResourceResponse` with `GrantedCores`
116+
5. Worker node sends `TaskHostCoresResponse` with `GrantedCores`
117117
6. OutOfProcTaskHostNode returns the granted count to the task
118118

119119
`ReleaseCores` follows the same pattern with `IsRelease=true`. The response is an acknowledgment (GrantedCores=0).

src/Build.UnitTests/BackEnd/TaskHostCallbackPacket_Tests.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,39 +50,39 @@ public void TaskHostIsRunningMultipleNodesResponse_RoundTrip_Serialization(bool
5050
[Theory]
5151
[InlineData(4, false)] // RequestCores(4)
5252
[InlineData(2, true)] // ReleaseCores(2)
53-
public void TaskHostResourceRequest_RoundTrip_Serialization(int cores, bool isRelease)
53+
public void TaskHostCoresRequest_RoundTrip_Serialization(int cores, bool isRelease)
5454
{
55-
var request = new TaskHostResourceRequest(cores, isRelease);
55+
var request = new TaskHostCoresRequest(cores, isRelease);
5656
request.RequestId = 77;
5757

5858
ITranslator writeTranslator = TranslationHelpers.GetWriteTranslator();
5959
request.Translate(writeTranslator);
6060

6161
ITranslator readTranslator = TranslationHelpers.GetReadTranslator();
62-
var deserialized = (TaskHostResourceRequest)TaskHostResourceRequest.FactoryForDeserialization(readTranslator);
62+
var deserialized = (TaskHostCoresRequest)TaskHostCoresRequest.FactoryForDeserialization(readTranslator);
6363

6464
deserialized.RequestId.ShouldBe(77);
6565
deserialized.RequestedCores.ShouldBe(cores);
6666
deserialized.IsRelease.ShouldBe(isRelease);
67-
deserialized.Type.ShouldBe(NodePacketType.TaskHostResourceRequest);
67+
deserialized.Type.ShouldBe(NodePacketType.TaskHostCoresRequest);
6868
}
6969

7070
[Theory]
7171
[InlineData(0)] // ReleaseCores acknowledgment
7272
[InlineData(3)] // RequestCores granted 3
73-
public void TaskHostResourceResponse_RoundTrip_Serialization(int grantedCores)
73+
public void TaskHostCoresResponse_RoundTrip_Serialization(int grantedCores)
7474
{
75-
var response = new TaskHostResourceResponse(99, grantedCores);
75+
var response = new TaskHostCoresResponse(99, grantedCores);
7676

7777
ITranslator writeTranslator = TranslationHelpers.GetWriteTranslator();
7878
response.Translate(writeTranslator);
7979

8080
ITranslator readTranslator = TranslationHelpers.GetReadTranslator();
81-
var deserialized = (TaskHostResourceResponse)TaskHostResourceResponse.FactoryForDeserialization(readTranslator);
81+
var deserialized = (TaskHostCoresResponse)TaskHostCoresResponse.FactoryForDeserialization(readTranslator);
8282

8383
deserialized.RequestId.ShouldBe(99);
8484
deserialized.GrantedCores.ShouldBe(grantedCores);
85-
deserialized.Type.ShouldBe(NodePacketType.TaskHostResourceResponse);
85+
deserialized.Type.ShouldBe(NodePacketType.TaskHostCoresResponse);
8686
}
8787
}
8888
}

src/Build/Instance/TaskFactories/TaskHostTask.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ public TaskHostTask(
204204
(this as INodePacketFactory).RegisterPacketHandler(NodePacketType.TaskHostTaskComplete, TaskHostTaskComplete.FactoryForDeserialization, this);
205205
(this as INodePacketFactory).RegisterPacketHandler(NodePacketType.NodeShutdown, NodeShutdown.FactoryForDeserialization, this);
206206
(this as INodePacketFactory).RegisterPacketHandler(NodePacketType.TaskHostIsRunningMultipleNodesRequest, TaskHostIsRunningMultipleNodesRequest.FactoryForDeserialization, this);
207-
(this as INodePacketFactory).RegisterPacketHandler(NodePacketType.TaskHostResourceRequest, TaskHostResourceRequest.FactoryForDeserialization, this);
207+
(this as INodePacketFactory).RegisterPacketHandler(NodePacketType.TaskHostCoresRequest, TaskHostCoresRequest.FactoryForDeserialization, this);
208208

209209
_packetReceivedEvent = new AutoResetEvent(false);
210210
_receivedPackets = new ConcurrentQueue<INodePacket>();
@@ -514,8 +514,8 @@ private void HandlePacket(INodePacket packet, out bool taskFinished)
514514
case NodePacketType.TaskHostIsRunningMultipleNodesRequest:
515515
HandleIsRunningMultipleNodesRequest(packet as TaskHostIsRunningMultipleNodesRequest);
516516
break;
517-
case NodePacketType.TaskHostResourceRequest:
518-
HandleResourceRequest(packet as TaskHostResourceRequest);
517+
case NodePacketType.TaskHostCoresRequest:
518+
HandleCoresRequest(packet as TaskHostCoresRequest);
519519
break;
520520
default:
521521
ErrorUtilities.ThrowInternalErrorUnreachable();
@@ -671,7 +671,7 @@ private void HandleIsRunningMultipleNodesRequest(TaskHostIsRunningMultipleNodesR
671671
/// Forwards the call to the in-process TaskHost's IBuildEngine9 implementation,
672672
/// which handles implicit core accounting and scheduler communication.
673673
/// </summary>
674-
private void HandleResourceRequest(TaskHostResourceRequest request)
674+
private void HandleCoresRequest(TaskHostCoresRequest request)
675675
{
676676
int grantedCores = 0;
677677

@@ -690,7 +690,7 @@ private void HandleResourceRequest(TaskHostResourceRequest request)
690690
}
691691
}
692692

693-
var response = new TaskHostResourceResponse(request.RequestId, grantedCores);
693+
var response = new TaskHostCoresResponse(request.RequestId, grantedCores);
694694
_taskHostProvider.SendData(_taskHostNodeKey, response);
695695
}
696696

src/Build/Microsoft.Build.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@
125125
<Compile Include="..\Shared\ITaskHostCallbackPacket.cs" />
126126
<Compile Include="..\Shared\TaskHostIsRunningMultipleNodesRequest.cs" />
127127
<Compile Include="..\Shared\TaskHostIsRunningMultipleNodesResponse.cs" />
128-
<Compile Include="..\Shared\TaskHostResourceRequest.cs" />
129-
<Compile Include="..\Shared\TaskHostResourceResponse.cs" />
128+
<Compile Include="..\Shared\TaskHostCoresRequest.cs" />
129+
<Compile Include="..\Shared\TaskHostCoresResponse.cs" />
130130
<Compile Include="..\Shared\OutOfProcTaskHostTaskResult.cs" />
131131
<Compile Include="..\Shared\TaskLoader.cs" />
132132
<Compile Include="..\Shared\NodeEngineShutdownReason.cs" />

src/MSBuild/MSBuild.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,8 @@
120120
<Compile Include="..\Shared\ITaskHostCallbackPacket.cs" />
121121
<Compile Include="..\Shared\TaskHostIsRunningMultipleNodesRequest.cs" />
122122
<Compile Include="..\Shared\TaskHostIsRunningMultipleNodesResponse.cs" />
123-
<Compile Include="..\Shared\TaskHostResourceRequest.cs" />
124-
<Compile Include="..\Shared\TaskHostResourceResponse.cs" />
123+
<Compile Include="..\Shared\TaskHostCoresRequest.cs" />
124+
<Compile Include="..\Shared\TaskHostCoresResponse.cs" />
125125
<Compile Include="..\Shared\TaskLoader.cs" />
126126
<Compile Include="..\Shared\MSBuildLoadContext.cs" Condition="'$(TargetFrameworkIdentifier)'!='.NETFramework'" />
127127
<Compile Include="..\Shared\TypeLoader.cs" />

src/MSBuild/OutOfProcTaskHostNode.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ public OutOfProcTaskHostNode()
248248

249249
#if !CLR2COMPATIBILITY
250250
thisINodePacketFactory.RegisterPacketHandler(NodePacketType.TaskHostIsRunningMultipleNodesResponse, TaskHostIsRunningMultipleNodesResponse.FactoryForDeserialization, this);
251-
thisINodePacketFactory.RegisterPacketHandler(NodePacketType.TaskHostResourceResponse, TaskHostResourceResponse.FactoryForDeserialization, this);
251+
thisINodePacketFactory.RegisterPacketHandler(NodePacketType.TaskHostCoresResponse, TaskHostCoresResponse.FactoryForDeserialization, this);
252252
#endif
253253

254254
#if !CLR2COMPATIBILITY
@@ -578,8 +578,8 @@ public int RequestCores(int requestedCores)
578578
return 0;
579579
}
580580

581-
var request = new TaskHostResourceRequest(requestedCores, isRelease: false);
582-
var response = SendCallbackRequestAndWaitForResponse<TaskHostResourceResponse>(request);
581+
var request = new TaskHostCoresRequest(requestedCores, isRelease: false);
582+
var response = SendCallbackRequestAndWaitForResponse<TaskHostCoresResponse>(request);
583583
return response.GrantedCores;
584584
#endif
585585
}
@@ -598,8 +598,8 @@ public void ReleaseCores(int coresToRelease)
598598
return;
599599
}
600600

601-
var request = new TaskHostResourceRequest(coresToRelease, isRelease: true);
602-
SendCallbackRequestAndWaitForResponse<TaskHostResourceResponse>(request);
601+
var request = new TaskHostCoresRequest(coresToRelease, isRelease: true);
602+
SendCallbackRequestAndWaitForResponse<TaskHostCoresResponse>(request);
603603
#endif
604604
}
605605

@@ -817,7 +817,7 @@ private void HandlePacket(INodePacket packet)
817817
#if !CLR2COMPATIBILITY
818818
// Callback response packets - route to pending request
819819
case NodePacketType.TaskHostIsRunningMultipleNodesResponse:
820-
case NodePacketType.TaskHostResourceResponse:
820+
case NodePacketType.TaskHostCoresResponse:
821821
HandleCallbackResponse(packet);
822822
break;
823823
#endif

src/Shared/INodePacket.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -246,12 +246,12 @@ internal enum NodePacketType : byte
246246
/// <summary>
247247
/// Request from TaskHost to owning worker node for RequestCores/ReleaseCores.
248248
/// </summary>
249-
TaskHostResourceRequest = 0x22,
249+
TaskHostCoresRequest = 0x22,
250250

251251
/// <summary>
252-
/// Response from owning worker node to TaskHost with resource allocation result.
252+
/// Response from owning worker node to TaskHost with core allocation result.
253253
/// </summary>
254-
TaskHostResourceResponse = 0x23,
254+
TaskHostCoresResponse = 0x23,
255255

256256
/// <summary>
257257
/// Request from TaskHost to owning worker node for IsRunningMultipleNodes.
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,23 @@ namespace Microsoft.Build.BackEnd
88
/// When <see cref="IsRelease"/> is false, this is a RequestCores call with <see cref="RequestedCores"/> cores requested.
99
/// When <see cref="IsRelease"/> is true, this is a ReleaseCores call with <see cref="RequestedCores"/> cores to release.
1010
/// </summary>
11-
internal class TaskHostResourceRequest : INodePacket, ITaskHostCallbackPacket
11+
internal class TaskHostCoresRequest : INodePacket, ITaskHostCallbackPacket
1212
{
1313
private int _requestId;
1414
private int _requestedCores;
1515
private bool _isRelease;
1616

17-
public TaskHostResourceRequest()
17+
public TaskHostCoresRequest()
1818
{
1919
}
2020

21-
public TaskHostResourceRequest(int requestedCores, bool isRelease)
21+
public TaskHostCoresRequest(int requestedCores, bool isRelease)
2222
{
2323
_requestedCores = requestedCores;
2424
_isRelease = isRelease;
2525
}
2626

27-
public NodePacketType Type => NodePacketType.TaskHostResourceRequest;
27+
public NodePacketType Type => NodePacketType.TaskHostCoresRequest;
2828

2929
public int RequestId
3030
{
@@ -51,7 +51,7 @@ public void Translate(ITranslator translator)
5151

5252
internal static INodePacket FactoryForDeserialization(ITranslator translator)
5353
{
54-
var packet = new TaskHostResourceRequest();
54+
var packet = new TaskHostCoresRequest();
5555
packet.Translate(translator);
5656
return packet;
5757
}
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,26 @@
44
namespace Microsoft.Build.BackEnd
55
{
66
/// <summary>
7-
/// Response packet from owning worker node to TaskHost with the resource allocation result.
7+
/// Response packet from owning worker node to TaskHost with the core allocation result.
88
/// For RequestCores: <see cref="GrantedCores"/> is the number of cores granted.
99
/// For ReleaseCores: <see cref="GrantedCores"/> is 0 (acknowledgment only).
1010
/// </summary>
11-
internal class TaskHostResourceResponse : INodePacket, ITaskHostCallbackPacket
11+
internal class TaskHostCoresResponse : INodePacket, ITaskHostCallbackPacket
1212
{
1313
private int _requestId;
1414
private int _grantedCores;
1515

16-
public TaskHostResourceResponse()
16+
public TaskHostCoresResponse()
1717
{
1818
}
1919

20-
public TaskHostResourceResponse(int requestId, int grantedCores)
20+
public TaskHostCoresResponse(int requestId, int grantedCores)
2121
{
2222
_requestId = requestId;
2323
_grantedCores = grantedCores;
2424
}
2525

26-
public NodePacketType Type => NodePacketType.TaskHostResourceResponse;
26+
public NodePacketType Type => NodePacketType.TaskHostCoresResponse;
2727

2828
public int RequestId
2929
{
@@ -45,7 +45,7 @@ public void Translate(ITranslator translator)
4545

4646
internal static INodePacket FactoryForDeserialization(ITranslator translator)
4747
{
48-
var packet = new TaskHostResourceResponse();
48+
var packet = new TaskHostCoresResponse();
4949
packet.Translate(translator);
5050
return packet;
5151
}

0 commit comments

Comments
 (0)