From: <wa...@te...> - 2009-09-11 02:54:16
|
Hey, I'm having some problems getting FFI to work, heres what I have:<br/><br/>;; LISP (database.lisp)<br/>;; COMPILE C DATABASE WITH<br/>;; gcc -fpic -c database.c && ld -shared -o database.so database.o<br/>(load-shared-object (merge-pathnames (pathname "database.so")))<br/><br/>(define-alien-routine c-create-block-header int<br/> (raw (* int)))<br/><br/>(let ((thing (make-alien int)))<br/> (c-create-block-header thing)<br/> (free-alien thing))<br/><br/>// C (database.c)<br/>int c_create_block_header (int* data) {<br/> if (data = NULL) {<br/> return EINVAL;<br/> }<br/> <br/> (*data) = 44;<br/> return 0;<br/>}<br/><br/>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br/>;; And heres what I get:<br/>Unhandled memory fault at #x0.<br/> [Condition of type SB-SYS:MEMORY-FAULT-ERROR]<br/><br/>Restarts:<br/> 0: [ABORT] Return to SLIME's top level.<br/> 1: [TERMINATE-THREAD] Terminate this thread (#)<br/><br/>Backtrace:<br/> 0: (SB-SYS:MEMORY-FAULT-ERROR)<br/> 1: ("foreign function: #x80641CB")<br/> 2: ("foreign function: #x8064500")<br/> 3: ("foreign function: #xB790A3F3")<br/> 4: (C-CREATE-BLOCK-HEADER #)<br/> 5: ((LAMBDA NIL))<br/><br/>----<br/><br/>Am I using this thing right? I would think that anything dynamically allocated memory should be passed into C in just this way, but SBCL (1.0.29 on Gentoo) disagrees.<br/><br/>Cheers,<br/>Warren Wilkinson |
From: Nikodemus S. <nik...@ra...> - 2009-09-11 12:47:34
|
2009/9/11 <wa...@te...>: > Am I using this thing right? I would think that anything dynamically > allocated memory should be passed into C in just this way, but SBCL (1.0.29 > on Gentoo) disagrees. The Lisp side is fine, it's your C code that is in error: > if (data = NULL) { > return EINVAL; > } You want data == NULL, not data = NULL... :) (Though you probably want to use WITH-ALIEN instead of MAKE-ALIEN & FREE-ALIEN, but that's a style-issue.) Cheers, -- Nikodemus |