3
0

AWSCoreSystemComponent.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AzCore/Component/Component.h>
  9. #include <AzCore/Jobs/JobManager.h>
  10. #include <AzCore/Jobs/JobContext.h>
  11. #include <AzCore/Jobs/JobManagerBus.h>
  12. #include <AzCore/Jobs/JobCancelGroup.h>
  13. #include <AzCore/RTTI/BehaviorContext.h>
  14. #include <AzCore/Serialization/SerializeContext.h>
  15. #include <AzCore/Serialization/EditContext.h>
  16. #include <AWSNativeSDKInit/AWSNativeSDKInit.h>
  17. #include <AWSCoreSystemComponent.h>
  18. #include <Configuration/AWSCoreConfiguration.h>
  19. #include <Credential/AWSCredentialManager.h>
  20. #include <Framework/AWSApiJob.h>
  21. #include <ResourceMapping/AWSResourceMappingBus.h>
  22. #include <ResourceMapping/AWSResourceMappingManager.h>
  23. namespace AWSCore
  24. {
  25. constexpr int DEFAULT_NUMBER_AWS_THREADS = 2; /// Allow overlapping requests
  26. static constexpr const char COMPONENT_DISPLAY_NAME[] = "AWSCore";
  27. AWSCoreSystemComponent::AWSCoreSystemComponent()
  28. : m_firstThreadCPU(-1)
  29. , m_threadPriority(0)
  30. , m_threadStackSize(-1)
  31. , m_jobCancelGroup(nullptr)
  32. {
  33. m_awsCoreConfiguration = AZStd::make_unique<AWSCoreConfiguration>();
  34. m_awsCredentialManager = AZStd::make_unique<AWSCredentialManager>();
  35. m_awsResourceMappingManager = AZStd::make_unique<AWSResourceMappingManager>();
  36. m_threadCount = AZ::GetMin(static_cast<unsigned int>(DEFAULT_NUMBER_AWS_THREADS), AZStd::thread::hardware_concurrency());
  37. }
  38. void AWSCoreSystemComponent::Reflect(AZ::ReflectContext* context)
  39. {
  40. if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
  41. {
  42. serialize->Class<AWSCoreSystemComponent, AZ::Component>()
  43. ->Version(0)
  44. ;
  45. if (AZ::EditContext* ec = serialize->GetEditContext())
  46. {
  47. ec->Class<AWSCoreSystemComponent>("AWSCore", "Adds core support for working with AWS")
  48. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  49. ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
  50. ;
  51. }
  52. }
  53. if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
  54. {
  55. behaviorContext->EBus<AWSResourceMappingRequestBus>("AWSResourceMappingRequestBus")
  56. ->Attribute(AZ::Script::Attributes::Category, COMPONENT_DISPLAY_NAME)
  57. ->Event("GetDefaultAccountId", &AWSResourceMappingRequestBus::Events::GetDefaultAccountId)
  58. ->Event("GetDefaultRegion", &AWSResourceMappingRequestBus::Events::GetDefaultRegion)
  59. ->Event("GetResourceAccountId", &AWSResourceMappingRequestBus::Events::GetResourceAccountId,
  60. {{{"Resource KeyName", "Resource mapping key name is used to identify individual resource attributes."}}})
  61. ->Event("GetResourceNameId", &AWSResourceMappingRequestBus::Events::GetResourceNameId,
  62. {{{"Resource KeyName", "Resource mapping key name is used to identify individual resource attributes."}}})
  63. ->Event("GetResourceRegion", &AWSResourceMappingRequestBus::Events::GetResourceRegion,
  64. {{{"Resource KeyName", "Resource mapping key name is used to identify individual resource attributes."}}})
  65. ->Event("GetResourceType", &AWSResourceMappingRequestBus::Events::GetResourceType,
  66. {{{"Resource KeyName", "Resource mapping key name is used to identify individual resource attributes."}}})
  67. ->Event("ReloadConfigFile", &AWSResourceMappingRequestBus::Events::ReloadConfigFile,
  68. {{{"Is Reloading Config FileName", "Whether reload resource mapping config file name from AWS core configuration settings registry file."}}})
  69. ;
  70. }
  71. }
  72. void AWSCoreSystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
  73. {
  74. provided.push_back(AZ_CRC_CE("AWSCoreService"));
  75. }
  76. void AWSCoreSystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
  77. {
  78. incompatible.push_back(AZ_CRC_CE("AWSCoreService"));
  79. }
  80. void AWSCoreSystemComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
  81. {
  82. AZ_UNUSED(required);
  83. }
  84. void AWSCoreSystemComponent::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent)
  85. {
  86. AZ_UNUSED(dependent);
  87. }
  88. bool AWSCoreSystemComponent::IsAWSApiInitialized() const
  89. {
  90. return AWSNativeSDKInit::InitializationManager::IsInitialized();
  91. }
  92. void AWSCoreSystemComponent::Init()
  93. {
  94. m_awsCoreConfiguration->InitConfig();
  95. }
  96. void AWSCoreSystemComponent::Activate()
  97. {
  98. m_awsCoreConfiguration->ActivateConfig();
  99. InitAWSApi();
  100. m_awsCredentialManager->ActivateManager();
  101. m_awsResourceMappingManager->ActivateManager();
  102. AWSCoreRequestBus::Handler::BusConnect();
  103. AWSCoreNotificationsBus::Broadcast(&AWSCoreNotifications::OnSDKInitialized);
  104. }
  105. void AWSCoreSystemComponent::Deactivate()
  106. {
  107. AWSCoreRequestBus::Handler::BusDisconnect();
  108. m_awsResourceMappingManager->DeactivateManager();
  109. m_awsCredentialManager->DeactivateManager();
  110. // Its required that anything that owns memory allocated by the AWS
  111. // API be destructed before this component is deactivated.
  112. AWSCoreNotificationsBus::Broadcast(&AWSCoreNotifications::OnSDKShutdownStarted);
  113. ShutdownAWSApi();
  114. m_awsCoreConfiguration->DeactivateConfig();
  115. }
  116. void AWSCoreSystemComponent::InitAWSApi()
  117. {
  118. // Multiple different Gems might try to use the AWSNativeSDK, so make sure it only gets initialized / shutdown once
  119. // by the first Gem to try using it.
  120. m_ownsAwsNativeInitialization = !AWSNativeSDKInit::InitializationManager::IsInitialized();
  121. if (m_ownsAwsNativeInitialization)
  122. {
  123. AWSNativeSDKInit::InitializationManager::InitAwsApi();
  124. }
  125. }
  126. void AWSCoreSystemComponent::ShutdownAWSApi()
  127. {
  128. if (m_ownsAwsNativeInitialization)
  129. {
  130. AWSNativeSDKInit::InitializationManager::Shutdown();
  131. }
  132. }
  133. AZ::JobContext* AWSCoreSystemComponent::GetDefaultJobContext()
  134. {
  135. if (m_threadCount < 1)
  136. {
  137. AZ::JobContext* jobContext{ nullptr };
  138. AZ::JobManagerBus::BroadcastResult(jobContext, &AZ::JobManagerEvents::GetGlobalContext);
  139. return jobContext;
  140. }
  141. else
  142. {
  143. if (!m_jobContext)
  144. {
  145. // If m_firstThreadCPU isn't -1, then each thread will be
  146. // assigned to a specific CPU starting with the specified CPU.
  147. AZ::JobManagerDesc jobManagerDesc{};
  148. jobManagerDesc.m_jobManagerName = "AWSCore JobManager";
  149. AZ::JobManagerThreadDesc threadDesc(m_firstThreadCPU, m_threadPriority, m_threadStackSize);
  150. for (int i = 0; i < m_threadCount; ++i)
  151. {
  152. jobManagerDesc.m_workerThreads.push_back(threadDesc);
  153. if (threadDesc.m_cpuId > -1)
  154. {
  155. threadDesc.m_cpuId++;
  156. }
  157. }
  158. m_jobCancelGroup.reset(aznew AZ::JobCancelGroup());
  159. m_jobManager.reset(aznew AZ::JobManager(jobManagerDesc));
  160. m_jobContext.reset(aznew AZ::JobContext(*m_jobManager, *m_jobCancelGroup));
  161. }
  162. return m_jobContext.get();
  163. }
  164. }
  165. AwsApiJobConfig* AWSCoreSystemComponent::GetDefaultConfig()
  166. {
  167. return AwsApiJob::GetDefaultConfig();
  168. }
  169. } // namespace AWSCore