Skip to content

Commit 68b68a2

Browse files
committed
Experimenting with zip scanning performance
1 parent 3b8fff6 commit 68b68a2

File tree

3 files changed

+56
-58
lines changed

3 files changed

+56
-58
lines changed

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

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -312,14 +312,15 @@ EmbeddedAssemblies::zip_load_assembly_store_entries (std::span<uint8_t> const& b
312312
}
313313
}
314314

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

322-
if (!zip_read_cd_info (fd, cd_offset, cd_size, cd_entries)) {
323+
if (!zip_read_cd_info (fd, cd_offset, cd_size, cd_entries)) [[unlikely]] {
323324
Helpers::abort_application (
324325
LOG_ASSEMBLY,
325326
Util::monodroid_strdup_printf (
@@ -329,14 +330,12 @@ EmbeddedAssemblies::zip_load_entries (int fd, const char *apk_name, [[maybe_unus
329330
);
330331
}
331332

332-
md_mmap_info apk_map = md_mmap_apk_file (fd, cd_offset, cd_size, apk_name);
333-
334333
log_debug (LOG_ASSEMBLY, "Central directory offset: %u", cd_offset);
335334
log_debug (LOG_ASSEMBLY, "Central directory size: %u", cd_size);
336335
log_debug (LOG_ASSEMBLY, "Central directory entries: %u", cd_entries);
337336

338337
// off_t retval = ::lseek (fd, static_cast<off_t>(cd_offset), SEEK_SET);
339-
// if (retval < 0) {
338+
// if (retval < 0) [[unlikely]] {
340339
// Helpers::abort_application (
341340
// LOG_ASSEMBLY,
342341
// Util::monodroid_strdup_printf (
@@ -349,7 +348,6 @@ EmbeddedAssemblies::zip_load_entries (int fd, const char *apk_name, [[maybe_unus
349348
// );
350349
// }
351350

352-
std::span<uint8_t> buf (reinterpret_cast<uint8_t*>(apk_map.area), apk_map.size);
353351
const auto [prefix, prefix_len] = get_assemblies_prefix_and_length ();
354352
ZipEntryLoadState state {
355353
.file_fd = fd,
@@ -366,29 +364,30 @@ EmbeddedAssemblies::zip_load_entries (int fd, const char *apk_name, [[maybe_unus
366364
.max_assembly_file_name_size = 0,
367365
};
368366

369-
// ssize_t nread = read (fd, buf.data (), static_cast<read_count_type>(buf.size ()));
370-
// if (static_cast<size_t>(nread) != cd_size) {
371-
// log_fatal (LOG_ASSEMBLY, "Failed to read Central Directory from the APK archive %s. %s (nread: %d; errno: %d)", apk_name, std::strerror (errno), nread, errno);
372-
// Helpers::abort_application ();
373-
// Helpers::abort_application (
374-
// LOG_ASSEMBLY,
375-
// Util::monodroid_strdup_printf (
376-
// "Failed to read Central Directory from APK: %s. nread=%d errno=%d File=%s",
377-
// std::strerror (errno),
378-
// nread,
379-
// errno,
380-
// apk_name
381-
// )
382-
// );
383-
// }
367+
std::unique_ptr<uint8_t[]> raw_data (new uint8_t[cd_size]);
368+
//auto raw_data = new uint8_t[cd_size];
369+
std::span<uint8_t> buf (raw_data.get (), cd_size);
370+
ssize_t nread = read (fd, buf.data (), static_cast<read_count_type>(buf.size ()));
371+
if (static_cast<size_t>(nread) != cd_size) [[unlikely]] {
372+
Helpers::abort_application (
373+
LOG_ASSEMBLY,
374+
Util::monodroid_strdup_printf (
375+
"Failed to read Central Directory from APK: %s. nread=%d errno=%d File=%s",
376+
std::strerror (errno),
377+
nread,
378+
errno,
379+
apk_name
380+
)
381+
);
382+
}
384383

385384
if (application_config.have_assembly_store) {
386385
zip_load_assembly_store_entries (buf, cd_entries, state);
387386
} else {
388387
zip_load_individual_assembly_entries (buf, cd_entries, should_register, state);
389388
}
390389

391-
// TODO: unmap here
390+
//delete[] raw_data;
392391
}
393392

394393
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)