aboutsummaryrefslogtreecommitdiff
path: root/src/burn/engine/elevation.cpp
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2021-05-02 16:48:40 -0500
committerSean Hall <r.sean.hall@gmail.com>2021-05-11 19:11:19 -0500
commit4e2054b3ee31b2b9fae3269d76e08817a36fb51f (patch)
treee8c1f89225061d1fc253b444f9c3cac50118eeb9 /src/burn/engine/elevation.cpp
parent5cb01b477d85920662112d63b5a44b75c03762a9 (diff)
downloadwix-4e2054b3ee31b2b9fae3269d76e08817a36fb51f.tar.gz
wix-4e2054b3ee31b2b9fae3269d76e08817a36fb51f.tar.bz2
wix-4e2054b3ee31b2b9fae3269d76e08817a36fb51f.zip
Reset the package's cache folder only once.
This behavior makes it work similar to the root package cache folder and avoids performance problems when there are many payloads in the package. #4774
Diffstat (limited to 'src/burn/engine/elevation.cpp')
-rw-r--r--src/burn/engine/elevation.cpp82
1 files changed, 77 insertions, 5 deletions
diff --git a/src/burn/engine/elevation.cpp b/src/burn/engine/elevation.cpp
index 9d1b8fc7..85e4b692 100644
--- a/src/burn/engine/elevation.cpp
+++ b/src/burn/engine/elevation.cpp
@@ -14,6 +14,7 @@ typedef enum _BURN_ELEVATION_MESSAGE_TYPE
14 BURN_ELEVATION_MESSAGE_TYPE_SESSION_RESUME, 14 BURN_ELEVATION_MESSAGE_TYPE_SESSION_RESUME,
15 BURN_ELEVATION_MESSAGE_TYPE_SESSION_END, 15 BURN_ELEVATION_MESSAGE_TYPE_SESSION_END,
16 BURN_ELEVATION_MESSAGE_TYPE_SAVE_STATE, 16 BURN_ELEVATION_MESSAGE_TYPE_SAVE_STATE,
17 BURN_ELEVATION_MESSAGE_TYPE_CACHE_PREPARE_PACKAGE,
17 BURN_ELEVATION_MESSAGE_TYPE_CACHE_COMPLETE_PAYLOAD, 18 BURN_ELEVATION_MESSAGE_TYPE_CACHE_COMPLETE_PAYLOAD,
18 BURN_ELEVATION_MESSAGE_TYPE_CACHE_VERIFY_PAYLOAD, 19 BURN_ELEVATION_MESSAGE_TYPE_CACHE_VERIFY_PAYLOAD,
19 BURN_ELEVATION_MESSAGE_TYPE_CACHE_CLEANUP, 20 BURN_ELEVATION_MESSAGE_TYPE_CACHE_CLEANUP,
@@ -186,6 +187,11 @@ static HRESULT OnSaveState(
186 __in BYTE* pbData, 187 __in BYTE* pbData,
187 __in SIZE_T cbData 188 __in SIZE_T cbData
188 ); 189 );
190static HRESULT OnCachePreparePackage(
191 __in BURN_PACKAGES* pPackages,
192 __in BYTE* pbData,
193 __in SIZE_T cbData
194 );
189static HRESULT OnCacheCompletePayload( 195static HRESULT OnCacheCompletePayload(
190 __in HANDLE hPipe, 196 __in HANDLE hPipe,
191 __in BURN_PACKAGES* pPackages, 197 __in BURN_PACKAGES* pPackages,
@@ -612,6 +618,32 @@ LExit:
612 return hr; 618 return hr;
613} 619}
614 620
621extern "C" HRESULT ElevationCachePreparePackage(
622 __in HANDLE hPipe,
623 __in BURN_PACKAGE* pPackage
624 )
625{
626 HRESULT hr = S_OK;
627 BYTE* pbData = NULL;
628 SIZE_T cbData = 0;
629 DWORD dwResult = 0;
630
631 // Serialize message data.
632 hr = BuffWriteString(&pbData, &cbData, pPackage ? pPackage->sczId : NULL);
633 ExitOnFailure(hr, "Failed to write package id to message buffer.");
634
635 // Send message.
636 hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_CACHE_PREPARE_PACKAGE, pbData, cbData, NULL, NULL, &dwResult);
637 ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_CACHE_PREPARE_PACKAGE message to per-machine process.");
638
639 hr = (HRESULT)dwResult;
640
641LExit:
642 ReleaseBuffer(pbData);
643
644 return hr;
645}
646
615/******************************************************************* 647/*******************************************************************
616 ElevationCacheCompletePayload - 648 ElevationCacheCompletePayload -
617 649
@@ -1856,6 +1888,10 @@ static HRESULT ProcessElevatedChildCacheMessage(
1856 1888
1857 switch (pMsg->dwMessage) 1889 switch (pMsg->dwMessage)
1858 { 1890 {
1891 case BURN_ELEVATION_MESSAGE_TYPE_CACHE_PREPARE_PACKAGE:
1892 hrResult = OnCachePreparePackage(pContext->pPackages, (BYTE*)pMsg->pvData, pMsg->cbData);
1893 break;
1894
1859 case BURN_ELEVATION_MESSAGE_TYPE_CACHE_COMPLETE_PAYLOAD: 1895 case BURN_ELEVATION_MESSAGE_TYPE_CACHE_COMPLETE_PAYLOAD:
1860 hrResult = OnCacheCompletePayload(pContext->hPipe, pContext->pPackages, pContext->pPayloads, (BYTE*)pMsg->pvData, pMsg->cbData); 1896 hrResult = OnCacheCompletePayload(pContext->hPipe, pContext->pPackages, pContext->pPayloads, (BYTE*)pMsg->pvData, pMsg->cbData);
1861 break; 1897 break;
@@ -2153,6 +2189,41 @@ LExit:
2153 return hr; 2189 return hr;
2154} 2190}
2155 2191
2192static HRESULT OnCachePreparePackage(
2193 __in BURN_PACKAGES* pPackages,
2194 __in BYTE* pbData,
2195 __in SIZE_T cbData
2196 )
2197{
2198 HRESULT hr = S_OK;
2199 SIZE_T iData = 0;
2200 LPWSTR scz = NULL;
2201 BURN_PACKAGE* pPackage = NULL;
2202
2203 // Deserialize message data.
2204 hr = BuffReadString(pbData, cbData, &iData, &scz);
2205 ExitOnFailure(hr, "Failed to read package id.");
2206
2207 if (scz && *scz)
2208 {
2209 hr = PackageFindById(pPackages, scz, &pPackage);
2210 ExitOnFailure(hr, "Failed to find package: %ls", scz);
2211 }
2212 else
2213 {
2214 hr = E_INVALIDARG;
2215 ExitOnRootFailure(hr, "Invalid data passed to cache prepare package.");
2216 }
2217
2218 hr = CachePreparePackage(pPackage);
2219 ExitOnFailure(hr, "Failed to prepare cache package.");
2220
2221LExit:
2222 ReleaseStr(scz);
2223
2224 return hr;
2225}
2226
2156static HRESULT OnCacheCompletePayload( 2227static HRESULT OnCacheCompletePayload(
2157 __in HANDLE hPipe, 2228 __in HANDLE hPipe,
2158 __in BURN_PACKAGES* pPackages, 2229 __in BURN_PACKAGES* pPackages,
@@ -2225,7 +2296,6 @@ static HRESULT OnCacheVerifyPayload(
2225 LPWSTR scz = NULL; 2296 LPWSTR scz = NULL;
2226 BURN_PACKAGE* pPackage = NULL; 2297 BURN_PACKAGE* pPackage = NULL;
2227 BURN_PAYLOAD* pPayload = NULL; 2298 BURN_PAYLOAD* pPayload = NULL;
2228 LPWSTR sczCacheDirectory = NULL;
2229 2299
2230 // Deserialize message data. 2300 // Deserialize message data.
2231 hr = BuffReadString(pbData, cbData, &iData, &scz); 2301 hr = BuffReadString(pbData, cbData, &iData, &scz);
@@ -2248,10 +2318,13 @@ static HRESULT OnCacheVerifyPayload(
2248 2318
2249 if (pPackage && pPayload) 2319 if (pPackage && pPayload)
2250 { 2320 {
2251 hr = CacheGetCompletedPath(TRUE, pPackage->sczCacheId, &sczCacheDirectory); 2321 if (!pPackage->sczCacheFolder)
2252 ExitOnFailure(hr, "Failed to get cached path for package with cache id: %ls", pPackage->sczCacheId); 2322 {
2323 hr = E_INVALIDSTATE;
2324 ExitOnRootFailure(hr, "Cache verify payload called without starting its package.");
2325 }
2253 2326
2254 hr = CacheVerifyPayload(pPayload, sczCacheDirectory, BurnCacheMessageHandler, ElevatedProgressRoutine, hPipe); 2327 hr = CacheVerifyPayload(pPayload, pPackage->sczCacheFolder, BurnCacheMessageHandler, ElevatedProgressRoutine, hPipe);
2255 } 2328 }
2256 else 2329 else
2257 { 2330 {
@@ -2261,7 +2334,6 @@ static HRESULT OnCacheVerifyPayload(
2261 // Nothing should be logged on failure. 2334 // Nothing should be logged on failure.
2262 2335
2263LExit: 2336LExit:
2264 ReleaseStr(sczCacheDirectory);
2265 ReleaseStr(scz); 2337 ReleaseStr(scz);
2266 2338
2267 return hr; 2339 return hr;