From bf136a567b538c8e2da7a29a821dbe7f9cd0f03d Mon Sep 17 00:00:00 2001 From: kberg-amzn Date: Fri, 1 Oct 2021 15:04:50 -0700 Subject: [PATCH] Some shutdown crash fixes, reverted a whitespace, and added some basic unit tests for time additions Signed-off-by: kberg-amzn --- Code/Framework/AzCore/AzCore/Math/Aabb.h | 2 - .../Framework/AzCore/Tests/Time/TimeTests.cpp | 56 +++++++++++++++++++ .../AzCore/Tests/azcoretests_files.cmake | 1 + .../Components/MultiplayerComponentRegistry.h | 3 + .../MultiplayerComponentRegistry.cpp | 5 ++ .../Source/MultiplayerSystemComponent.cpp | 2 + .../NetworkEntity/NetworkEntityManager.cpp | 15 +++++ .../NetworkEntity/NetworkEntityManager.h | 3 + 8 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 Code/Framework/AzCore/Tests/Time/TimeTests.cpp diff --git a/Code/Framework/AzCore/AzCore/Math/Aabb.h b/Code/Framework/AzCore/AzCore/Math/Aabb.h index f6fb695399..438d95622e 100644 --- a/Code/Framework/AzCore/AzCore/Math/Aabb.h +++ b/Code/Framework/AzCore/AzCore/Math/Aabb.h @@ -1,4 +1,3 @@ - /* * Copyright (c) Contributors to the Open 3D Engine Project. * For complete copyright and license terms please see the LICENSE at the root of this distribution. @@ -6,7 +5,6 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ - #pragma once #include diff --git a/Code/Framework/AzCore/Tests/Time/TimeTests.cpp b/Code/Framework/AzCore/Tests/Time/TimeTests.cpp new file mode 100644 index 0000000000..6727ef1501 --- /dev/null +++ b/Code/Framework/AzCore/Tests/Time/TimeTests.cpp @@ -0,0 +1,56 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include +#include + +namespace UnitTest +{ + class TimeTests + : public AllocatorsFixture + { + public: + void SetUp() override + { + SetupAllocator(); + m_timeComponent = new AZ::TimeSystemComponent; + } + + void TearDown() override + { + delete m_timeComponent; + TeardownAllocator(); + } + + AZ::TimeSystemComponent* m_timeComponent = nullptr; + }; + + TEST_F(TimeTests, TestConversionUsToMs) + { + AZ::TimeUs timeUs = AZ::TimeUs{ 1000 }; + AZ::TimeMs timeMs = AZ::TimeUsToMs(timeUs); + EXPECT_EQ(timeMs, AZ::TimeMs{ 1 }); + } + + TEST_F(TimeTests, TestConversionMsToUs) + { + AZ::TimeMs timeMs = AZ::TimeMs{ 1000 }; + AZ::TimeUs timeUs = AZ::TimeMsToUs(timeMs); + EXPECT_EQ(timeUs, AZ::TimeUs{ 1000000 }); + } + + TEST_F(TimeTests, TestClocks) + { + AZ::TimeUs timeUs = AZ::GetElapsedTimeUs(); + AZ::TimeMs timeMs = AZ::GetElapsedTimeMs(); + + AZ::TimeMs timeUsToMs = AZ::TimeUsToMs(timeUs); + int64_t delta = static_cast(timeMs) - static_cast(timeUsToMs); + EXPECT_LT(abs(delta), 1); + } +} diff --git a/Code/Framework/AzCore/Tests/azcoretests_files.cmake b/Code/Framework/AzCore/Tests/azcoretests_files.cmake index c36d37d874..a111af0353 100644 --- a/Code/Framework/AzCore/Tests/azcoretests_files.cmake +++ b/Code/Framework/AzCore/Tests/azcoretests_files.cmake @@ -127,6 +127,7 @@ set(FILES Serialization/Json/UnorderedSetSerializerTests.cpp Serialization/Json/UnsupportedTypesSerializerTests.cpp Serialization/Json/UuidSerializerTests.cpp + Time/TimeTests.cpp Math/AabbTests.cpp Math/ColorTests.cpp Math/CrcTests.cpp diff --git a/Gems/Multiplayer/Code/Include/Multiplayer/Components/MultiplayerComponentRegistry.h b/Gems/Multiplayer/Code/Include/Multiplayer/Components/MultiplayerComponentRegistry.h index c4ded8cc1c..8cc507c0a2 100644 --- a/Gems/Multiplayer/Code/Include/Multiplayer/Components/MultiplayerComponentRegistry.h +++ b/Gems/Multiplayer/Code/Include/Multiplayer/Components/MultiplayerComponentRegistry.h @@ -67,6 +67,9 @@ namespace Multiplayer //! @return reference to the requested component data, an empty container will be returned if the NetComponentId does not exist const ComponentData& GetMultiplayerComponentData(NetComponentId netComponentId) const; + //! This releases all owned memory, should only be called during multiplayer shutdown. + void Reset(); + private: NetComponentId m_nextNetComponentId = NetComponentId{ 0 }; AZStd::unordered_map m_componentData; diff --git a/Gems/Multiplayer/Code/Source/Components/MultiplayerComponentRegistry.cpp b/Gems/Multiplayer/Code/Source/Components/MultiplayerComponentRegistry.cpp index e0e180431c..d92f95f6d2 100644 --- a/Gems/Multiplayer/Code/Source/Components/MultiplayerComponentRegistry.cpp +++ b/Gems/Multiplayer/Code/Source/Components/MultiplayerComponentRegistry.cpp @@ -57,4 +57,9 @@ namespace Multiplayer } return nullComponentData; } + + void MultiplayerComponentRegistry::Reset() + { + m_componentData.clear(); + } } diff --git a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp index 877267adde..b7dde3b9e7 100644 --- a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp +++ b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp @@ -199,6 +199,8 @@ namespace Multiplayer AZ::Interface::Get()->DestroyNetworkInterface(AZ::Name(MpNetworkInterfaceName)); AzFramework::SessionNotificationBus::Handler::BusDisconnect(); AZ::TickBus::Handler::BusDisconnect(); + + m_networkEntityManager.Reset(); } bool MultiplayerSystemComponent::StartHosting(uint16_t port, bool isDedicated) diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp index 93a816fdcf..db7f7243cc 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp @@ -300,6 +300,21 @@ namespace Multiplayer } } + void NetworkEntityManager::Reset() + { + m_multiplayerComponentRegistry.Reset(); + m_removeList.clear(); + m_entityDomain = nullptr; + m_updateEntityDomainEvent.RemoveFromQueue(); + m_ownedEntities.clear(); + m_entityExitDomainEvent.DisconnectAllHandlers(); + m_onEntityMarkedDirty.DisconnectAllHandlers(); + m_onEntityNotifyChanges.DisconnectAllHandlers(); + m_controllersActivatedEvent.DisconnectAllHandlers(); + m_controllersDeactivatedEvent.DisconnectAllHandlers(); + m_localDeferredRpcMessages.clear(); + } + void NetworkEntityManager::RemoveEntities() { AZStd::vector removeList; diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.h b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.h index 13b8f0e778..133c35dce0 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.h +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.h @@ -92,6 +92,9 @@ namespace Multiplayer void OnRootSpawnableReleased(uint32_t generation) override; //! @} + //! Used to release all memory prior to shutdown. + void Reset(); + private: void RemoveEntities(); NetEntityId NextId();