From: Nikodemus S. <nik...@ra...> - 2011-11-23 07:58:30
|
On 23 November 2011 07:11, Kouskoulas, Yanni A. > For some reason, any callback I create in lisp and pass to libportaudio, > even an empty one e.g. > (cffi:defcallback foo :int ((input :pointer) ... (userdata :pointer)) 1) > causes the program to crash when I pass it to the library. I am calling > the portaudio API with the same arguments that worked in a C program, but > I cannot reproduce the problem at all from a C program. > > sbcl 1.0.53 crashes with a division by zero error deep in alien territory, > ten stack frames in, the most recent being labeled "bogus stack frame" My first guess is that libportaudio calls the callback in a new thread, which SBCL (with the exception of Anton's Windows fork, AFAIK) cannot deal with: lisp code can currently only be called from a lisp thread. Seeing the backtrace might or might now validate that assumption. One way to work around this is to write a small C library, along eg. the following lines (pseudocode, because I'm lazy): var mailbox; function wrap_callback(callback) init_libportaudio(callback_wrapper) loop_forever msg = receive(mailbox) msg.result = callback(msg.data) function callback_wrapper(data) var msg make_message(data) send(msg, mailbox) wait_for_response(msg) var result = msg.response free(msg) return result And do (make-thread #'callback_wrapper :arguments callback) on the Lisp side. Cheers, -- nikodemus |