You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
Fixed crash closing the editor with SVN source control enabled
TTP# 342872 - EDITOR: Regression: CRASH: FSourceControlModule::ShutdownModule The SVN source control provider module was being shutdown before the main source control module, leading to a crash. The source control module now watches for its active provider module being unloaded, and will gracefully reset itself to the default (dummy) provider if that happens. I also added these same checks to the source code access module, as it uses the same provider modules mechanism. #codereview Thomas.Sarkanen, Max.Preussner [CL 2244286 by Jamie Dale in Main branch]
This commit is contained in:
@@ -19,6 +19,8 @@ DEFINE_LOG_CATEGORY(LogSourceControl);
|
||||
|
||||
#define LOCTEXT_NAMESPACE "SourceControl"
|
||||
|
||||
static const FName SourceControlFeatureName("SourceControl");
|
||||
|
||||
namespace SourceControlConstants
|
||||
{
|
||||
/** The maximum number of file/directory status requests we should dispatch in a tick */
|
||||
@@ -41,9 +43,10 @@ void FSourceControlModule::StartupModule()
|
||||
|
||||
// Register to check for source control features
|
||||
IModularFeatures::Get().OnModularFeatureRegistered().AddRaw(this, &FSourceControlModule::HandleModularFeatureRegistered);
|
||||
IModularFeatures::Get().OnModularFeatureUnregistered().AddRaw(this, &FSourceControlModule::HandleModularFeatureUnregistered);
|
||||
|
||||
// bind default provider to editor
|
||||
IModularFeatures::Get().RegisterModularFeature( "SourceControl", &DefaultSourceControlProvider );
|
||||
IModularFeatures::Get().RegisterModularFeature( SourceControlFeatureName, &DefaultSourceControlProvider );
|
||||
|
||||
#if WITH_UNREAL_DEVELOPER_TOOLS
|
||||
// create a message log for source control to use
|
||||
@@ -67,10 +70,11 @@ void FSourceControlModule::ShutdownModule()
|
||||
#endif
|
||||
|
||||
// unbind default provider from editor
|
||||
IModularFeatures::Get().UnregisterModularFeature( "SourceControl", &DefaultSourceControlProvider );
|
||||
IModularFeatures::Get().UnregisterModularFeature( SourceControlFeatureName, &DefaultSourceControlProvider );
|
||||
|
||||
// we don't care about modular features any more
|
||||
IModularFeatures::Get().OnModularFeatureRegistered().RemoveAll(this);
|
||||
IModularFeatures::Get().OnModularFeatureUnregistered().RemoveAll(this);
|
||||
}
|
||||
|
||||
void FSourceControlModule::SaveSettings()
|
||||
@@ -189,11 +193,11 @@ void FSourceControlModule::InitializeSourceControlProviders()
|
||||
// Look for valid SourceControl modules - they will register themselves as editor features
|
||||
RefreshSourceControlProviders();
|
||||
|
||||
int32 SourceControlCount = IModularFeatures::Get().GetModularFeatureImplementationCount("SourceControl");
|
||||
int32 SourceControlCount = IModularFeatures::Get().GetModularFeatureImplementationCount(SourceControlFeatureName);
|
||||
if( SourceControlCount > 0 )
|
||||
{
|
||||
FString PreferredSourceControlProvider = SourceControlSettings.GetProvider();
|
||||
TArray<ISourceControlProvider*> Providers = IModularFeatures::Get().GetModularFeatureImplementations<ISourceControlProvider>("SourceControl");
|
||||
TArray<ISourceControlProvider*> Providers = IModularFeatures::Get().GetModularFeatureImplementations<ISourceControlProvider>(SourceControlFeatureName);
|
||||
for(auto It(Providers.CreateIterator()); It; It++)
|
||||
{
|
||||
ISourceControlProvider* Provider = *It;
|
||||
@@ -310,7 +314,7 @@ ISourceControlProvider& FSourceControlModule::GetProvider() const
|
||||
|
||||
void FSourceControlModule::SetProvider( const FName& InName )
|
||||
{
|
||||
TArray<ISourceControlProvider*> Providers = IModularFeatures::Get().GetModularFeatureImplementations<ISourceControlProvider>("SourceControl");
|
||||
TArray<ISourceControlProvider*> Providers = IModularFeatures::Get().GetModularFeatureImplementations<ISourceControlProvider>(SourceControlFeatureName);
|
||||
for(auto It(Providers.CreateIterator()); It; It++)
|
||||
{
|
||||
ISourceControlProvider* Provider = *It;
|
||||
@@ -335,12 +339,12 @@ void FSourceControlModule::ClearCurrentSourceControlProvider()
|
||||
|
||||
int32 FSourceControlModule::GetNumSourceControlProviders()
|
||||
{
|
||||
return IModularFeatures::Get().GetModularFeatureImplementationCount("SourceControl");
|
||||
return IModularFeatures::Get().GetModularFeatureImplementationCount(SourceControlFeatureName);
|
||||
}
|
||||
|
||||
void FSourceControlModule::SetCurrentSourceControlProvider(int32 ProviderIndex)
|
||||
{
|
||||
TArray<ISourceControlProvider*> Providers = IModularFeatures::Get().GetModularFeatureImplementations<ISourceControlProvider>("SourceControl");
|
||||
TArray<ISourceControlProvider*> Providers = IModularFeatures::Get().GetModularFeatureImplementations<ISourceControlProvider>(SourceControlFeatureName);
|
||||
check(Providers.IsValidIndex(ProviderIndex));
|
||||
SetCurrentSourceControlProvider(*Providers[ProviderIndex]);
|
||||
}
|
||||
@@ -365,7 +369,7 @@ void FSourceControlModule::SetCurrentSourceControlProvider(ISourceControlProvide
|
||||
|
||||
FName FSourceControlModule::GetSourceControlProviderName(int32 ProviderIndex)
|
||||
{
|
||||
TArray<ISourceControlProvider*> Providers = IModularFeatures::Get().GetModularFeatureImplementations<ISourceControlProvider>("SourceControl");
|
||||
TArray<ISourceControlProvider*> Providers = IModularFeatures::Get().GetModularFeatureImplementations<ISourceControlProvider>(SourceControlFeatureName);
|
||||
check(Providers.IsValidIndex(ProviderIndex));
|
||||
return Providers[ProviderIndex]->GetName();
|
||||
}
|
||||
@@ -375,14 +379,22 @@ TSharedPtr<class SSourceControlLogin> FSourceControlModule::GetLoginWidget() con
|
||||
return SourceControlLoginPtr;
|
||||
}
|
||||
|
||||
void FSourceControlModule::HandleModularFeatureRegistered(const FName& Type)
|
||||
void FSourceControlModule::HandleModularFeatureRegistered(const FName& Type, IModularFeature* ModularFeature)
|
||||
{
|
||||
if(Type == TEXT("SourceControl"))
|
||||
if(Type == SourceControlFeatureName)
|
||||
{
|
||||
InitializeSourceControlProviders();
|
||||
}
|
||||
}
|
||||
|
||||
void FSourceControlModule::HandleModularFeatureUnregistered(const FName& Type, IModularFeature* ModularFeature)
|
||||
{
|
||||
if(Type == SourceControlFeatureName && CurrentSourceControlProvider == static_cast<ISourceControlProvider*>(ModularFeature))
|
||||
{
|
||||
ClearCurrentSourceControlProvider();
|
||||
}
|
||||
}
|
||||
|
||||
bool FSourceControlModule::GetUseGlobalSettings() const
|
||||
{
|
||||
return SourceControlSettings.GetUseGlobalSettings();
|
||||
|
||||
Reference in New Issue
Block a user