diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2021-05-02 17:49:18 -0500 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2021-05-11 19:11:19 -0500 |
commit | 8b8029f15e6e3de2fcf855037fe75dbb765475dc (patch) | |
tree | e48ee1df07f278a7a0414e9bb41d4880a126a9cd /src/burn/engine/core.cpp | |
parent | 4e2054b3ee31b2b9fae3269d76e08817a36fb51f (diff) | |
download | wix-8b8029f15e6e3de2fcf855037fe75dbb765475dc.tar.gz wix-8b8029f15e6e3de2fcf855037fe75dbb765475dc.tar.bz2 wix-8b8029f15e6e3de2fcf855037fe75dbb765475dc.zip |
Synchronize access to cOverallProgressTicks between Cache and Execute.
#4414
Diffstat (limited to 'src/burn/engine/core.cpp')
-rw-r--r-- | src/burn/engine/core.cpp | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/src/burn/engine/core.cpp b/src/burn/engine/core.cpp index 535043af..02cab7e6 100644 --- a/src/burn/engine/core.cpp +++ b/src/burn/engine/core.cpp | |||
@@ -8,8 +8,7 @@ | |||
8 | struct BURN_CACHE_THREAD_CONTEXT | 8 | struct BURN_CACHE_THREAD_CONTEXT |
9 | { | 9 | { |
10 | BURN_ENGINE_STATE* pEngineState; | 10 | BURN_ENGINE_STATE* pEngineState; |
11 | DWORD* pcOverallProgressTicks; | 11 | BURN_APPLY_CONTEXT* pApplyContext; |
12 | BOOL* pfRollback; | ||
13 | }; | 12 | }; |
14 | 13 | ||
15 | 14 | ||
@@ -606,14 +605,13 @@ extern "C" HRESULT CoreApply( | |||
606 | { | 605 | { |
607 | HRESULT hr = S_OK; | 606 | HRESULT hr = S_OK; |
608 | HANDLE hLock = NULL; | 607 | HANDLE hLock = NULL; |
609 | DWORD cOverallProgressTicks = 0; | ||
610 | HANDLE hCacheThread = NULL; | ||
611 | BOOL fApplyInitialize = FALSE; | 608 | BOOL fApplyInitialize = FALSE; |
612 | BOOL fElevated = FALSE; | 609 | BOOL fElevated = FALSE; |
613 | BOOL fRegistered = FALSE; | 610 | BOOL fRegistered = FALSE; |
614 | BOOL fRollback = FALSE; | ||
615 | BOOL fSuspend = FALSE; | 611 | BOOL fSuspend = FALSE; |
616 | BOOTSTRAPPER_APPLY_RESTART restart = BOOTSTRAPPER_APPLY_RESTART_NONE; | 612 | BOOTSTRAPPER_APPLY_RESTART restart = BOOTSTRAPPER_APPLY_RESTART_NONE; |
613 | BURN_APPLY_CONTEXT applyContext = { }; | ||
614 | BOOL fDeleteApplyCs = FALSE; | ||
617 | BURN_CACHE_THREAD_CONTEXT cacheThreadContext = { }; | 615 | BURN_CACHE_THREAD_CONTEXT cacheThreadContext = { }; |
618 | DWORD dwPhaseCount = 0; | 616 | DWORD dwPhaseCount = 0; |
619 | BOOTSTRAPPER_APPLYCOMPLETE_ACTION applyCompleteAction = BOOTSTRAPPER_APPLYCOMPLETE_ACTION_NONE; | 617 | BOOTSTRAPPER_APPLYCOMPLETE_ACTION applyCompleteAction = BOOTSTRAPPER_APPLYCOMPLETE_ACTION_NONE; |
@@ -675,6 +673,9 @@ extern "C" HRESULT CoreApply( | |||
675 | ExitFunction(); | 673 | ExitFunction(); |
676 | } | 674 | } |
677 | 675 | ||
676 | fDeleteApplyCs = TRUE; | ||
677 | ::InitializeCriticalSection(&applyContext.csApply); | ||
678 | |||
678 | // Ensure the engine is cached to the working path. | 679 | // Ensure the engine is cached to the working path. |
679 | if (!pEngineState->sczBundleEngineWorkingPath) | 680 | if (!pEngineState->sczBundleEngineWorkingPath) |
680 | { | 681 | { |
@@ -707,33 +708,32 @@ extern "C" HRESULT CoreApply( | |||
707 | { | 708 | { |
708 | // Launch the cache thread. | 709 | // Launch the cache thread. |
709 | cacheThreadContext.pEngineState = pEngineState; | 710 | cacheThreadContext.pEngineState = pEngineState; |
710 | cacheThreadContext.pcOverallProgressTicks = &cOverallProgressTicks; | 711 | cacheThreadContext.pApplyContext = &applyContext; |
711 | cacheThreadContext.pfRollback = &fRollback; | ||
712 | 712 | ||
713 | hCacheThread = ::CreateThread(NULL, 0, CacheThreadProc, &cacheThreadContext, 0, NULL); | 713 | applyContext.hCacheThread = ::CreateThread(NULL, 0, CacheThreadProc, &cacheThreadContext, 0, NULL); |
714 | ExitOnNullWithLastError(hCacheThread, hr, "Failed to create cache thread."); | 714 | ExitOnNullWithLastError(applyContext.hCacheThread, hr, "Failed to create cache thread."); |
715 | 715 | ||
716 | // If we're not caching in parallel, wait for the cache thread to terminate. | 716 | // If we're not caching in parallel, wait for the cache thread to terminate. |
717 | if (!pEngineState->fParallelCacheAndExecute) | 717 | if (!pEngineState->fParallelCacheAndExecute) |
718 | { | 718 | { |
719 | hr = WaitForCacheThread(hCacheThread); | 719 | hr = WaitForCacheThread(applyContext.hCacheThread); |
720 | ExitOnFailure(hr, "Failed while caching, aborting execution."); | 720 | ExitOnFailure(hr, "Failed while caching, aborting execution."); |
721 | 721 | ||
722 | ReleaseHandle(hCacheThread); | 722 | ReleaseHandle(applyContext.hCacheThread); |
723 | } | 723 | } |
724 | } | 724 | } |
725 | 725 | ||
726 | // Execute. | 726 | // Execute. |
727 | if (pEngineState->plan.cExecuteActions) | 727 | if (pEngineState->plan.cExecuteActions) |
728 | { | 728 | { |
729 | hr = ApplyExecute(pEngineState, hCacheThread, &cOverallProgressTicks, &fRollback, &fSuspend, &restart); | 729 | hr = ApplyExecute(pEngineState, &applyContext, &fSuspend, &restart); |
730 | UserExperienceExecutePhaseComplete(&pEngineState->userExperience, hr); // signal that execute completed. | 730 | UserExperienceExecutePhaseComplete(&pEngineState->userExperience, hr); // signal that execute completed. |
731 | } | 731 | } |
732 | 732 | ||
733 | // Wait for cache thread to terminate, this should return immediately unless we're waiting for layout to complete. | 733 | // Wait for cache thread to terminate, this should return immediately unless we're waiting for layout to complete. |
734 | if (hCacheThread) | 734 | if (applyContext.hCacheThread) |
735 | { | 735 | { |
736 | HRESULT hrCached = WaitForCacheThread(hCacheThread); | 736 | HRESULT hrCached = WaitForCacheThread(applyContext.hCacheThread); |
737 | if (SUCCEEDED(hr)) | 737 | if (SUCCEEDED(hr)) |
738 | { | 738 | { |
739 | hr = hrCached; | 739 | hr = hrCached; |
@@ -741,7 +741,7 @@ extern "C" HRESULT CoreApply( | |||
741 | } | 741 | } |
742 | 742 | ||
743 | // If something went wrong or force restarted, skip cleaning. | 743 | // If something went wrong or force restarted, skip cleaning. |
744 | if (FAILED(hr) || fRollback || fSuspend || BOOTSTRAPPER_APPLY_RESTART_INITIATED == restart) | 744 | if (FAILED(hr) || applyContext.fRollback || fSuspend || BOOTSTRAPPER_APPLY_RESTART_INITIATED == restart) |
745 | { | 745 | { |
746 | ExitFunction(); | 746 | ExitFunction(); |
747 | } | 747 | } |
@@ -756,7 +756,7 @@ LExit: | |||
756 | // Unregister. | 756 | // Unregister. |
757 | if (fRegistered) | 757 | if (fRegistered) |
758 | { | 758 | { |
759 | ApplyUnregister(pEngineState, FAILED(hr) || fRollback, fSuspend, restart); | 759 | ApplyUnregister(pEngineState, FAILED(hr) || applyContext.fRollback, fSuspend, restart); |
760 | } | 760 | } |
761 | 761 | ||
762 | if (fElevated) | 762 | if (fElevated) |
@@ -777,7 +777,12 @@ LExit: | |||
777 | ::CloseHandle(hLock); | 777 | ::CloseHandle(hLock); |
778 | } | 778 | } |
779 | 779 | ||
780 | ReleaseHandle(hCacheThread); | 780 | ReleaseHandle(applyContext.hCacheThread); |
781 | |||
782 | if (fDeleteApplyCs) | ||
783 | { | ||
784 | DeleteCriticalSection(&applyContext.csApply); | ||
785 | } | ||
781 | 786 | ||
782 | UserExperienceOnApplyComplete(&pEngineState->userExperience, hr, restart, &applyCompleteAction); | 787 | UserExperienceOnApplyComplete(&pEngineState->userExperience, hr, restart, &applyCompleteAction); |
783 | if (BOOTSTRAPPER_APPLYCOMPLETE_ACTION_RESTART == applyCompleteAction) | 788 | if (BOOTSTRAPPER_APPLYCOMPLETE_ACTION_RESTART == applyCompleteAction) |
@@ -1712,8 +1717,6 @@ static DWORD WINAPI CacheThreadProc( | |||
1712 | HRESULT hr = S_OK; | 1717 | HRESULT hr = S_OK; |
1713 | BURN_CACHE_THREAD_CONTEXT* pContext = reinterpret_cast<BURN_CACHE_THREAD_CONTEXT*>(lpThreadParameter); | 1718 | BURN_CACHE_THREAD_CONTEXT* pContext = reinterpret_cast<BURN_CACHE_THREAD_CONTEXT*>(lpThreadParameter); |
1714 | BURN_ENGINE_STATE* pEngineState = pContext->pEngineState; | 1719 | BURN_ENGINE_STATE* pEngineState = pContext->pEngineState; |
1715 | DWORD* pcOverallProgressTicks = pContext->pcOverallProgressTicks; | ||
1716 | BOOL* pfRollback = pContext->pfRollback; | ||
1717 | BOOL fComInitialized = FALSE; | 1720 | BOOL fComInitialized = FALSE; |
1718 | 1721 | ||
1719 | // initialize COM | 1722 | // initialize COM |
@@ -1722,7 +1725,7 @@ static DWORD WINAPI CacheThreadProc( | |||
1722 | fComInitialized = TRUE; | 1725 | fComInitialized = TRUE; |
1723 | 1726 | ||
1724 | // cache packages | 1727 | // cache packages |
1725 | hr = ApplyCache(pEngineState->section.hSourceEngineFile, &pEngineState->userExperience, &pEngineState->variables, &pEngineState->plan, pEngineState->companionConnection.hCachePipe, pcOverallProgressTicks, pfRollback); | 1728 | hr = ApplyCache(pEngineState->section.hSourceEngineFile, &pEngineState->userExperience, &pEngineState->variables, &pEngineState->plan, pEngineState->companionConnection.hCachePipe, pContext->pApplyContext); |
1726 | 1729 | ||
1727 | LExit: | 1730 | LExit: |
1728 | UserExperienceExecutePhaseComplete(&pEngineState->userExperience, hr); // signal that cache completed. | 1731 | UserExperienceExecutePhaseComplete(&pEngineState->userExperience, hr); // signal that cache completed. |