diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2021-05-02 16:48:40 -0500 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2021-05-11 19:11:19 -0500 |
commit | 4e2054b3ee31b2b9fae3269d76e08817a36fb51f (patch) | |
tree | e8c1f89225061d1fc253b444f9c3cac50118eeb9 /src/burn/engine/elevation.cpp | |
parent | 5cb01b477d85920662112d63b5a44b75c03762a9 (diff) | |
download | wix-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.cpp | 82 |
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 | ); |
190 | static HRESULT OnCachePreparePackage( | ||
191 | __in BURN_PACKAGES* pPackages, | ||
192 | __in BYTE* pbData, | ||
193 | __in SIZE_T cbData | ||
194 | ); | ||
189 | static HRESULT OnCacheCompletePayload( | 195 | static 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 | ||
621 | extern "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 | |||
641 | LExit: | ||
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 | ||
2192 | static 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 | |||
2221 | LExit: | ||
2222 | ReleaseStr(scz); | ||
2223 | |||
2224 | return hr; | ||
2225 | } | ||
2226 | |||
2156 | static HRESULT OnCacheCompletePayload( | 2227 | static 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 | ||
2263 | LExit: | 2336 | LExit: |
2264 | ReleaseStr(sczCacheDirectory); | ||
2265 | ReleaseStr(scz); | 2337 | ReleaseStr(scz); |
2266 | 2338 | ||
2267 | return hr; | 2339 | return hr; |