summaryrefslogtreecommitdiff
path: root/libguile/loader.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2017-01-08 23:39:42 +0100
committerAndy Wingo <wingo@pobox.com>2017-01-08 23:39:42 +0100
commitc391ab8c9085226d0dd51424d427fa48c3e26881 (patch)
treeeebb9aaa5227ae7cb14c1dcf1d4293aa5a200939 /libguile/loader.c
parent6ff1ec9c31fadbcf5cfe3d4837b8fad62c1bcb27 (diff)
downloadguile-c391ab8c9085226d0dd51424d427fa48c3e26881.tar.gz
Speed up load-thunk-from-memory for page alignment
* libguile/loader.c (page_size): New static var. (alloc_aligned): Enable mmap path that was never used in the past (!). Thanks to Matt Wette for the bug report! (load_thunk_from_memory): Use page_size instead of 4096. (scm_bootstrap_loader): Init page_size.
Diffstat (limited to 'libguile/loader.c')
-rw-r--r--libguile/loader.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/libguile/loader.c b/libguile/loader.c
index 97effb30d..191e4c157 100644
--- a/libguile/loader.c
+++ b/libguile/loader.c
@@ -79,6 +79,9 @@
#define ELFDATA ELFDATA2LSB
#endif
+/* The page size. */
+static size_t page_size;
+
static void register_elf (char *data, size_t len, char *frame_maps);
enum bytecode_kind
@@ -192,12 +195,13 @@ alloc_aligned (size_t len, unsigned alignment)
/* FIXME: Assert that we actually have an 8-byte-aligned malloc. */
ret = malloc (len);
}
-#if defined(HAVE_SYS_MMAN_H) && defined(MMAP_ANONYMOUS)
- else if (alignment == SCM_PAGE_SIZE)
+#if defined(HAVE_SYS_MMAN_H) && defined(HAVE_MAP_ANONYMOUS)
+ else if (alignment == page_size)
{
- ret = mmap (NULL, len, PROT_READ | PROT_WRITE, -1, 0);
+ ret = mmap (NULL, len, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (ret == MAP_FAILED)
- SCM_SYSERROR;
+ scm_syserror ("load-thunk-from-memory");
}
#endif
else
@@ -429,7 +433,7 @@ load_thunk_from_memory (char *data, size_t len, int is_read_only)
continue;
if (ph[i].p_flags == PF_R)
continue;
- if (ph[i].p_align != 4096)
+ if (ph[i].p_align != page_size)
continue;
if (mprotect (data + ph[i].p_vaddr,
@@ -464,8 +468,6 @@ load_thunk_from_memory (char *data, size_t len, int is_read_only)
}
#undef FUNC_NAME
-#define SCM_PAGE_SIZE 4096
-
static char*
map_file_contents (int fd, size_t len, int *is_read_only)
#define FUNC_NAME "load-thunk-from-file"
@@ -794,6 +796,11 @@ scm_find_slot_map_unlocked (const scm_t_uint32 *ip)
void
scm_bootstrap_loader (void)
{
+ page_size = getpagesize ();
+ /* page_size should be a power of two. */
+ if (page_size & (page_size - 1))
+ abort ();
+
scm_c_register_extension ("libguile-" SCM_EFFECTIVE_VERSION,
"scm_init_loader",
(scm_t_extension_init_func)scm_init_loader, NULL);