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