Commit 75143139 authored by Luís Oliveira's avatar Luís Oliveira
Browse files

Fix return value handling of mmap() and mremap()

Patch courtesy of Massimiliano Ghilardi.

(Discussion at <http://thread.gmane.org/gmane.lisp.osicat.devel/78>)
parent 2f52e6dd
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -119,6 +119,18 @@
   (object :initarg :object :reader errno-object)
   (function-name :initarg :function-name :reader function-name)))

;; NOTE: this is an ugly type-punning. An alternative is to compute
;; this value from (cffi:foreign-type-size :uintptr), but it requires
;; also knowing how many bits are in a byte.
(defconstant +most-positive-uintptr+ (with-foreign-object (p :intptr)
                                       (setf (mem-ref p :intptr) -1)
                                       (mem-ref p :uintptr)))

;; on some systems, map-failed is groveled as -1 :(
#-windows
(defvar *map-failed-pointer* (make-pointer (logand map-failed +most-positive-uintptr+)))


;;; FIXME: undocumented in cffi-grovel.
(defun make-from-pointer-function-name (type-name)
  (format-symbol t "~A-~A-~A-~A" '#:make type-name '#:from '#:pointer))
+4 −6
Original line number Diff line number Diff line
@@ -60,9 +60,8 @@

#-windows
(defwrapper "mmap" ("void*" (errno-wrapper
                             :long
                             :error-predicate (lambda (p) (= p map-failed))
                             :return-filter make-pointer))
                             :pointer
                             :error-predicate (lambda (p) (pointer-eq p *map-failed-pointer*))))
  (start :pointer)
  (length ("size_t" size))
  (prot :int)
@@ -72,9 +71,8 @@

#+linux
(defwrapper "mremap" ("void*" (errno-wrapper
                               :long
                               :error-predicate (lambda (p) (= p map-failed))
                               :return-filter make-pointer))
                               :pointer
                               :error-predicate (lambda (p) (pointer-eq p *map-failed-pointer*))))
  (old-address :pointer)
  (old-size ("size_t" size))
  (new-size ("size_t" size))