예제 #1
0
mfxStatus MFX::MFXPluginFactory::Create(const PluginDescriptionRecord & rec)
{
    PluginModule plgModule(rec.sPath);
    mfxPlugin plg = {};
    mfxPluginParam plgParams;
    
    if (!plgModule.Create(rec.PluginUID, plg)) 
    {
        return MFX_ERR_UNKNOWN;
    }
    
    if (!RunVerification(plg, rec, plgParams)) 
    {
        //will do not call plugin close since it is not safe to do that until structure is corrected
        return MFX_ERR_UNKNOWN;
    }
    
    mfxStatus sts = MFXVideoUSER_Register(mSession, plgParams.Type, &plg);
    if (MFX_ERR_NONE != sts) 
    {
        TRACE_PLUGIN_ERROR(" MFXVideoUSER_Register returned %d\n", sts);
        return sts;
    }
    
    mPlugins.push_back(FactoryRecord(plgParams, plgModule, plg));

    return MFX_ERR_NONE;
}
uint32 FBuildPatchInstaller::Run()
{
    // Make sure this function can never be parallelized
    static FCriticalSection SingletonFunctionLockCS;
    FScopeLock SingletonFunctionLock(&SingletonFunctionLockCS);
    FBuildPatchInstallError::Reset();

    SetRunning(true);
    SetInited(true);
    SetDownloadSpeed(-1);
    UpdateDownloadProgressInfo(true);

    // Register the current manifest with the installation info, to make sure we pull from it
    if (CurrentBuildManifest.IsValid())
    {
        InstallationInfo.RegisterAppInstallation(CurrentBuildManifest.ToSharedRef(), InstallDirectory);
    }

    // Keep track of files that failed verify
    TArray<FString> CorruptFiles;

    // Init prereqs progress value
    const bool bInstallPrereqs = !CurrentBuildManifest.IsValid() && !NewBuildManifest->GetPrereqPath().IsEmpty();

    // Get the start time
    double StartTime = FPlatformTime::Seconds();
    double CleanUpTime = 0;

    // Keep retrying the install while it is not canceled, or caused by download error
    bool bProcessSuccess = false;
    bool bCanRetry = true;
    int32 InstallRetries = 5;
    while (!bProcessSuccess && bCanRetry)
    {
        // Run the install
        bool bInstallSuccess = RunInstallation(CorruptFiles);
        BuildProgress.SetStateProgress(EBuildPatchProgress::PrerequisitesInstall, bInstallPrereqs ? 0.0f : 1.0f);
        if (bInstallSuccess)
        {
            BuildProgress.SetStateProgress(EBuildPatchProgress::Downloading, 1.0f);
            BuildProgress.SetStateProgress(EBuildPatchProgress::Installing, 1.0f);
        }

        // Backup local changes then move generated files
        bInstallSuccess = bInstallSuccess && RunBackupAndMove();

        // Run Verification
        CorruptFiles.Empty();
        BuildProgress.SetStateProgress(EBuildPatchProgress::Initializing, 1.0f);
        bProcessSuccess = bInstallSuccess && RunVerification(CorruptFiles);

        // Clean staging if INSTALL success
        if (bInstallSuccess)
        {
            GLog->Logf(TEXT("BuildPatchServices: Deleting staging area"));
            CleanUpTime = FPlatformTime::Seconds();
            IFileManager::Get().DeleteDirectory(*StagingDirectory, false, true);
            CleanUpTime = FPlatformTime::Seconds() - CleanUpTime;
        }
        BuildProgress.SetStateProgress(EBuildPatchProgress::CleanUp, 1.0f);

        // Set if we can retry
        --InstallRetries;
        bCanRetry = InstallRetries > 0 && !FBuildPatchInstallError::IsInstallationCancelled() && !FBuildPatchInstallError::IsNoRetryError();

        // If successful or we will retry, remove the moved files marker
        if (bProcessSuccess || bCanRetry)
        {
            GLog->Logf(TEXT("BuildPatchServices: Reset MM"));
            IFileManager::Get().Delete(*PreviousMoveMarker, false, true);
        }
    }

    if (bProcessSuccess)
    {
        // Run the prerequisites installer if this is our first install and the manifest has prerequisites info
        if (bInstallPrereqs)
        {
            // @TODO: We also want to trigger prereq install if this is an update and the prereq installer differs in the update
            bProcessSuccess &= RunPrereqInstaller();
        }
    }

    // Set final stat values and log out results
    {
        FScopeLock Lock(&ThreadLock);
        bSuccess = bProcessSuccess;
        BuildStats.ProcessSuccess = bProcessSuccess;
        BuildStats.ProcessExecuteTime = (FPlatformTime::Seconds() - StartTime) - BuildStats.ProcessPausedTime;
        BuildStats.FailureReason = FBuildPatchInstallError::GetErrorString();
        BuildStats.FailureReasonText = FBuildPatchInstallError::GetErrorText();
        BuildStats.CleanUpTime = CleanUpTime;

        // Log stats
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: AppName: %s"), *BuildStats.AppName);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: AppInstalledVersion: %s"), *BuildStats.AppInstalledVersion);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: AppPatchVersion: %s"), *BuildStats.AppPatchVersion);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: CloudDirectory: %s"), *BuildStats.CloudDirectory);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: NumFilesInBuild: %u"), BuildStats.NumFilesInBuild);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: NumFilesOutdated: %u"), BuildStats.NumFilesOutdated);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: NumFilesToRemove: %u"), BuildStats.NumFilesToRemove);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: NumChunksRequired: %u"), BuildStats.NumChunksRequired);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: ChunksQueuedForDownload: %u"), BuildStats.ChunksQueuedForDownload);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: ChunksLocallyAvailable: %u"), BuildStats.ChunksLocallyAvailable);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: NumChunksDownloaded: %u"), BuildStats.NumChunksDownloaded);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: NumChunksRecycled: %u"), BuildStats.NumChunksRecycled);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: NumChunksCacheBooted: %u"), BuildStats.NumChunksCacheBooted);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: NumDriveCacheChunkLoads: %u"), BuildStats.NumDriveCacheChunkLoads);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: NumRecycleFailures: %u"), BuildStats.NumRecycleFailures);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: NumDriveCacheLoadFailures: %u"), BuildStats.NumDriveCacheLoadFailures);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: TotalDownloadedData: %lld"), BuildStats.TotalDownloadedData);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: AverageDownloadSpeed: %.3f MB/sec"), BuildStats.AverageDownloadSpeed / 1024.0 / 1024.0);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: TheoreticalDownloadTime: %s"), *FPlatformTime::PrettyTime(BuildStats.TheoreticalDownloadTime));
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: VerifyTime: %s"), *FPlatformTime::PrettyTime(BuildStats.VerifyTime));
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: CleanUpTime: %s"), *FPlatformTime::PrettyTime(BuildStats.CleanUpTime));
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: ProcessExecuteTime: %s"), *FPlatformTime::PrettyTime(BuildStats.ProcessExecuteTime));
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: ProcessPausedTime: %.1f sec"), BuildStats.ProcessPausedTime);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: ProcessSuccess: %s"), BuildStats.ProcessSuccess ? TEXT("TRUE") : TEXT("FALSE"));
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: FailureReason: %s"), *BuildStats.FailureReason);
        GLog->Logf(TEXT("BuildPatchServices: Build Stat: FailureReasonText: %s"), *BuildStats.FailureReasonText.BuildSourceString());
    }

    // Mark that we are done
    SetRunning(false);

    return bSuccess ? 0 : 1;
}