Skip to content

Commit 447cbb2

Browse files
committed
Experimenting with zip scanning performance
1 parent aa86a9d commit 447cbb2

File tree

3 files changed

+40
-53
lines changed

3 files changed

+40
-53
lines changed

src/native/mono/monodroid/embedded-assemblies-zip.cc

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -328,14 +328,15 @@ EmbeddedAssemblies::zip_load_assembly_store_entries (std::span<uint8_t> const& b
328328
}
329329
}
330330

331+
[[gnu::flatten]]
331332
void
332333
EmbeddedAssemblies::zip_load_entries (int fd, const char *apk_name, [[maybe_unused]] monodroid_should_register should_register) noexcept
333334
{
334335
uint32_t cd_offset;
335336
uint32_t cd_size;
336337
uint16_t cd_entries;
337338

338-
if (!zip_read_cd_info (fd, cd_offset, cd_size, cd_entries)) {
339+
if (!zip_read_cd_info (fd, cd_offset, cd_size, cd_entries)) [[unlikely]] {
339340
Helpers::abort_application (
340341
LOG_ASSEMBLY,
341342
std::format (
@@ -345,14 +346,12 @@ EmbeddedAssemblies::zip_load_entries (int fd, const char *apk_name, [[maybe_unus
345346
);
346347
}
347348

348-
md_mmap_info apk_map = md_mmap_apk_file (fd, cd_offset, cd_size, apk_name);
349-
350349
log_debug (LOG_ASSEMBLY, "Central directory offset: %u", cd_offset);
351350
log_debug (LOG_ASSEMBLY, "Central directory size: %u", cd_size);
352351
log_debug (LOG_ASSEMBLY, "Central directory entries: %u", cd_entries);
353352

354353
// off_t retval = ::lseek (fd, static_cast<off_t>(cd_offset), SEEK_SET);
355-
// if (retval < 0) {
354+
// if (retval < 0) [[unlikely]] {
356355
// Helpers::abort_application (
357356
// LOG_ASSEMBLY,
358357
// Util::monodroid_strdup_printf (
@@ -365,7 +364,6 @@ EmbeddedAssemblies::zip_load_entries (int fd, const char *apk_name, [[maybe_unus
365364
// );
366365
// }
367366

368-
std::span<uint8_t> buf (reinterpret_cast<uint8_t*>(apk_map.area), apk_map.size);
369367
const auto [prefix, prefix_len] = get_assemblies_prefix_and_length ();
370368
ZipEntryLoadState state {
371369
.file_fd = fd,
@@ -402,7 +400,7 @@ EmbeddedAssemblies::zip_load_entries (int fd, const char *apk_name, [[maybe_unus
402400
zip_load_individual_assembly_entries (buf, cd_entries, should_register, state);
403401
}
404402

405-
// TODO: unmap here
403+
//delete[] raw_data;
406404
}
407405

408406
template<bool NeedsNameAlloc>

src/native/mono/monodroid/embedded-assemblies.cc

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -910,51 +910,6 @@ EmbeddedAssemblies::typemap_managed_to_java (MonoReflectionType *reflection_type
910910
return ret;
911911
}
912912

913-
EmbeddedAssemblies::md_mmap_info
914-
EmbeddedAssemblies::md_mmap_apk_file (int fd, uint32_t offset, size_t size, const char* filename)
915-
{
916-
md_mmap_info file_info;
917-
md_mmap_info mmap_info;
918-
919-
size_t pageSize = static_cast<size_t>(Util::monodroid_getpagesize ());
920-
size_t offsetFromPage = offset % pageSize;
921-
size_t offsetPage = offset - offsetFromPage;
922-
size_t offsetSize = size + offsetFromPage;
923-
924-
mmap_info.area = mmap (nullptr, offsetSize, PROT_READ, MAP_PRIVATE, fd, static_cast<off_t>(offsetPage));
925-
926-
if (mmap_info.area == MAP_FAILED) {
927-
Helpers::abort_application (
928-
LOG_ASSEMBLY,
929-
std::format (
930-
"Could not mmap APK fd {}: {}; File={}",
931-
fd,
932-
strerror (errno),
933-
optional_string (filename)
934-
)
935-
);
936-
}
937-
938-
mmap_info.size = offsetSize;
939-
file_info.area = pointer_add (mmap_info.area, offsetFromPage);
940-
file_info.size = size;
941-
942-
log_info (
943-
LOG_ASSEMBLY,
944-
" mmap_start: {:<8p}; mmap_end: {:<8p} mmap_len: {:<12} file_start: {:<8p} file_end: {:<8p} file_len: {:<12} apk descriptor: {} file: {}",
945-
mmap_info.area,
946-
pointer_add (mmap_info.area, mmap_info.size),
947-
mmap_info.size,
948-
file_info.area,
949-
pointer_add (file_info.area, file_info.size),
950-
file_info.size,
951-
fd,
952-
optional_string (filename)
953-
);
954-
955-
return file_info;
956-
}
957-
958913
void
959914
EmbeddedAssemblies::gather_bundled_assemblies_from_apk (const char* apk, monodroid_should_register should_register) noexcept
960915
{

src/native/mono/monodroid/embedded-assemblies.hh

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
#include <shared/cpp-util.hh>
2828
#include "cppcompat.hh"
2929
#include "shared-constants.hh"
30-
#include <shared/xxhash.hh>
30+
#include "xxhash.hh"
3131
#include "util.hh"
3232

3333
#include <concepts>
@@ -259,7 +259,41 @@ namespace xamarin::android::internal {
259259
static const TypeMapEntry *typemap_managed_to_java (const char *managed_type_name) noexcept;
260260
#endif // DEBUG
261261

262-
static md_mmap_info md_mmap_apk_file (int fd, uint32_t offset, size_t size, const char* filename);
262+
[[gnu::always_inline]]
263+
static md_mmap_info md_mmap_apk_file (int fd, uint32_t offset, size_t size, const char* filename, md_mmap_info &original_info, md_mmap_info &adjusted_info) noexcept
264+
{
265+
size_t pageSize = static_cast<size_t>(Util::monodroid_getpagesize ());
266+
size_t offsetFromPage = offset % pageSize;
267+
size_t offsetPage = offset - offsetFromPage;
268+
size_t offsetSize = size + offsetFromPage;
269+
270+
original_info.area = mmap (nullptr, offsetSize, PROT_READ, MAP_PRIVATE, fd, static_cast<off_t>(offsetPage));
271+
272+
if (original_info.area == MAP_FAILED) {
273+
log_fatal (LOG_DEFAULT, "Could not `mmap` apk fd %d entry `%s`: %s", fd, filename, strerror (errno));
274+
Helpers::abort_application ();
275+
}
276+
277+
original_info.size = offsetSize;
278+
adjusted_info.area = (void*)((const char*)original_info.area + offsetFromPage);
279+
adjusted_info.size = size;
280+
281+
log_info (LOG_ASSEMBLY, " mmap_start: %08p mmap_end: %08p mmap_len: % 12u file_start: %08p file_end: %08p file_len: % 12u apk descriptor: %d file: %s",
282+
original_info.area, reinterpret_cast<int*> (original_info.area) + original_info.size, original_info.size,
283+
adjusted_info.area, reinterpret_cast<int*> (adjusted_info.area) + adjusted_info.size, adjusted_info.size, fd, filename);
284+
285+
return adjusted_info;
286+
}
287+
288+
[[gnu::flatten, gnu::always_inline]]
289+
static md_mmap_info md_mmap_apk_file (int fd, uint32_t offset, size_t size, const char* filename) noexcept
290+
{
291+
md_mmap_info file_info;
292+
md_mmap_info mmap_info;
293+
294+
return md_mmap_apk_file (fd, offset, size, filename, mmap_info, file_info);
295+
}
296+
263297
static MonoAssembly* open_from_bundles_full (MonoAssemblyName *aname, char **assemblies_path, void *user_data);
264298
static MonoAssembly* open_from_bundles (MonoAssemblyLoadContextGCHandle alc_gchandle, MonoAssemblyName *aname, char **assemblies_path, void *user_data, MonoError *error);
265299

0 commit comments

Comments
 (0)