wingo pushed a commit to branch wip-whippet
in repository guile.

commit 87c637ee65171f8bdff4f21a6a3b886440e17a44
Author: Andy Wingo <[email protected]>
AuthorDate: Tue Aug 5 15:31:57 2025 +0200

    Acquire unaligned memory with just one syscall
---
 src/gc-platform-gnu-linux.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/src/gc-platform-gnu-linux.c b/src/gc-platform-gnu-linux.c
index 0c61457a2..b4494ae22 100644
--- a/src/gc-platform-gnu-linux.c
+++ b/src/gc-platform-gnu-linux.c
@@ -182,6 +182,18 @@ gc_platform_release_reservation(struct gc_reservation 
reservation) {
 
 void*
 gc_platform_acquire_memory(size_t size, size_t alignment) {
+  if (alignment == 0) {
+    GC_ASSERT_EQ(size, align_down(size, getpagesize()));
+    // Use just one syscall instead of two.
+    void *mem = mmap(NULL, size, PROT_READ|PROT_WRITE,
+                     MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+    if (mem == MAP_FAILED) {
+      perror("failed to reserve address space");
+      GC_CRASH();
+    }
+    return mem;
+  }
+
   struct gc_reservation reservation =
     gc_platform_reserve_memory(size, alignment);
   return gc_platform_acquire_memory_from_reservation(reservation, 0, size);

Reply via email to