modified guix/build/syscalls.scm
@@ -1131,6 +1131,17 @@ (define MAP_FAILED #xffffffffffffffff) ;mmap failure sentinel
(define %mmap
(syscall->procedure '* "mmap" (list '* size_t int int int long)))
+(define %mmap-guardian
+ (make-guardian))
+
+(define (pump-mmap-guardian)
+ (let ((ptr (%mmap-guardian)))
+ (when ptr
+ (munmap ptr SIZE?)
+ (pump-mmap-guardian))))
+
+(add-hook! after-gc-hook pump-mmap-guardian)
+
(define* (mmap fd len #:key
(addr %null-pointer)
(prot PROT_READ)
@@ -1143,6 +1154,7 @@ (define* (mmap fd len #:key
through to the underlying file. Raise a 'system-error' exception on error.
The memory should be unmapped with `munmap'."
(let-values (((ptr err) (%mmap addr len prot flags fd offset)))
+ (%mmap-guardian ptr)
(when (= MAP_FAILED (pointer-address ptr))
(throw 'system-error "mmap" "mmap ~S with len ~S: ~A"
(list fd len (strerror err))