diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2021-05-04 19:25:07 -0500 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2021-05-11 19:11:19 -0500 |
commit | 27c6decae94536cae338731b6cb765aa92776486 (patch) | |
tree | cabfb05464fdc64e30597da28a54113fc3a62da1 /src/burn/engine/plan.cpp | |
parent | a2f2036c8598efcb434eebeeacd7ede84ab60dfe (diff) | |
download | wix-27c6decae94536cae338731b6cb765aa92776486.tar.gz wix-27c6decae94536cae338731b6cb765aa92776486.tar.bz2 wix-27c6decae94536cae338731b6cb765aa92776486.zip |
Put back the rollback cache package functionality and fix its bugs.
#3719, #4711, #5750
Diffstat (limited to 'src/burn/engine/plan.cpp')
-rw-r--r-- | src/burn/engine/plan.cpp | 128 |
1 files changed, 46 insertions, 82 deletions
diff --git a/src/burn/engine/plan.cpp b/src/burn/engine/plan.cpp index f0ae2a44..d1f07508 100644 --- a/src/burn/engine/plan.cpp +++ b/src/burn/engine/plan.cpp | |||
@@ -55,7 +55,6 @@ static HRESULT ProcessPackage( | |||
55 | __in BURN_LOGGING* pLog, | 55 | __in BURN_LOGGING* pLog, |
56 | __in BURN_VARIABLES* pVariables, | 56 | __in BURN_VARIABLES* pVariables, |
57 | __in BOOTSTRAPPER_DISPLAY display, | 57 | __in BOOTSTRAPPER_DISPLAY display, |
58 | __inout HANDLE* phSyncpointEvent, | ||
59 | __inout BURN_ROLLBACK_BOUNDARY** ppRollbackBoundary | 58 | __inout BURN_ROLLBACK_BOUNDARY** ppRollbackBoundary |
60 | ); | 59 | ); |
61 | static HRESULT ProcessPackageRollbackBoundary( | 60 | static HRESULT ProcessPackageRollbackBoundary( |
@@ -77,23 +76,16 @@ static HRESULT AddRegistrationAction( | |||
77 | ); | 76 | ); |
78 | static HRESULT AddCachePackage( | 77 | static HRESULT AddCachePackage( |
79 | __in BURN_PLAN* pPlan, | 78 | __in BURN_PLAN* pPlan, |
80 | __in BURN_PACKAGE* pPackage, | 79 | __in BURN_PACKAGE* pPackage |
81 | __out HANDLE* phSyncpointEvent | ||
82 | ); | 80 | ); |
83 | static HRESULT AddCachePackageHelper( | 81 | static HRESULT AddCachePackageHelper( |
84 | __in BURN_PLAN* pPlan, | 82 | __in BURN_PLAN* pPlan, |
85 | __in BURN_PACKAGE* pPackage, | 83 | __in BURN_PACKAGE* pPackage |
86 | __out HANDLE* phSyncpointEvent | ||
87 | ); | 84 | ); |
88 | static HRESULT AddCacheSlipstreamMsps( | 85 | static HRESULT AddCacheSlipstreamMsps( |
89 | __in BURN_PLAN* pPlan, | 86 | __in BURN_PLAN* pPlan, |
90 | __in BURN_PACKAGE* pPackage | 87 | __in BURN_PACKAGE* pPackage |
91 | ); | 88 | ); |
92 | static BOOL AlreadyPlannedCachePackage( | ||
93 | __in BURN_PLAN* pPlan, | ||
94 | __in_z LPCWSTR wzPackageId, | ||
95 | __out HANDLE* phSyncpointEvent | ||
96 | ); | ||
97 | static DWORD GetNextCheckpointId( | 89 | static DWORD GetNextCheckpointId( |
98 | __in BURN_PLAN* pPlan | 90 | __in BURN_PLAN* pPlan |
99 | ); | 91 | ); |
@@ -765,7 +757,6 @@ static HRESULT PlanPackagesHelper( | |||
765 | HRESULT hr = S_OK; | 757 | HRESULT hr = S_OK; |
766 | BOOL fBundlePerMachine = pPlan->fPerMachine; // bundle is per-machine if plan starts per-machine. | 758 | BOOL fBundlePerMachine = pPlan->fPerMachine; // bundle is per-machine if plan starts per-machine. |
767 | BURN_ROLLBACK_BOUNDARY* pRollbackBoundary = NULL; | 759 | BURN_ROLLBACK_BOUNDARY* pRollbackBoundary = NULL; |
768 | HANDLE hSyncpointEvent = NULL; | ||
769 | 760 | ||
770 | // Initialize the packages. | 761 | // Initialize the packages. |
771 | for (DWORD i = 0; i < cPackages; ++i) | 762 | for (DWORD i = 0; i < cPackages; ++i) |
@@ -796,7 +787,7 @@ static HRESULT PlanPackagesHelper( | |||
796 | DWORD iPackage = (BOOTSTRAPPER_ACTION_UNINSTALL == pPlan->action) ? cPackages - 1 - i : i; | 787 | DWORD iPackage = (BOOTSTRAPPER_ACTION_UNINSTALL == pPlan->action) ? cPackages - 1 - i : i; |
797 | BURN_PACKAGE* pPackage = rgPackages + iPackage; | 788 | BURN_PACKAGE* pPackage = rgPackages + iPackage; |
798 | 789 | ||
799 | hr = ProcessPackage(fBundlePerMachine, pUX, pPlan, pPackage, pLog, pVariables, display, &hSyncpointEvent, &pRollbackBoundary); | 790 | hr = ProcessPackage(fBundlePerMachine, pUX, pPlan, pPackage, pLog, pVariables, display, &pRollbackBoundary); |
800 | ExitOnFailure(hr, "Failed to process package."); | 791 | ExitOnFailure(hr, "Failed to process package."); |
801 | } | 792 | } |
802 | 793 | ||
@@ -902,7 +893,6 @@ static HRESULT ProcessPackage( | |||
902 | __in BURN_LOGGING* pLog, | 893 | __in BURN_LOGGING* pLog, |
903 | __in BURN_VARIABLES* pVariables, | 894 | __in BURN_VARIABLES* pVariables, |
904 | __in BOOTSTRAPPER_DISPLAY display, | 895 | __in BOOTSTRAPPER_DISPLAY display, |
905 | __inout HANDLE* phSyncpointEvent, | ||
906 | __inout BURN_ROLLBACK_BOUNDARY** ppRollbackBoundary | 896 | __inout BURN_ROLLBACK_BOUNDARY** ppRollbackBoundary |
907 | ) | 897 | ) |
908 | { | 898 | { |
@@ -926,14 +916,14 @@ static HRESULT ProcessPackage( | |||
926 | if (BOOTSTRAPPER_REQUEST_STATE_NONE != pPackage->requested) | 916 | if (BOOTSTRAPPER_REQUEST_STATE_NONE != pPackage->requested) |
927 | { | 917 | { |
928 | // If the package is in a requested state, plan it. | 918 | // If the package is in a requested state, plan it. |
929 | hr = PlanExecutePackage(fBundlePerMachine, display, pUX, pPlan, pPackage, pLog, pVariables, phSyncpointEvent); | 919 | hr = PlanExecutePackage(fBundlePerMachine, display, pUX, pPlan, pPackage, pLog, pVariables); |
930 | ExitOnFailure(hr, "Failed to plan execute package."); | 920 | ExitOnFailure(hr, "Failed to plan execute package."); |
931 | } | 921 | } |
932 | else | 922 | else |
933 | { | 923 | { |
934 | if (ForceCache(pPlan, pPackage)) | 924 | if (ForceCache(pPlan, pPackage)) |
935 | { | 925 | { |
936 | hr = AddCachePackage(pPlan, pPackage, phSyncpointEvent); | 926 | hr = AddCachePackage(pPlan, pPackage); |
937 | ExitOnFailure(hr, "Failed to plan cache package."); | 927 | ExitOnFailure(hr, "Failed to plan cache package."); |
938 | 928 | ||
939 | if (pPackage->fPerMachine) | 929 | if (pPackage->fPerMachine) |
@@ -1072,8 +1062,7 @@ extern "C" HRESULT PlanExecutePackage( | |||
1072 | __in BURN_PLAN* pPlan, | 1062 | __in BURN_PLAN* pPlan, |
1073 | __in BURN_PACKAGE* pPackage, | 1063 | __in BURN_PACKAGE* pPackage, |
1074 | __in BURN_LOGGING* pLog, | 1064 | __in BURN_LOGGING* pLog, |
1075 | __in BURN_VARIABLES* pVariables, | 1065 | __in BURN_VARIABLES* pVariables |
1076 | __inout HANDLE* phSyncpointEvent | ||
1077 | ) | 1066 | ) |
1078 | { | 1067 | { |
1079 | HRESULT hr = S_OK; | 1068 | HRESULT hr = S_OK; |
@@ -1088,7 +1077,7 @@ extern "C" HRESULT PlanExecutePackage( | |||
1088 | 1077 | ||
1089 | if (fRequestedCache || NeedsCache(pPackage, TRUE)) | 1078 | if (fRequestedCache || NeedsCache(pPackage, TRUE)) |
1090 | { | 1079 | { |
1091 | hr = AddCachePackage(pPlan, pPackage, phSyncpointEvent); | 1080 | hr = AddCachePackage(pPlan, pPackage); |
1092 | ExitOnFailure(hr, "Failed to plan cache package."); | 1081 | ExitOnFailure(hr, "Failed to plan cache package."); |
1093 | } | 1082 | } |
1094 | else if (!pPackage->fCached && NeedsCache(pPackage, FALSE)) | 1083 | else if (!pPackage->fCached && NeedsCache(pPackage, FALSE)) |
@@ -1128,19 +1117,19 @@ extern "C" HRESULT PlanExecutePackage( | |||
1128 | switch (pPackage->type) | 1117 | switch (pPackage->type) |
1129 | { | 1118 | { |
1130 | case BURN_PACKAGE_TYPE_EXE: | 1119 | case BURN_PACKAGE_TYPE_EXE: |
1131 | hr = ExeEnginePlanAddPackage(NULL, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent); | 1120 | hr = ExeEnginePlanAddPackage(NULL, pPackage, pPlan, pLog, pVariables); |
1132 | break; | 1121 | break; |
1133 | 1122 | ||
1134 | case BURN_PACKAGE_TYPE_MSI: | 1123 | case BURN_PACKAGE_TYPE_MSI: |
1135 | hr = MsiEnginePlanAddPackage(display, pUserExperience, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent); | 1124 | hr = MsiEnginePlanAddPackage(display, pUserExperience, pPackage, pPlan, pLog, pVariables); |
1136 | break; | 1125 | break; |
1137 | 1126 | ||
1138 | case BURN_PACKAGE_TYPE_MSP: | 1127 | case BURN_PACKAGE_TYPE_MSP: |
1139 | hr = MspEnginePlanAddPackage(display, pUserExperience, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent); | 1128 | hr = MspEnginePlanAddPackage(display, pUserExperience, pPackage, pPlan, pLog, pVariables); |
1140 | break; | 1129 | break; |
1141 | 1130 | ||
1142 | case BURN_PACKAGE_TYPE_MSU: | 1131 | case BURN_PACKAGE_TYPE_MSU: |
1143 | hr = MsuEnginePlanAddPackage(pPackage, pPlan, pLog, pVariables, *phSyncpointEvent); | 1132 | hr = MsuEnginePlanAddPackage(pPackage, pPlan, pLog, pVariables); |
1144 | break; | 1133 | break; |
1145 | 1134 | ||
1146 | default: | 1135 | default: |
@@ -1453,7 +1442,7 @@ extern "C" HRESULT PlanRelatedBundlesComplete( | |||
1453 | } | 1442 | } |
1454 | } | 1443 | } |
1455 | 1444 | ||
1456 | hr = ExeEnginePlanAddPackage(pdwInsertIndex, &pRelatedBundle->package, pPlan, pLog, pVariables, NULL); | 1445 | hr = ExeEnginePlanAddPackage(pdwInsertIndex, &pRelatedBundle->package, pPlan, pLog, pVariables); |
1457 | ExitOnFailure(hr, "Failed to add to plan related bundle: %ls", pRelatedBundle->package.sczId); | 1446 | ExitOnFailure(hr, "Failed to add to plan related bundle: %ls", pRelatedBundle->package.sczId); |
1458 | 1447 | ||
1459 | // Calculate package states based on reference count for addon and patch related bundles. | 1448 | // Calculate package states based on reference count for addon and patch related bundles. |
@@ -1583,28 +1572,30 @@ LExit: | |||
1583 | 1572 | ||
1584 | extern "C" HRESULT PlanExecuteCacheSyncAndRollback( | 1573 | extern "C" HRESULT PlanExecuteCacheSyncAndRollback( |
1585 | __in BURN_PLAN* pPlan, | 1574 | __in BURN_PLAN* pPlan, |
1586 | __in BURN_PACKAGE* pPackage, | 1575 | __in BURN_PACKAGE* pPackage |
1587 | __in HANDLE hCacheEvent | ||
1588 | ) | 1576 | ) |
1589 | { | 1577 | { |
1590 | HRESULT hr = S_OK; | 1578 | HRESULT hr = S_OK; |
1591 | BURN_EXECUTE_ACTION* pAction = NULL; | 1579 | BURN_EXECUTE_ACTION* pAction = NULL; |
1592 | 1580 | ||
1593 | hr = PlanAppendExecuteAction(pPlan, &pAction); | 1581 | if (!pPlan->fBundleAlreadyRegistered) |
1594 | ExitOnFailure(hr, "Failed to append wait action for caching."); | 1582 | { |
1595 | 1583 | hr = PlanAppendRollbackAction(pPlan, &pAction); | |
1596 | pAction->type = BURN_EXECUTE_ACTION_TYPE_WAIT_SYNCPOINT; | 1584 | ExitOnFailure(hr, "Failed to append rollback action."); |
1597 | pAction->syncpoint.hEvent = hCacheEvent; | ||
1598 | |||
1599 | hr = PlanAppendRollbackAction(pPlan, &pAction); | ||
1600 | ExitOnFailure(hr, "Failed to append rollback action."); | ||
1601 | 1585 | ||
1602 | pAction->type = BURN_EXECUTE_ACTION_TYPE_UNCACHE_PACKAGE; | 1586 | pAction->type = BURN_EXECUTE_ACTION_TYPE_UNCACHE_PACKAGE; |
1603 | pAction->uncachePackage.pPackage = pPackage; | 1587 | pAction->uncachePackage.pPackage = pPackage; |
1588 | } | ||
1604 | 1589 | ||
1605 | hr = PlanExecuteCheckpoint(pPlan); | 1590 | hr = PlanExecuteCheckpoint(pPlan); |
1606 | ExitOnFailure(hr, "Failed to append execute checkpoint for cache rollback."); | 1591 | ExitOnFailure(hr, "Failed to append execute checkpoint for cache rollback."); |
1607 | 1592 | ||
1593 | hr = PlanAppendExecuteAction(pPlan, &pAction); | ||
1594 | ExitOnFailure(hr, "Failed to append wait action for caching."); | ||
1595 | |||
1596 | pAction->type = BURN_EXECUTE_ACTION_TYPE_WAIT_CACHE_PACKAGE; | ||
1597 | pAction->waitCachePackage.pPackage = pPackage; | ||
1598 | |||
1608 | LExit: | 1599 | LExit: |
1609 | return hr; | 1600 | return hr; |
1610 | } | 1601 | } |
@@ -1885,6 +1876,7 @@ static void ResetPlannedPackageState( | |||
1885 | pPackage->fDependencyManagerWasHere = FALSE; | 1876 | pPackage->fDependencyManagerWasHere = FALSE; |
1886 | pPackage->expectedCacheRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN; | 1877 | pPackage->expectedCacheRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN; |
1887 | pPackage->expectedInstallRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN; | 1878 | pPackage->expectedInstallRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN; |
1879 | pPackage->hCacheEvent = NULL; | ||
1888 | 1880 | ||
1889 | ReleaseNullStr(pPackage->sczCacheFolder); | 1881 | ReleaseNullStr(pPackage->sczCacheFolder); |
1890 | 1882 | ||
@@ -2046,8 +2038,7 @@ LExit: | |||
2046 | 2038 | ||
2047 | static HRESULT AddCachePackage( | 2039 | static HRESULT AddCachePackage( |
2048 | __in BURN_PLAN* pPlan, | 2040 | __in BURN_PLAN* pPlan, |
2049 | __in BURN_PACKAGE* pPackage, | 2041 | __in BURN_PACKAGE* pPackage |
2050 | __out HANDLE* phSyncpointEvent | ||
2051 | ) | 2042 | ) |
2052 | { | 2043 | { |
2053 | HRESULT hr = S_OK; | 2044 | HRESULT hr = S_OK; |
@@ -2059,7 +2050,7 @@ static HRESULT AddCachePackage( | |||
2059 | ExitOnFailure(hr, "Failed to plan slipstream patches for package."); | 2050 | ExitOnFailure(hr, "Failed to plan slipstream patches for package."); |
2060 | } | 2051 | } |
2061 | 2052 | ||
2062 | hr = AddCachePackageHelper(pPlan, pPackage, phSyncpointEvent); | 2053 | hr = AddCachePackageHelper(pPlan, pPackage); |
2063 | ExitOnFailure(hr, "Failed to plan cache package."); | 2054 | ExitOnFailure(hr, "Failed to plan cache package."); |
2064 | 2055 | ||
2065 | LExit: | 2056 | LExit: |
@@ -2068,8 +2059,7 @@ LExit: | |||
2068 | 2059 | ||
2069 | static HRESULT AddCachePackageHelper( | 2060 | static HRESULT AddCachePackageHelper( |
2070 | __in BURN_PLAN* pPlan, | 2061 | __in BURN_PLAN* pPlan, |
2071 | __in BURN_PACKAGE* pPackage, | 2062 | __in BURN_PACKAGE* pPackage |
2072 | __out HANDLE* phSyncpointEvent | ||
2073 | ) | 2063 | ) |
2074 | { | 2064 | { |
2075 | AssertSz(pPackage->sczCacheId && *pPackage->sczCacheId, "AddCachePackageHelper() expects the package to have a cache id."); | 2065 | AssertSz(pPackage->sczCacheId && *pPackage->sczCacheId, "AddCachePackageHelper() expects the package to have a cache id."); |
@@ -2083,8 +2073,7 @@ static HRESULT AddCachePackageHelper( | |||
2083 | ExitFunction(); | 2073 | ExitFunction(); |
2084 | } | 2074 | } |
2085 | 2075 | ||
2086 | BOOL fPlanned = AlreadyPlannedCachePackage(pPlan, pPackage->sczId, phSyncpointEvent); | 2076 | if (pPackage->hCacheEvent) // Only cache the package once. |
2087 | if (fPlanned) | ||
2088 | { | 2077 | { |
2089 | ExitFunction(); | 2078 | ExitFunction(); |
2090 | } | 2079 | } |
@@ -2100,12 +2089,15 @@ static HRESULT AddCachePackageHelper( | |||
2100 | pCacheAction->type = BURN_CACHE_ACTION_TYPE_CHECKPOINT; | 2089 | pCacheAction->type = BURN_CACHE_ACTION_TYPE_CHECKPOINT; |
2101 | pCacheAction->checkpoint.dwId = dwCheckpoint; | 2090 | pCacheAction->checkpoint.dwId = dwCheckpoint; |
2102 | 2091 | ||
2103 | // Only plan the cache rollback if the package is also going to be uninstalled; | 2092 | if (!pPlan->fBundleAlreadyRegistered) |
2104 | // otherwise, future operations like repair will not be able to locate the cached package. | ||
2105 | BOOL fPlanCacheRollback = (BOOTSTRAPPER_ACTION_STATE_UNINSTALL == pPackage->rollback); | ||
2106 | |||
2107 | if (fPlanCacheRollback) | ||
2108 | { | 2093 | { |
2094 | // Create a package cache rollback action *before* the checkpoint. | ||
2095 | hr = AppendRollbackCacheAction(pPlan, &pCacheAction); | ||
2096 | ExitOnFailure(hr, "Failed to append rollback cache action."); | ||
2097 | |||
2098 | pCacheAction->type = BURN_CACHE_ACTION_TYPE_ROLLBACK_PACKAGE; | ||
2099 | pCacheAction->rollbackPackage.pPackage = pPackage; | ||
2100 | |||
2109 | hr = AppendRollbackCacheAction(pPlan, &pCacheAction); | 2101 | hr = AppendRollbackCacheAction(pPlan, &pCacheAction); |
2110 | ExitOnFailure(hr, "Failed to append rollback cache action."); | 2102 | ExitOnFailure(hr, "Failed to append rollback cache action."); |
2111 | 2103 | ||
@@ -2124,7 +2116,10 @@ static HRESULT AddCachePackageHelper( | |||
2124 | pCacheAction->syncpoint.hEvent = ::CreateEventW(NULL, TRUE, FALSE, NULL); | 2116 | pCacheAction->syncpoint.hEvent = ::CreateEventW(NULL, TRUE, FALSE, NULL); |
2125 | ExitOnNullWithLastError(pCacheAction->syncpoint.hEvent, hr, "Failed to create syncpoint event."); | 2117 | ExitOnNullWithLastError(pCacheAction->syncpoint.hEvent, hr, "Failed to create syncpoint event."); |
2126 | 2118 | ||
2127 | *phSyncpointEvent = pCacheAction->syncpoint.hEvent; | 2119 | pPackage->hCacheEvent = pCacheAction->syncpoint.hEvent; |
2120 | |||
2121 | hr = PlanExecuteCacheSyncAndRollback(pPlan, pPackage); | ||
2122 | ExitOnFailure(hr, "Failed to plan package cache syncpoint"); | ||
2128 | 2123 | ||
2129 | pPackage->fPlannedCache = TRUE; | 2124 | pPackage->fPlannedCache = TRUE; |
2130 | if (pPackage->fCanAffectRegistration) | 2125 | if (pPackage->fCanAffectRegistration) |
@@ -2142,7 +2137,6 @@ static HRESULT AddCacheSlipstreamMsps( | |||
2142 | ) | 2137 | ) |
2143 | { | 2138 | { |
2144 | HRESULT hr = S_OK; | 2139 | HRESULT hr = S_OK; |
2145 | HANDLE hIgnored = NULL; | ||
2146 | 2140 | ||
2147 | AssertSz(BURN_PACKAGE_TYPE_MSI == pPackage->type, "Only MSI packages can have slipstream patches."); | 2141 | AssertSz(BURN_PACKAGE_TYPE_MSI == pPackage->type, "Only MSI packages can have slipstream patches."); |
2148 | 2142 | ||
@@ -2151,7 +2145,7 @@ static HRESULT AddCacheSlipstreamMsps( | |||
2151 | BURN_PACKAGE* pMspPackage = pPackage->Msi.rgSlipstreamMsps[i].pMspPackage; | 2145 | BURN_PACKAGE* pMspPackage = pPackage->Msi.rgSlipstreamMsps[i].pMspPackage; |
2152 | AssertSz(BURN_PACKAGE_TYPE_MSP == pMspPackage->type, "Only MSP packages can be slipstream patches."); | 2146 | AssertSz(BURN_PACKAGE_TYPE_MSP == pMspPackage->type, "Only MSP packages can be slipstream patches."); |
2153 | 2147 | ||
2154 | hr = AddCachePackageHelper(pPlan, pMspPackage, &hIgnored); | 2148 | hr = AddCachePackageHelper(pPlan, pMspPackage); |
2155 | ExitOnFailure(hr, "Failed to plan slipstream MSP: %ls", pMspPackage->sczId); | 2149 | ExitOnFailure(hr, "Failed to plan slipstream MSP: %ls", pMspPackage->sczId); |
2156 | } | 2150 | } |
2157 | 2151 | ||
@@ -2159,36 +2153,6 @@ LExit: | |||
2159 | return hr; | 2153 | return hr; |
2160 | } | 2154 | } |
2161 | 2155 | ||
2162 | static BOOL AlreadyPlannedCachePackage( | ||
2163 | __in BURN_PLAN* pPlan, | ||
2164 | __in_z LPCWSTR wzPackageId, | ||
2165 | __out HANDLE* phSyncpointEvent | ||
2166 | ) | ||
2167 | { | ||
2168 | BOOL fPlanned = FALSE; | ||
2169 | |||
2170 | for (DWORD iCacheAction = 0; iCacheAction < pPlan->cCacheActions; ++iCacheAction) | ||
2171 | { | ||
2172 | BURN_CACHE_ACTION* pCacheAction = pPlan->rgCacheActions + iCacheAction; | ||
2173 | |||
2174 | if (BURN_CACHE_ACTION_TYPE_PACKAGE == pCacheAction->type) | ||
2175 | { | ||
2176 | if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, pCacheAction->package.pPackage->sczId, -1, wzPackageId, -1)) | ||
2177 | { | ||
2178 | if (iCacheAction + 1 < pPlan->cCacheActions && BURN_CACHE_ACTION_TYPE_SIGNAL_SYNCPOINT == pPlan->rgCacheActions[iCacheAction + 1].type) | ||
2179 | { | ||
2180 | *phSyncpointEvent = pPlan->rgCacheActions[iCacheAction + 1].syncpoint.hEvent; | ||
2181 | } | ||
2182 | |||
2183 | fPlanned = TRUE; | ||
2184 | break; | ||
2185 | } | ||
2186 | } | ||
2187 | } | ||
2188 | |||
2189 | return fPlanned; | ||
2190 | } | ||
2191 | |||
2192 | static DWORD GetNextCheckpointId( | 2156 | static DWORD GetNextCheckpointId( |
2193 | __in BURN_PLAN* pPlan | 2157 | __in BURN_PLAN* pPlan |
2194 | ) | 2158 | ) |
@@ -2635,8 +2599,8 @@ static void ExecuteActionLog( | |||
2635 | LogStringLine(PlanDumpLevel, "%ls action[%u]: ROLLBACK_BOUNDARY id: %ls, vital: %ls", wzBase, iAction, pAction->rollbackBoundary.pRollbackBoundary->sczId, pAction->rollbackBoundary.pRollbackBoundary->fVital ? L"yes" : L"no"); | 2599 | LogStringLine(PlanDumpLevel, "%ls action[%u]: ROLLBACK_BOUNDARY id: %ls, vital: %ls", wzBase, iAction, pAction->rollbackBoundary.pRollbackBoundary->sczId, pAction->rollbackBoundary.pRollbackBoundary->fVital ? L"yes" : L"no"); |
2636 | break; | 2600 | break; |
2637 | 2601 | ||
2638 | case BURN_EXECUTE_ACTION_TYPE_WAIT_SYNCPOINT: | 2602 | case BURN_EXECUTE_ACTION_TYPE_WAIT_CACHE_PACKAGE: |
2639 | LogStringLine(PlanDumpLevel, "%ls action[%u]: WAIT_SYNCPOINT event handle: 0x%p", wzBase, iAction, pAction->syncpoint.hEvent); | 2603 | LogStringLine(PlanDumpLevel, "%ls action[%u]: WAIT_CACHE_PACKAGE id: %ls, event handle: 0x%p", wzBase, iAction, pAction->waitCachePackage.pPackage->sczId, pAction->waitCachePackage.pPackage->hCacheEvent); |
2640 | break; | 2604 | break; |
2641 | 2605 | ||
2642 | case BURN_EXECUTE_ACTION_TYPE_UNCACHE_PACKAGE: | 2606 | case BURN_EXECUTE_ACTION_TYPE_UNCACHE_PACKAGE: |