diff options
Diffstat (limited to 'src/burn/engine/core.cpp')
| -rw-r--r-- | src/burn/engine/core.cpp | 54 |
1 files changed, 28 insertions, 26 deletions
diff --git a/src/burn/engine/core.cpp b/src/burn/engine/core.cpp index c1e3a12c..716e5af1 100644 --- a/src/burn/engine/core.cpp +++ b/src/burn/engine/core.cpp | |||
| @@ -12,6 +12,9 @@ struct BURN_CACHE_THREAD_CONTEXT | |||
| 12 | }; | 12 | }; |
| 13 | 13 | ||
| 14 | 14 | ||
| 15 | static PFN_PROCWAITFORCOMPLETION vpfnProcWaitForCompletion = ProcWaitForCompletion; | ||
| 16 | |||
| 17 | |||
| 15 | // internal function declarations | 18 | // internal function declarations |
| 16 | 19 | ||
| 17 | static HRESULT CoreRecreateCommandLine( | 20 | static HRESULT CoreRecreateCommandLine( |
| @@ -65,9 +68,6 @@ static HRESULT DetectPackagePayloadsCached( | |||
| 65 | static DWORD WINAPI CacheThreadProc( | 68 | static DWORD WINAPI CacheThreadProc( |
| 66 | __in LPVOID lpThreadParameter | 69 | __in LPVOID lpThreadParameter |
| 67 | ); | 70 | ); |
| 68 | static HRESULT WaitForCacheThread( | ||
| 69 | __in HANDLE hCacheThread | ||
| 70 | ); | ||
| 71 | static void LogPackages( | 71 | static void LogPackages( |
| 72 | __in_opt const BURN_PACKAGE* pUpgradeBundlePackage, | 72 | __in_opt const BURN_PACKAGE* pUpgradeBundlePackage, |
| 73 | __in_opt const BURN_PACKAGE* pForwardCompatibleBundlePackage, | 73 | __in_opt const BURN_PACKAGE* pForwardCompatibleBundlePackage, |
| @@ -636,6 +636,7 @@ extern "C" HRESULT CoreApply( | |||
| 636 | BURN_APPLY_CONTEXT applyContext = { }; | 636 | BURN_APPLY_CONTEXT applyContext = { }; |
| 637 | BOOL fDeleteApplyCs = FALSE; | 637 | BOOL fDeleteApplyCs = FALSE; |
| 638 | BURN_CACHE_THREAD_CONTEXT cacheThreadContext = { }; | 638 | BURN_CACHE_THREAD_CONTEXT cacheThreadContext = { }; |
| 639 | DWORD dwCacheExitCode = 0; | ||
| 639 | BOOL fRollbackCache = FALSE; | 640 | BOOL fRollbackCache = FALSE; |
| 640 | DWORD dwPhaseCount = 0; | 641 | DWORD dwPhaseCount = 0; |
| 641 | BOOTSTRAPPER_APPLYCOMPLETE_ACTION applyCompleteAction = BOOTSTRAPPER_APPLYCOMPLETE_ACTION_NONE; | 642 | BOOTSTRAPPER_APPLYCOMPLETE_ACTION applyCompleteAction = BOOTSTRAPPER_APPLYCOMPLETE_ACTION_NONE; |
| @@ -744,7 +745,10 @@ extern "C" HRESULT CoreApply( | |||
| 744 | // If we're not caching in parallel, wait for the cache thread to terminate. | 745 | // If we're not caching in parallel, wait for the cache thread to terminate. |
| 745 | if (!pEngineState->fParallelCacheAndExecute) | 746 | if (!pEngineState->fParallelCacheAndExecute) |
| 746 | { | 747 | { |
| 747 | hr = WaitForCacheThread(applyContext.hCacheThread); | 748 | hr = ThrdWaitForCompletion(applyContext.hCacheThread, INFINITE, &dwCacheExitCode); |
| 749 | ExitOnFailure(hr, "Failed to wait for cache thread before execute."); | ||
| 750 | |||
| 751 | hr = (HRESULT)dwCacheExitCode; | ||
| 748 | ExitOnFailure(hr, "Failed while caching, aborting execution."); | 752 | ExitOnFailure(hr, "Failed while caching, aborting execution."); |
| 749 | 753 | ||
| 750 | ReleaseHandle(applyContext.hCacheThread); | 754 | ReleaseHandle(applyContext.hCacheThread); |
| @@ -761,10 +765,12 @@ extern "C" HRESULT CoreApply( | |||
| 761 | // Wait for cache thread to terminate, this should return immediately unless we're waiting for layout to complete. | 765 | // Wait for cache thread to terminate, this should return immediately unless we're waiting for layout to complete. |
| 762 | if (applyContext.hCacheThread) | 766 | if (applyContext.hCacheThread) |
| 763 | { | 767 | { |
| 764 | HRESULT hrCached = WaitForCacheThread(applyContext.hCacheThread); | 768 | HRESULT hrCached = ThrdWaitForCompletion(applyContext.hCacheThread, INFINITE, &dwCacheExitCode); |
| 769 | ExitOnFailure(hrCached, "Failed to wait for cache thread after execute."); | ||
| 770 | |||
| 765 | if (SUCCEEDED(hr)) | 771 | if (SUCCEEDED(hr)) |
| 766 | { | 772 | { |
| 767 | hr = hrCached; | 773 | hr = (HRESULT)dwCacheExitCode; |
| 768 | } | 774 | } |
| 769 | } | 775 | } |
| 770 | 776 | ||
| @@ -1940,6 +1946,22 @@ LExit: | |||
| 1940 | return hr; | 1946 | return hr; |
| 1941 | } | 1947 | } |
| 1942 | 1948 | ||
| 1949 | extern "C" void CoreFunctionOverride( | ||
| 1950 | __in_opt PFN_PROCWAITFORCOMPLETION pfnProcWaitForCompletion | ||
| 1951 | ) | ||
| 1952 | { | ||
| 1953 | vpfnProcWaitForCompletion = pfnProcWaitForCompletion; | ||
| 1954 | } | ||
| 1955 | |||
| 1956 | extern "C" HRESULT DAPI CoreWaitForProcCompletion( | ||
| 1957 | __in HANDLE hProcess, | ||
| 1958 | __in DWORD dwTimeout, | ||
| 1959 | __out DWORD* pdwReturnCode | ||
| 1960 | ) | ||
| 1961 | { | ||
| 1962 | return vpfnProcWaitForCompletion(hProcess, dwTimeout, pdwReturnCode); | ||
| 1963 | } | ||
| 1964 | |||
| 1943 | // internal helper functions | 1965 | // internal helper functions |
| 1944 | 1966 | ||
| 1945 | static HRESULT AppendEscapedArgumentToCommandLine( | 1967 | static HRESULT AppendEscapedArgumentToCommandLine( |
| @@ -2268,26 +2290,6 @@ LExit: | |||
| 2268 | return (DWORD)hr; | 2290 | return (DWORD)hr; |
| 2269 | } | 2291 | } |
| 2270 | 2292 | ||
| 2271 | static HRESULT WaitForCacheThread( | ||
| 2272 | __in HANDLE hCacheThread | ||
| 2273 | ) | ||
| 2274 | { | ||
| 2275 | HRESULT hr = S_OK; | ||
| 2276 | |||
| 2277 | if (WAIT_OBJECT_0 != ::WaitForSingleObject(hCacheThread, INFINITE)) | ||
| 2278 | { | ||
| 2279 | ExitWithLastError(hr, "Failed to wait for cache thread to terminate."); | ||
| 2280 | } | ||
| 2281 | |||
| 2282 | if (!::GetExitCodeThread(hCacheThread, (DWORD*)&hr)) | ||
| 2283 | { | ||
| 2284 | ExitWithLastError(hr, "Failed to get cache thread exit code."); | ||
| 2285 | } | ||
| 2286 | |||
| 2287 | LExit: | ||
| 2288 | return hr; | ||
| 2289 | } | ||
| 2290 | |||
| 2291 | static void LogPackages( | 2293 | static void LogPackages( |
| 2292 | __in_opt const BURN_PACKAGE* pUpgradeBundlePackage, | 2294 | __in_opt const BURN_PACKAGE* pUpgradeBundlePackage, |
| 2293 | __in_opt const BURN_PACKAGE* pForwardCompatibleBundlePackage, | 2295 | __in_opt const BURN_PACKAGE* pForwardCompatibleBundlePackage, |
