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