Skip to content

Commit 17f7f25

Browse files
authored
fix: ObjectDisposedException on NetworkManager after shutting down the Transport (#3142)
fix: ObjectDisposedException thrown when shutting down the NetworkManager after shutting down the Transport
1 parent 2b0a9b2 commit 17f7f25

File tree

3 files changed

+65
-0
lines changed

3 files changed

+65
-0
lines changed

com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1495,6 +1495,11 @@ public override bool StartServer()
14951495
/// </summary>
14961496
public override void Shutdown()
14971497
{
1498+
if (m_NetworkManager && !m_NetworkManager.ShutdownInProgress)
1499+
{
1500+
Debug.LogWarning("Directly calling `UnityTransport.Shutdown()` results in unexpected shutdown behaviour. All pending events will be lost. Use `NetworkManager.Shutdown()` instead.");
1501+
}
1502+
14981503
if (m_Driver.IsCreated)
14991504
{
15001505
while (ProcessEvent() && m_Driver.IsCreated)
@@ -1519,6 +1524,7 @@ public override void Shutdown()
15191524
DisposeInternals();
15201525

15211526
m_ReliableReceiveQueues.Clear();
1527+
m_State = State.Disconnected;
15221528

15231529
// We must reset this to zero because UTP actually re-uses clientIds if there is a clean disconnect
15241530
m_ServerClientId = 0;

com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,24 @@ public static IEnumerator WaitForNetworkEvent(NetworkEvent type, List<TransportE
3636
Assert.Fail("Timed out while waiting for network event.");
3737
}
3838

39+
// Wait to ensure no event is sent.
40+
public static IEnumerator EnsureNoNetworkEvent(List<TransportEvent> events, float timeout = MaxNetworkEventWaitTime)
41+
{
42+
int initialCount = events.Count;
43+
float startTime = Time.realtimeSinceStartup;
44+
45+
while (Time.realtimeSinceStartup - startTime < timeout)
46+
{
47+
if (events.Count > initialCount)
48+
{
49+
Assert.Fail("Received unexpected network event.");
50+
}
51+
52+
yield return new WaitForSeconds(0.01f);
53+
}
54+
}
55+
56+
3957
// Common code to initialize a UnityTransport that logs its events.
4058
public static void InitializeTransport(out UnityTransport transport, out List<TransportEvent> events,
4159
int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4)

com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTests.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,5 +499,46 @@ public IEnumerator ReliablePayloadsCanBeLargerThanMaximum()
499499

500500
yield return WaitForNetworkEvent(NetworkEvent.Data, m_Client1Events);
501501
}
502+
503+
public enum AfterShutdownAction
504+
{
505+
Send,
506+
DisconnectRemoteClient,
507+
DisconnectLocalClient,
508+
}
509+
510+
[UnityTest]
511+
public IEnumerator DoesNotActAfterShutdown([Values] AfterShutdownAction afterShutdownAction)
512+
{
513+
InitializeTransport(out m_Server, out m_ServerEvents);
514+
InitializeTransport(out m_Client1, out m_Client1Events);
515+
516+
m_Server.StartServer();
517+
m_Client1.StartClient();
518+
519+
yield return WaitForNetworkEvent(NetworkEvent.Connect, m_Client1Events);
520+
521+
m_Server.Shutdown();
522+
523+
if (afterShutdownAction == AfterShutdownAction.Send)
524+
{
525+
var data = new ArraySegment<byte>(new byte[16]);
526+
m_Server.Send(m_Client1.ServerClientId, data, NetworkDelivery.Reliable);
527+
528+
yield return EnsureNoNetworkEvent(m_Client1Events);
529+
}
530+
else if (afterShutdownAction == AfterShutdownAction.DisconnectRemoteClient)
531+
{
532+
m_Server.DisconnectRemoteClient(m_Client1.ServerClientId);
533+
534+
LogAssert.Expect(LogType.Assert, "DisconnectRemoteClient should be called on a listening server");
535+
}
536+
else if (afterShutdownAction == AfterShutdownAction.DisconnectLocalClient)
537+
{
538+
m_Server.DisconnectLocalClient();
539+
540+
yield return EnsureNoNetworkEvent(m_Client1Events);
541+
}
542+
}
502543
}
503544
}

0 commit comments

Comments
 (0)