[cffi-devel] CFFI:FOREIGN-ALLOC Problem

Volkan YAZICI yazicivo at ttmail.com
Mon Sep 7 12:45:50 UTC 2009


Hi,

I use below macro to allocate foreign vectors.

  (defmacro with-foreign-vectors ((&rest bindings) &body body)
    "Convenient macro to create foreign vector bindings. `BINDIGS' are of `(NAME
    TYPE INITIAL-CONTENTS)' format."
    `(let* ,(loop with val = (gensym)
                  for (name type initial-contents) in bindings
                  collect `(,name
                             (let ((,val ,initial-contents))
;                               (let ((*print-length* 10))
;                                 (format *trace-output* "~S => ~D ~S (~A)~%"
;                                         ',name (when ,val (length ,val))
;                                         ,val (find nil ,val)))
                               (foreign-alloc ,type
                                              :count (length ,val)
                                              :initial-contents ,val))))
       (unwind-protect (progn , at body)
         ,@(mapcar
            (lambda (name) `(foreign-free ,name))
            (mapcar #'car bindings)))))

But while running the program, it throws below error message. (I
experience same situation in both SBCL and CCL.)

  NALP> (compare-partitionings
         "/home/vy/bilkent/projects/xml/t/xmark-1024-20091006-1314-small/"
         "/home/vy/bilkent/projects/xml/t/xmark-1024-20091006-1314-small/sanitized-logs.out"
         "/home/vy/bilkent/projects/xml/t/xmark-1024-20091006-1314-small/weights.out"
         40 16 0.2)
  N-PTR => 1 #(7536) (NIL)
  XADJ-PTR => 7537 #(0 1 3 5 6 8 10 12 14 16 ...) (NIL)
  ADJNCY-PTR => 8011 #(1 80 2 5666 3 4 2044 5 2292 6 ...) (NIL)
  ; Evaluation aborted.

  ; The value NIL is not of type (SIGNED-BYTE 32).
  ;    [Condition of type TYPE-ERROR]
  ; 
  ; Restarts:
  ;  0: [RETRY] Retry SLIME REPL evaluation request.
  ;  1: [ABORT] Return to SLIME's top level.
  ;  2: [TERMINATE-THREAD] Terminate this thread (#<THREAD "repl-thread" RUNNING {AA75079}>)
  ; 
  ; Backtrace:
  ;   0: (CFFI-SYS:%MEM-SET NIL #.(SB-SYS:INT-SAP #X080C8850) :INT 16620)
  ;       Locals:
  ;         CFFI-SYS::OFFSET = 16620
  ;         CFFI-SYS::PTR = #.(SB-SYS:INT-SAP #X080C8850)
  ;         TYPE = :INT
  ;         CFFI-SYS::VALUE = NIL
  ;   1: (FOREIGN-ALLOC :INT)[:EXTERNAL]
  ;       Locals:
  ;         SB-DEBUG::ARG-0 = 5
  ;         SB-DEBUG::ARG-1 = :INT
  ;   2: (METIS-BIPARTITION-GRAPH-FFI #(0 1 3 5 6 8 ...) #(1 80 2 5666 3 4 ...) #(1 1 1 1 1 1 ...) #(20 7 13 1 19 20 ...) 0.2)
  ;       Locals:
  ;         SB-DEBUG::ARG-0 = #(0 1 3 5 6 8 ...)
  ;         SB-DEBUG::ARG-1 = #(1 80 2 5666 3 4 ...)
  ;         SB-DEBUG::ARG-2 = #(1 1 1 1 1 1 ...)
  ;         SB-DEBUG::ARG-3 = #(20 7 13 1 19 20 ...)
  ;         SB-DEBUG::ARG-4 = 0.2

When I look at the printed results, there doesn't appear any `NIL'
values in any of the `:INITIAL-CONTENTS' vectors. But error tells that
one of the `VALUE' arguments passed to `CFFI-SYS:%MEM-SET' is `NIL'.

Below are some of the detailed macroexpansions related to
`CFFI-SYS:%MEM-SET'.

  (define-mem-accessors
    (:char sb-sys:signed-sap-ref-8)
    (:unsigned-char sb-sys:sap-ref-8)
    (:short sb-sys:signed-sap-ref-16)
    (:unsigned-short sb-sys:sap-ref-16)
    (:int sb-sys:signed-sap-ref-32)
    (:unsigned-int sb-sys:sap-ref-32)
    (:long sb-sys:signed-sap-ref-word)
    (:unsigned-long sb-sys:sap-ref-word)
    (:long-long sb-sys:signed-sap-ref-64)
    (:unsigned-long-long sb-sys:sap-ref-64)
    (:float sb-sys:sap-ref-single)
    (:double sb-sys:sap-ref-double)
    (:pointer sb-sys:sap-ref-sap))

Which turns into below form if I macroexpand the `DEFINE-MEM-ACCESSORS'.

  ...
  (DEFUN %MEM-SET (VALUE PTR TYPE &OPTIONAL (OFFSET 0))
    (ECASE TYPE
      (:CHAR (SETF (SB-SYS:SIGNED-SAP-REF-8 PTR OFFSET) VALUE))
      (:UNSIGNED-CHAR (SETF (SB-SYS:SAP-REF-8 PTR OFFSET) VALUE))
      (:SHORT (SETF (SB-SYS:SIGNED-SAP-REF-16 PTR OFFSET) VALUE))
      (:UNSIGNED-SHORT (SETF (SB-SYS:SAP-REF-16 PTR OFFSET) VALUE))
      (:INT (SETF (SB-SYS:SIGNED-SAP-REF-32 PTR OFFSET) VALUE))
      (:UNSIGNED-INT (SETF (SB-SYS:SAP-REF-32 PTR OFFSET) VALUE))
      (:LONG (SETF (SB-SYS:SIGNED-SAP-REF-WORD PTR OFFSET) VALUE))
      (:UNSIGNED-LONG (SETF (SB-SYS:SAP-REF-WORD PTR OFFSET) VALUE))
      (:LONG-LONG (SETF (SB-SYS:SIGNED-SAP-REF-64 PTR OFFSET) VALUE))
      (:UNSIGNED-LONG-LONG (SETF (SB-SYS:SAP-REF-64 PTR OFFSET) VALUE))
      (:FLOAT (SETF (SB-SYS:SAP-REF-SINGLE PTR OFFSET) VALUE))
      (:DOUBLE (SETF (SB-SYS:SAP-REF-DOUBLE PTR OFFSET) VALUE))
      (:POINTER (SETF (SB-SYS:SAP-REF-SAP PTR OFFSET) VALUE))))
  ...

To be honest, I need some urgent assistance. Any helps will be really
appreciated.


Regards.




More information about the cffi-devel mailing list