I was trying to use Edi Weitz' drakma http client the other day, and found that it depends on cl+ssl which, in turn, uses CFFI's with-pointer-to-vector-data.
I run ACL, and with-pointer-to-vector-data is commented out in cffi-allegro.
I *believe* that the following definition is what's needed, but have not been able to test it well enough to be sure (I don't really know what might kill it); it was mostly assembled by stumbling through the Franz FF interface documentation. IIUC, we needn't do anything to get a pointer for the C code to use, the important thing is to avoid having the lisp gc move the byte vector around, which is accomplished by the use of register-lisp-value.
HTH, R
for cffi-allegro.lisp:
(defun make-shareable-byte-vector (size) "Create a Lisp vector of SIZE bytes that can be passed to WITH-POINTER-TO-VECTOR-DATA." (make-array size :element-type '(unsigned-byte 8)))
;;; this is a crazy whack at trying to make the shared vectors work. ;;; The support functions just make sure that the vector doesn't get ;;; moved around, so we have a stable pointer, and then I think ;;; passing the vector will Just Work\tm. [2006/09/11:rpg] (defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) "Bind PTR-VAR to a foreign pointer to the data in VECTOR." `(unwind-protect (progn (foreign-functions:register-lisp-value ,vector) (let ((,ptr-var ,vector)) ,@body)) (foreign-functions:unregister-lisp-value ,vector)))