aboutsummaryrefslogtreecommitdiff
path: root/src/burn
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2021-06-09 11:30:46 -0500
committerSean Hall <r.sean.hall@gmail.com>2021-06-09 13:47:53 -0500
commit56105916271ff9a7c0bfa237b45b9b3fab9c570b (patch)
tree828aff9543e541b42ed45198e6bd3e0aa065c137 /src/burn
parentd47c73dbcd0a314cf3346b9b1294063ed4a124c4 (diff)
downloadwix-56105916271ff9a7c0bfa237b45b9b3fab9c570b.tar.gz
wix-56105916271ff9a7c0bfa237b45b9b3fab9c570b.tar.bz2
wix-56105916271ff9a7c0bfa237b45b9b3fab9c570b.zip
Fix building and perf for bundles with 1000s of package and BA payloads
Fixes other half of #5300
Diffstat (limited to 'src/burn')
-rw-r--r--src/burn/engine/apply.cpp2
-rw-r--r--src/burn/engine/burnextension.cpp11
-rw-r--r--src/burn/engine/burnextension.h1
-rw-r--r--src/burn/engine/container.cpp3
-rw-r--r--src/burn/engine/container.h3
-rw-r--r--src/burn/engine/manifest.h2
-rw-r--r--src/burn/engine/payload.cpp80
-rw-r--r--src/burn/engine/payload.h3
-rw-r--r--src/burn/engine/userexperience.h2
9 files changed, 54 insertions, 53 deletions
diff --git a/src/burn/engine/apply.cpp b/src/burn/engine/apply.cpp
index a99a3987..c126d63c 100644
--- a/src/burn/engine/apply.cpp
+++ b/src/burn/engine/apply.cpp
@@ -1175,7 +1175,7 @@ static HRESULT ExtractContainer(
1175 { 1175 {
1176 BOOL fExtracted = FALSE; 1176 BOOL fExtracted = FALSE;
1177 1177
1178 hr = PayloadFindEmbeddedBySourcePath(pContext->pPayloads, sczStreamName, &pExtract); 1178 hr = PayloadFindEmbeddedBySourcePath(pContainer->sdhPayloads, sczStreamName, &pExtract);
1179 if (E_NOTFOUND != hr) 1179 if (E_NOTFOUND != hr)
1180 { 1180 {
1181 ExitOnFailure(hr, "Failed to find embedded payload by source path: %ls container: %ls", sczStreamName, pContainer->sczId); 1181 ExitOnFailure(hr, "Failed to find embedded payload by source path: %ls container: %ls", sczStreamName, pContainer->sczId);
diff --git a/src/burn/engine/burnextension.cpp b/src/burn/engine/burnextension.cpp
index 475df1c5..ee4b1542 100644
--- a/src/burn/engine/burnextension.cpp
+++ b/src/burn/engine/burnextension.cpp
@@ -26,6 +26,7 @@ EXTERN_C HRESULT BurnExtensionParseFromXml(
26 IXMLDOMNodeList* pixnNodes = NULL; 26 IXMLDOMNodeList* pixnNodes = NULL;
27 IXMLDOMNode* pixnNode = NULL; 27 IXMLDOMNode* pixnNode = NULL;
28 DWORD cNodes = 0; 28 DWORD cNodes = 0;
29 LPWSTR scz = NULL;
29 30
30 // Select BundleExtension nodes. 31 // Select BundleExtension nodes.
31 hr = XmlSelectNodes(pixnBundle, L"BundleExtension", &pixnNodes); 32 hr = XmlSelectNodes(pixnBundle, L"BundleExtension", &pixnNodes);
@@ -59,11 +60,11 @@ EXTERN_C HRESULT BurnExtensionParseFromXml(
59 ExitOnFailure(hr, "Failed to get @Id."); 60 ExitOnFailure(hr, "Failed to get @Id.");
60 61
61 // @EntryPayloadId 62 // @EntryPayloadId
62 hr = XmlGetAttributeEx(pixnNode, L"EntryPayloadId", &pExtension->sczEntryPayloadId); 63 hr = XmlGetAttributeEx(pixnNode, L"EntryPayloadSourcePath", &scz);
63 ExitOnFailure(hr, "Failed to get @EntryPayloadId."); 64 ExitOnFailure(hr, "Failed to get @EntryPayloadSourcePath.");
64 65
65 hr = PayloadFindById(pBaPayloads, pExtension->sczEntryPayloadId, &pExtension->pEntryPayload); 66 hr = PayloadFindEmbeddedBySourcePath(pBaPayloads->sdhPayloads, scz, &pExtension->pEntryPayload);
66 ExitOnFailure(hr, "Failed to find BundleExtension EntryPayload '%ls'.", pExtension->sczEntryPayloadId); 67 ExitOnFailure(hr, "Failed to find BundleExtension EntryPayload '%ls'.", pExtension->sczId);
67 68
68 // prepare next iteration 69 // prepare next iteration
69 ReleaseNullObject(pixnNode); 70 ReleaseNullObject(pixnNode);
@@ -72,6 +73,7 @@ EXTERN_C HRESULT BurnExtensionParseFromXml(
72 hr = S_OK; 73 hr = S_OK;
73 74
74LExit: 75LExit:
76 ReleaseStr(scz);
75 ReleaseObject(pixnNode); 77 ReleaseObject(pixnNode);
76 ReleaseObject(pixnNodes); 78 ReleaseObject(pixnNodes);
77 79
@@ -92,7 +94,6 @@ EXTERN_C void BurnExtensionUninitialize(
92 { 94 {
93 BURN_EXTENSION* pExtension = &pBurnExtensions->rgExtensions[i]; 95 BURN_EXTENSION* pExtension = &pBurnExtensions->rgExtensions[i];
94 96
95 ReleaseStr(pExtension->sczEntryPayloadId);
96 ReleaseStr(pExtension->sczId); 97 ReleaseStr(pExtension->sczId);
97 } 98 }
98 MemFree(pBurnExtensions->rgExtensions); 99 MemFree(pBurnExtensions->rgExtensions);
diff --git a/src/burn/engine/burnextension.h b/src/burn/engine/burnextension.h
index 370ddd2d..3529ef38 100644
--- a/src/burn/engine/burnextension.h
+++ b/src/burn/engine/burnextension.h
@@ -13,7 +13,6 @@ typedef struct _BURN_EXTENSION_ENGINE_CONTEXT BURN_EXTENSION_ENGINE_CONTEXT;
13 13
14typedef struct _BURN_EXTENSION 14typedef struct _BURN_EXTENSION
15{ 15{
16 LPWSTR sczEntryPayloadId;
17 LPWSTR sczId; 16 LPWSTR sczId;
18 17
19 BURN_PAYLOAD* pEntryPayload; 18 BURN_PAYLOAD* pEntryPayload;
diff --git a/src/burn/engine/container.cpp b/src/burn/engine/container.cpp
index c6f2ada8..aa123927 100644
--- a/src/burn/engine/container.cpp
+++ b/src/burn/engine/container.cpp
@@ -35,7 +35,7 @@ extern "C" HRESULT ContainersParseFromXml(
35 35
36 pContainers->cContainers = cNodes; 36 pContainers->cContainers = cNodes;
37 37
38 // parse search elements 38 // parse container elements
39 for (DWORD i = 0; i < cNodes; ++i) 39 for (DWORD i = 0; i < cNodes; ++i)
40 { 40 {
41 BURN_CONTAINER* pContainer = &pContainers->rgContainers[i]; 41 BURN_CONTAINER* pContainer = &pContainers->rgContainers[i];
@@ -181,6 +181,7 @@ extern "C" void ContainersUninitialize(
181 ReleaseStr(pContainer->downloadSource.sczUser); 181 ReleaseStr(pContainer->downloadSource.sczUser);
182 ReleaseStr(pContainer->downloadSource.sczPassword); 182 ReleaseStr(pContainer->downloadSource.sczPassword);
183 ReleaseStr(pContainer->sczUnverifiedPath); 183 ReleaseStr(pContainer->sczUnverifiedPath);
184 ReleaseDict(pContainer->sdhPayloads);
184 } 185 }
185 MemFree(pContainers->rgContainers); 186 MemFree(pContainers->rgContainers);
186 } 187 }
diff --git a/src/burn/engine/container.h b/src/burn/engine/container.h
index d454a248..f35f1da5 100644
--- a/src/burn/engine/container.h
+++ b/src/burn/engine/container.h
@@ -72,6 +72,9 @@ typedef struct _BURN_CONTAINER
72 LPWSTR sczFilePath; // relative path to container. 72 LPWSTR sczFilePath; // relative path to container.
73 DOWNLOAD_SOURCE downloadSource; 73 DOWNLOAD_SOURCE downloadSource;
74 74
75 DWORD cParsedPayloads;
76 STRINGDICT_HANDLE sdhPayloads; // value is BURN_PAYLOAD*
77
75 BYTE* pbHash; 78 BYTE* pbHash;
76 DWORD cbHash; 79 DWORD cbHash;
77 BURN_CONTAINER_VERIFICATION verification; 80 BURN_CONTAINER_VERIFICATION verification;
diff --git a/src/burn/engine/manifest.h b/src/burn/engine/manifest.h
index 8c527279..40748c52 100644
--- a/src/burn/engine/manifest.h
+++ b/src/burn/engine/manifest.h
@@ -2,8 +2,6 @@
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. 2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3 3
4 4
5interface IBurnPayload; // forward declare.
6
7#if defined(__cplusplus) 5#if defined(__cplusplus)
8extern "C" { 6extern "C" {
9#endif 7#endif
diff --git a/src/burn/engine/payload.cpp b/src/burn/engine/payload.cpp
index 84c32eec..e0362a76 100644
--- a/src/burn/engine/payload.cpp
+++ b/src/burn/engine/payload.cpp
@@ -5,13 +5,6 @@
5 5
6// internal function declarations 6// internal function declarations
7 7
8static HRESULT FindEmbeddedBySourcePath(
9 __in BURN_PAYLOADS* pPayloads,
10 __in_opt BURN_CONTAINER* pContainer,
11 __in_z LPCWSTR wzStreamName,
12 __out BURN_PAYLOAD** ppPayload
13 );
14
15 8
16// function definitions 9// function definitions
17 10
@@ -29,6 +22,7 @@ extern "C" HRESULT PayloadsParseFromXml(
29 LPWSTR scz = NULL; 22 LPWSTR scz = NULL;
30 BOOL fChainPayload = pContainers && pLayoutPayloads; // These are required when parsing chain payloads. 23 BOOL fChainPayload = pContainers && pLayoutPayloads; // These are required when parsing chain payloads.
31 BOOL fValidFileSize = FALSE; 24 BOOL fValidFileSize = FALSE;
25 size_t cByteOffset = fChainPayload ? offsetof(BURN_PAYLOAD, sczKey) : offsetof(BURN_PAYLOAD, sczSourcePath);
32 26
33 // select payload nodes 27 // select payload nodes
34 hr = XmlSelectNodes(pixnBundle, L"Payload", &pixnNodes); 28 hr = XmlSelectNodes(pixnBundle, L"Payload", &pixnNodes);
@@ -49,7 +43,11 @@ extern "C" HRESULT PayloadsParseFromXml(
49 43
50 pPayloads->cPayloads = cNodes; 44 pPayloads->cPayloads = cNodes;
51 45
52 // parse search elements 46 // create dictionary for payloads
47 hr = DictCreateWithEmbeddedKey(&pPayloads->sdhPayloads, pPayloads->cPayloads, reinterpret_cast<void**>(&pPayloads->rgPayloads), cByteOffset, DICT_FLAG_NONE);
48 ExitOnFailure(hr, "Failed to create dictionary for payloads.");
49
50 // parse payload elements
53 for (DWORD i = 0; i < cNodes; ++i) 51 for (DWORD i = 0; i < cNodes; ++i)
54 { 52 {
55 BURN_PAYLOAD* pPayload = &pPayloads->rgPayloads[i]; 53 BURN_PAYLOAD* pPayload = &pPayloads->rgPayloads[i];
@@ -104,6 +102,8 @@ extern "C" HRESULT PayloadsParseFromXml(
104 // find container 102 // find container
105 hr = ContainerFindById(pContainers, scz, &pPayload->pContainer); 103 hr = ContainerFindById(pContainers, scz, &pPayload->pContainer);
106 ExitOnFailure(hr, "Failed to to find container: %ls", scz); 104 ExitOnFailure(hr, "Failed to to find container: %ls", scz);
105
106 pPayload->pContainer->cParsedPayloads += 1;
107 } 107 }
108 108
109 // @LayoutOnly 109 // @LayoutOnly
@@ -190,12 +190,37 @@ extern "C" HRESULT PayloadsParseFromXml(
190 } 190 }
191 } 191 }
192 192
193 hr = DictAddValue(pPayloads->sdhPayloads, pPayload);
194 ExitOnFailure(hr, "Failed to add payload to payloads dictionary.");
195
193 // prepare next iteration 196 // prepare next iteration
194 ReleaseNullObject(pixnNode); 197 ReleaseNullObject(pixnNode);
195 } 198 }
196 199
197 hr = S_OK; 200 hr = S_OK;
198 201
202 if (pContainers && pContainers->cContainers)
203 {
204 for (DWORD i = 0; i < pPayloads->cPayloads; ++i)
205 {
206 BURN_PAYLOAD* pPayload = &pPayloads->rgPayloads[i];
207 BURN_CONTAINER* pContainer = pPayload->pContainer;
208
209 if (!pContainer)
210 {
211 continue;
212 }
213 else if (!pContainer->sdhPayloads)
214 {
215 hr = DictCreateWithEmbeddedKey(&pContainer->sdhPayloads, pContainer->cParsedPayloads, NULL, offsetof(BURN_PAYLOAD, sczSourcePath), DICT_FLAG_NONE);
216 ExitOnFailure(hr, "Failed to create dictionary for container payloads.");
217 }
218
219 hr = DictAddValue(pContainer->sdhPayloads, pPayload);
220 ExitOnFailure(hr, "Failed to add payload to container dictionary.");
221 }
222 }
223
199LExit: 224LExit:
200 ReleaseObject(pixnNodes); 225 ReleaseObject(pixnNodes);
201 ReleaseObject(pixnNode); 226 ReleaseObject(pixnNode);
@@ -237,6 +262,8 @@ extern "C" void PayloadsUninitialize(
237 MemFree(pPayloads->rgPayloads); 262 MemFree(pPayloads->rgPayloads);
238 } 263 }
239 264
265 ReleaseDict(pPayloads->sdhPayloads);
266
240 // clear struct 267 // clear struct
241 memset(pPayloads, 0, sizeof(BURN_PAYLOADS)); 268 memset(pPayloads, 0, sizeof(BURN_PAYLOADS));
242} 269}
@@ -265,7 +292,7 @@ extern "C" HRESULT PayloadExtractUXContainer(
265 ExitOnFailure(hr, "Failed to get next stream."); 292 ExitOnFailure(hr, "Failed to get next stream.");
266 293
267 // find payload by stream name 294 // find payload by stream name
268 hr = PayloadFindEmbeddedBySourcePath(pPayloads, sczStreamName, &pPayload); 295 hr = PayloadFindEmbeddedBySourcePath(pPayloads->sdhPayloads, sczStreamName, &pPayload);
269 ExitOnFailure(hr, "Failed to find embedded payload: %ls", sczStreamName); 296 ExitOnFailure(hr, "Failed to find embedded payload: %ls", sczStreamName);
270 297
271 // make file path 298 // make file path
@@ -313,51 +340,22 @@ extern "C" HRESULT PayloadFindById(
313 ) 340 )
314{ 341{
315 HRESULT hr = S_OK; 342 HRESULT hr = S_OK;
316 BURN_PAYLOAD* pPayload = NULL;
317 343
318 for (DWORD i = 0; i < pPayloads->cPayloads; ++i) 344 hr = DictGetValue(pPayloads->sdhPayloads, wzId, reinterpret_cast<void**>(ppPayload));
319 {
320 pPayload = &pPayloads->rgPayloads[i];
321
322 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, pPayload->sczKey, -1, wzId, -1))
323 {
324 *ppPayload = pPayload;
325 ExitFunction1(hr = S_OK);
326 }
327 }
328 345
329 hr = E_NOTFOUND;
330
331LExit:
332 return hr; 346 return hr;
333} 347}
334 348
335extern "C" HRESULT PayloadFindEmbeddedBySourcePath( 349extern "C" HRESULT PayloadFindEmbeddedBySourcePath(
336 __in BURN_PAYLOADS* pPayloads, 350 __in STRINGDICT_HANDLE sdhPayloads,
337 __in_z LPCWSTR wzStreamName, 351 __in_z LPCWSTR wzStreamName,
338 __out BURN_PAYLOAD** ppPayload 352 __out BURN_PAYLOAD** ppPayload
339 ) 353 )
340{ 354{
341 HRESULT hr = S_OK; 355 HRESULT hr = S_OK;
342 BURN_PAYLOAD* pPayload = NULL;
343 356
344 for (DWORD i = 0; i < pPayloads->cPayloads; ++i) 357 hr = DictGetValue(sdhPayloads, wzStreamName, reinterpret_cast<void**>(ppPayload));
345 {
346 pPayload = &pPayloads->rgPayloads[i];
347
348 if (BURN_PAYLOAD_PACKAGING_EMBEDDED == pPayload->packaging)
349 {
350 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, pPayload->sczSourcePath, -1, wzStreamName, -1))
351 {
352 *ppPayload = pPayload;
353 ExitFunction1(hr = S_OK);
354 }
355 }
356 }
357 358
358 hr = E_NOTFOUND;
359
360LExit:
361 return hr; 359 return hr;
362} 360}
363 361
diff --git a/src/burn/engine/payload.h b/src/burn/engine/payload.h
index c12fbe66..14738506 100644
--- a/src/burn/engine/payload.h
+++ b/src/burn/engine/payload.h
@@ -66,6 +66,7 @@ typedef struct _BURN_PAYLOADS
66{ 66{
67 BURN_PAYLOAD* rgPayloads; 67 BURN_PAYLOAD* rgPayloads;
68 DWORD cPayloads; 68 DWORD cPayloads;
69 STRINGDICT_HANDLE sdhPayloads; // value is BURN_PAYLOAD*
69} BURN_PAYLOADS; 70} BURN_PAYLOADS;
70 71
71typedef struct _BURN_PAYLOAD_GROUP_ITEM 72typedef struct _BURN_PAYLOAD_GROUP_ITEM
@@ -109,7 +110,7 @@ HRESULT PayloadFindById(
109 __out BURN_PAYLOAD** ppPayload 110 __out BURN_PAYLOAD** ppPayload
110 ); 111 );
111HRESULT PayloadFindEmbeddedBySourcePath( 112HRESULT PayloadFindEmbeddedBySourcePath(
112 __in BURN_PAYLOADS* pPayloads, 113 __in STRINGDICT_HANDLE sdhPayloads,
113 __in_z LPCWSTR wzStreamName, 114 __in_z LPCWSTR wzStreamName,
114 __out BURN_PAYLOAD** ppPayload 115 __out BURN_PAYLOAD** ppPayload
115 ); 116 );
diff --git a/src/burn/engine/userexperience.h b/src/burn/engine/userexperience.h
index 6a5ae697..584bef14 100644
--- a/src/burn/engine/userexperience.h
+++ b/src/burn/engine/userexperience.h
@@ -15,7 +15,7 @@ const DWORD MB_RETRYTRYAGAIN = 0xF;
15 15
16// structs 16// structs
17 17
18typedef struct _BOOTSTRAPPER_ENGINE_CONTEXT BOOTSTRAPPER_ENGINE_CONTEXT; 18typedef struct _BOOTSTRAPPER_ENGINE_CONTEXT BOOTSTRAPPER_ENGINE_CONTEXT; // forward declare
19 19
20typedef struct _BURN_USER_EXPERIENCE 20typedef struct _BURN_USER_EXPERIENCE
21{ 21{