From: Tom W. <tom...@gm...> - 2009-06-14 10:00:33
|
Hello, I have a C functions for doing binary writes to fastcgi: just a wrapper of fwrite: #include "fcgi_stdio.h" size_t fcgi_write_bin(uint * buf, int len) { size_t nact = 0; return fwrite(buf, 1, len, stdout); } On the Lisp side I have: (def-call-out fcgi_write_bin (:arguments (buf (c-array-ptr uint8)) (len int)) (:return-type int) (:name "fcgi_write_bin")) This leaves me with the responsibility of not trying to write more data than I supply. An example would be to have a jpeg image as a vector of octets: (fcgi_write_bin image-data (length image-data)) My question is: is the vector copied to a C array before is it used by fwrite, or does fwrite read it directly? Thanks, Tom SW |
From: <Joe...@t-...> - 2009-06-15 14:05:46
|
Tom Weissmann asked: >My question is: is the vector copied to a C array before is it used by >fwrite, or does fwrite read it directly? Generally, CLISP does not give the alien world pointers to Lisp data structures. It will copy Lisp array contents onto the C execution stack and pass a pointer to that area. This should be fast enough for many purposes. Why do you inquire? Regards, Jörg Höhle. |
From: <Joe...@t-...> - 2009-06-16 10:18:08
|
Tom Weissmann wrote: >avoid using subseq Did you investigate using displaced arrays? (see MAKE-ARRAY) I believe they are as fast as original ones and can be passed as well to the FFI. You can use a sliding window technique with such a displaced array, see ADJUST-ARRAY. However, for small snippets, simple calls to SUBSEQ may end up being faster than offset calculations using ADJUST-ARRAY. Regards, Jörg Höhle |