Skip to content

Commit 2958644

Browse files
committed
fix: Custom messaging manager exception
1 parent 10ef2eb commit 2958644

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

com.unity.netcode.gameobjects/Runtime/Messaging/CustomMessageManager.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,14 +180,18 @@ internal void InvokeNamedMessage(ulong hash, ulong sender, FastBufferReader read
180180
// We dont know what size to use. Try every (more collision prone)
181181
if (m_NamedMessageHandlers32.TryGetValue(hash, out HandleNamedMessageDelegate messageHandler32))
182182
{
183+
// handler can remove itself, cache the name for metrics
184+
var messageName = m_MessageHandlerNameLookup32[hash];
183185
messageHandler32(sender, reader);
184-
m_NetworkManager.NetworkMetrics.TrackNamedMessageReceived(sender, m_MessageHandlerNameLookup32[hash], bytesCount);
186+
m_NetworkManager.NetworkMetrics.TrackNamedMessageReceived(sender, messageName, bytesCount);
185187
}
186188

187189
if (m_NamedMessageHandlers64.TryGetValue(hash, out HandleNamedMessageDelegate messageHandler64))
188190
{
191+
// handler can remove itself, cache the name for metrics
192+
var messageName = m_MessageHandlerNameLookup64[hash];
189193
messageHandler64(sender, reader);
190-
m_NetworkManager.NetworkMetrics.TrackNamedMessageReceived(sender, m_MessageHandlerNameLookup64[hash], bytesCount);
194+
m_NetworkManager.NetworkMetrics.TrackNamedMessageReceived(sender, messageName, bytesCount);
191195
}
192196
}
193197
else
@@ -198,15 +202,19 @@ internal void InvokeNamedMessage(ulong hash, ulong sender, FastBufferReader read
198202
case HashSize.VarIntFourBytes:
199203
if (m_NamedMessageHandlers32.TryGetValue(hash, out HandleNamedMessageDelegate messageHandler32))
200204
{
205+
// handler can remove itself, cache the name for metrics
206+
var messageName = m_MessageHandlerNameLookup32[hash];
201207
messageHandler32(sender, reader);
202-
m_NetworkManager.NetworkMetrics.TrackNamedMessageReceived(sender, m_MessageHandlerNameLookup32[hash], bytesCount);
208+
m_NetworkManager.NetworkMetrics.TrackNamedMessageReceived(sender, messageName, bytesCount);
203209
}
204210
break;
205211
case HashSize.VarIntEightBytes:
206212
if (m_NamedMessageHandlers64.TryGetValue(hash, out HandleNamedMessageDelegate messageHandler64))
207213
{
214+
// handler can remove itself, cache the name for metrics
215+
var messageName = m_MessageHandlerNameLookup64[hash];
208216
messageHandler64(sender, reader);
209-
m_NetworkManager.NetworkMetrics.TrackNamedMessageReceived(sender, m_MessageHandlerNameLookup64[hash], bytesCount);
217+
m_NetworkManager.NetworkMetrics.TrackNamedMessageReceived(sender, messageName, bytesCount);
210218
}
211219
break;
212220
}

com.unity.netcode.gameobjects/Tests/Runtime/Messaging/NamedMessageTests.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,5 +279,33 @@ public unsafe void ErrorMessageIsPrintedWhenAttemptingToSendNamedMessageWithTooB
279279
Assert.IsTrue(message.Contains($"Given message size ({msgSize} bytes) is greater than the maximum"), $"Unexpected exception: {message}");
280280
}
281281
}
282+
283+
[Test]
284+
public void NamedMessageHandlerIsUnregisteredWithoutException()
285+
{
286+
var messageName = Guid.NewGuid().ToString();
287+
288+
var receivedMessageContent = new ForceNetworkSerializeByMemcpy<Guid>(new Guid());
289+
m_ServerNetworkManager.CustomMessagingManager.RegisterNamedMessageHandler(
290+
messageName,
291+
(_, reader) =>
292+
{
293+
reader.ReadValueSafe(out receivedMessageContent);
294+
m_ServerNetworkManager.CustomMessagingManager.UnregisterNamedMessageHandler(messageName);
295+
});
296+
297+
var messageContent = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
298+
var writer = new FastBufferWriter(1300, Allocator.Temp);
299+
using (writer)
300+
{
301+
writer.WriteValueSafe(messageContent);
302+
m_ServerNetworkManager.CustomMessagingManager.SendNamedMessage(
303+
messageName,
304+
m_ServerNetworkManager.LocalClientId,
305+
writer);
306+
}
307+
308+
Assert.AreEqual(messageContent.Value, receivedMessageContent.Value);
309+
}
282310
}
283311
}

0 commit comments

Comments
 (0)