Skip to content

Commit 246043e

Browse files
committed
Experimenting with zip scanning performance
1 parent 8cf6dc4 commit 246043e

File tree

3 files changed

+40
-43
lines changed

3 files changed

+40
-43
lines changed

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -310,14 +310,15 @@ EmbeddedAssemblies::zip_load_assembly_store_entries (std::span<uint8_t> const& b
310310
}
311311
}
312312

313+
[[gnu::flatten]]
313314
void
314315
EmbeddedAssemblies::zip_load_entries (int fd, const char *apk_name, [[maybe_unused]] monodroid_should_register should_register)
315316
{
316317
uint32_t cd_offset;
317318
uint32_t cd_size;
318319
uint16_t cd_entries;
319320

320-
if (!zip_read_cd_info (fd, cd_offset, cd_size, cd_entries)) {
321+
if (!zip_read_cd_info (fd, cd_offset, cd_size, cd_entries)) [[unlikely]] {
321322
Helpers::abort_application (
322323
LOG_ASSEMBLY,
323324
Util::monodroid_strdup_printf (
@@ -327,14 +328,12 @@ EmbeddedAssemblies::zip_load_entries (int fd, const char *apk_name, [[maybe_unus
327328
);
328329
}
329330

330-
md_mmap_info apk_map = md_mmap_apk_file (fd, cd_offset, cd_size, apk_name);
331-
332331
log_debug (LOG_ASSEMBLY, "Central directory offset: %u", cd_offset);
333332
log_debug (LOG_ASSEMBLY, "Central directory size: %u", cd_size);
334333
log_debug (LOG_ASSEMBLY, "Central directory entries: %u", cd_entries);
335334

336335
// off_t retval = ::lseek (fd, static_cast<off_t>(cd_offset), SEEK_SET);
337-
// if (retval < 0) {
336+
// if (retval < 0) [[unlikely]] {
338337
// Helpers::abort_application (
339338
// LOG_ASSEMBLY,
340339
// Util::monodroid_strdup_printf (
@@ -347,7 +346,6 @@ EmbeddedAssemblies::zip_load_entries (int fd, const char *apk_name, [[maybe_unus
347346
// );
348347
// }
349348

350-
std::span<uint8_t> buf (reinterpret_cast<uint8_t*>(apk_map.area), apk_map.size);
351349
const auto [prefix, prefix_len] = get_assemblies_prefix_and_length ();
352350
ZipEntryLoadState state {
353351
.file_fd = fd,
@@ -384,7 +382,7 @@ EmbeddedAssemblies::zip_load_entries (int fd, const char *apk_name, [[maybe_unus
384382
zip_load_individual_assembly_entries (buf, cd_entries, should_register, state);
385383
}
386384

387-
// TODO: unmap here
385+
//delete[] raw_data;
388386
}
389387

390388
template<bool NeedsNameAlloc>

src/native/monodroid/embedded-assemblies.cc

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -875,42 +875,6 @@ EmbeddedAssemblies::typemap_managed_to_java (MonoReflectionType *reflection_type
875875
return ret;
876876
}
877877

878-
EmbeddedAssemblies::md_mmap_info
879-
EmbeddedAssemblies::md_mmap_apk_file (int fd, uint32_t offset, size_t size, const char* filename)
880-
{
881-
md_mmap_info file_info;
882-
md_mmap_info mmap_info;
883-
884-
size_t pageSize = static_cast<size_t>(Util::monodroid_getpagesize ());
885-
size_t offsetFromPage = offset % pageSize;
886-
size_t offsetPage = offset - offsetFromPage;
887-
size_t offsetSize = size + offsetFromPage;
888-
889-
mmap_info.area = mmap (nullptr, offsetSize, PROT_READ, MAP_PRIVATE, fd, static_cast<off_t>(offsetPage));
890-
891-
if (mmap_info.area == MAP_FAILED) {
892-
Helpers::abort_application (
893-
LOG_ASSEMBLY,
894-
Util::monodroid_strdup_printf (
895-
"Could not mmap APK fd %d: %s; File=%s",
896-
fd,
897-
strerror (errno),
898-
filename
899-
)
900-
);
901-
}
902-
903-
mmap_info.size = offsetSize;
904-
file_info.area = (void*)((const char*)mmap_info.area + offsetFromPage);
905-
file_info.size = size;
906-
907-
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",
908-
mmap_info.area, reinterpret_cast<int*> (mmap_info.area) + mmap_info.size, mmap_info.size,
909-
file_info.area, reinterpret_cast<int*> (file_info.area) + file_info.size, file_info.size, fd, filename);
910-
911-
return file_info;
912-
}
913-
914878
void
915879
EmbeddedAssemblies::gather_bundled_assemblies_from_apk (const char* apk, monodroid_should_register should_register)
916880
{

src/native/monodroid/embedded-assemblies.hh

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "cppcompat.hh"
2828
#include "shared-constants.hh"
2929
#include "xxhash.hh"
30+
#include "util.hh"
3031

3132
#include <concepts>
3233

@@ -239,7 +240,41 @@ namespace xamarin::android::internal {
239240
const TypeMapEntry *typemap_managed_to_java (const char *managed_type_name) noexcept;
240241
#endif // DEBUG
241242

242-
static md_mmap_info md_mmap_apk_file (int fd, uint32_t offset, size_t size, const char* filename);
243+
[[gnu::always_inline]]
244+
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
245+
{
246+
size_t pageSize = static_cast<size_t>(Util::monodroid_getpagesize ());
247+
size_t offsetFromPage = offset % pageSize;
248+
size_t offsetPage = offset - offsetFromPage;
249+
size_t offsetSize = size + offsetFromPage;
250+
251+
original_info.area = mmap (nullptr, offsetSize, PROT_READ, MAP_PRIVATE, fd, static_cast<off_t>(offsetPage));
252+
253+
if (original_info.area == MAP_FAILED) {
254+
log_fatal (LOG_DEFAULT, "Could not `mmap` apk fd %d entry `%s`: %s", fd, filename, strerror (errno));
255+
Helpers::abort_application ();
256+
}
257+
258+
original_info.size = offsetSize;
259+
adjusted_info.area = (void*)((const char*)original_info.area + offsetFromPage);
260+
adjusted_info.size = size;
261+
262+
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",
263+
original_info.area, reinterpret_cast<int*> (original_info.area) + original_info.size, original_info.size,
264+
adjusted_info.area, reinterpret_cast<int*> (adjusted_info.area) + adjusted_info.size, adjusted_info.size, fd, filename);
265+
266+
return adjusted_info;
267+
}
268+
269+
[[gnu::flatten, gnu::always_inline]]
270+
static md_mmap_info md_mmap_apk_file (int fd, uint32_t offset, size_t size, const char* filename) noexcept
271+
{
272+
md_mmap_info file_info;
273+
md_mmap_info mmap_info;
274+
275+
return md_mmap_apk_file (fd, offset, size, filename, mmap_info, file_info);
276+
}
277+
243278
static MonoAssembly* open_from_bundles_full (MonoAssemblyName *aname, char **assemblies_path, void *user_data);
244279
static MonoAssembly* open_from_bundles (MonoAssemblyLoadContextGCHandle alc_gchandle, MonoAssemblyName *aname, char **assemblies_path, void *user_data, MonoError *error);
245280

0 commit comments

Comments
 (0)