1 @node Foreign Function Interface
2 @comment node-name, next, previous, up
3 @chapter Foreign Function Interface
5 This chapter describes SBCL's interface to C programs and
6 libraries (and, since C interfaces are a sort of @emph{ingua
7 franca} of the Unix world, to other programs and libraries in
11 Note: In the modern Lisp world, the usual term for this functionality
12 is Foreign Function Interface, or @acronym{FFI}, where despite the
13 mention of ``function'' in this term, @acronym{FFI} also
14 refers to direct manipulation of C data structures as well as
15 functions. The traditional CMUCL terminology is Alien Interface, and
16 while that older terminology is no longer used much in the system
17 documentation, it still reflected in names in the implementation,
18 notably in the name of the @code{SB-ALIEN} package.
22 * Introduction to the Foreign Function Interface::
24 * Operations On Foreign Values::
26 * Foreign Data Structure Examples::
27 * Loading Shared Object Files::
28 * Foreign Function Calls::
29 * Step-By-Step Example of the Foreign Function Interface::
32 @node Introduction to the Foreign Function Interface
33 @comment node-name, next, previous, up
34 @section Introduction to the Foreign Function Interface
35 @c AKA "Introduction to Aliens" in the CMU CL manual
37 Because of Lisp's emphasis on dynamic memory allocation and garbage
38 collection, Lisp implementations use non-C-like memory representations
39 for objects. This representation mismatch creates friction when a Lisp
40 program must share objects with programs which expect C data. There
41 are three common approaches to establishing communication:
45 The burden can be placed on the foreign program (and programmer) by
46 requiring the knowledge and use of the representations used internally
47 by the Lisp implementation. This can require a considerable amount of
48 ``glue'' code on the C side, and that code tends to be sensitively
49 dependent on the internal implementation details of the Lisp system.
52 The Lisp system can automatically convert objects back and forth
53 between the Lisp and foreign representations. This is convenient, but
54 translation becomes prohibitively slow when large or complex data
55 structures must be shared. This approach is supported by the SBCL
56 @acronym{FFI}, and used automatically by the when passing integers and
60 The Lisp program can directly manipulate foreign objects through the
61 use of extensions to the Lisp language.
65 SBCL, like CMUCL before it, relies primarily on the automatic
66 conversion and direct manipulation approaches. The @code{SB-ALIEN}
67 package provices a facility wherein foreign values of simple scalar
68 types are automatically converted and complex types are directly
69 manipulated in their foreign representation. Additionally the
70 lower-level System Area Pointers (or @acronym{SAP}s) can be used where
71 necessary to provide untyped access to foreign memory.
73 Any foreign objects that can't automatically be converted into Lisp
74 values are represented by objects of type @code{alien-value}. Since
75 Lisp is a dynamically typed language, even foreign objects must have a
76 run-time type; this type information is provided by encapsulating the
77 raw pointer to the foreign data within an @code{alien-value} object.
79 The type language and operations on foreign types are
80 intentionally similar to those of the C language.
83 @comment node-name, next, previous, up
84 @section Foreign Types
85 @c AKA "Alien Types" in the CMU CL manual
87 Alien types have a description language based on nested list
88 structure. For example the C type
97 has the corresponding SBCL @acronym{FFI} type
102 (b (array (* (struct foo)) 100)))
107 * Defining Foreign Types::
108 * Foreign Types and Lisp Types::
109 * Foreign Type Specifiers::
112 @node Defining Foreign Types
113 @comment node-name, next, previous, up
114 @subsection Defining Foreign Types
116 Types may be either named or anonymous. With structure and union
117 types, the name is part of the type specifier, allowing recursively
118 defined types such as:
121 (struct foo (a (* (struct foo))))
124 An anonymous structure or union type is specified by using the name
125 @code{nil}. The @code{with-alien} macro defines a local scope which
126 ``captures'' any named type definitions. Other types are not
127 inherently named, but can be given named abbreviations using the
128 @code{define-alien-type} macro.
130 @node Foreign Types and Lisp Types
131 @comment node-name, next, previous, up
132 @subsection Foreign Types and Lisp Types
134 The foreign types form a subsystem of the SBCL type system. An
135 @code{alien} type specifier provides a way to use any foreign type as a
136 Lisp type specifier. For example,
139 (typep @var{foo} '(alien (* int)))
142 can be used to determine whether @var{foo} is a pointer to a foreign
143 @code{int}. @code{alien} type specifiers can be used in the same ways
144 as ordinary Lisp type specifiers (like @code{string}.) Alien type
145 declarations are subject to the same precise type checking as any
146 other declaration. @xref{Precise Type Checking}.
148 Note that the type identifiers used in the foreign type system overlap
149 with native Lisp type specifiers in some cases. For example, the type
150 specifier @code{(alien single-float)} is identical to
151 @code{single-float}, since foreign floats are automatically converted
152 to Lisp floats. When @code{type-of} is called on an alien value that
153 is not automatically converted to a Lisp value, then it will return an
154 @code{alien} type specifier.
156 @node Foreign Type Specifiers
157 @comment node-name, next, previous, up
158 @subsection Foreign Type Specifiers
160 Note: All foreign type names are exported from the @code{sb-alien}
161 package. Some foreign type names are also symbols in
162 the @code{common-lisp} package, in which case they are
163 reexported from the @code{sb-alien} package, so that
164 e.g. it is legal to refer to @code{sb-alien:single-float}.
166 These are the basic foreign type specifiers:
170 The foreign type specifier @code{(* @var{foo})} describes a pointer to
171 an object of type @var{foo}. A pointed-to type @var{foo} of @code{t}
172 indicates a pointer to anything, similar to @code{void *} in
173 ANSI C. A null alien pointer can be detected with the
174 @code{sb-alien:null-alien} function.
177 The foreign type specifier @code{(array @var{foo} &rest
178 dimensions)} describes array of the specified @code{dimensions},
179 holding elements of type @var{foo}. Note that (unlike in C) @code{(*
180 @var{foo})} and @code{(array @var{foo})} are considered to be
181 different types when type checking is done. If equivalence of pointer
182 and array types is desired, it may be explicitly coerced using
183 @code{sb-alien:cast}.
185 Arrays are accessed using @code{sb-alien:deref}, passing the indices
186 as additional arguments. Elements are stored in column-major order
187 (as in C), so the first dimension determines only the size of the
188 memory block, and not the layout of the higher dimensions. An array
189 whose first dimension is variable may be specified by using @code{nil}
190 as the first dimension. Fixed-size arrays can be allocated as array
191 elements, structure slots or @code{sb-alien:with-alien}
192 variables. Dynamic arrays can only be allocated using
193 @code{sb-alien:make-alien}.
196 The foreign type specifier @code{(sb-alien:struct @var{name} &rest
197 @var{fields})} describes a structure type with the specified
198 @var{name} and @var{fields}. Fields are allocated at the same offsets
199 used by the implementation's C compiler. If @var{name} is @code{nil}
200 then the structure is anonymous.
202 If a named foreign @code{struct} specifier is passed to
203 @code{define-alien-type} or @code{with-alien}, then this defines,
204 respectively, a new global or local foreign structure type. If no
205 @var{fields} are specified, then the fields are taken
206 from the current (local or global) alien structure type definition of
210 The foreign type specifier @code{(sb-alien:union @var{name} &rest
211 @var{fields})} is similar to @code{sb-alien:struct}, but describes a
212 union type. All fields are allocated at the same offset, and the size
213 of the union is the size of the largest field. The programmer must
214 determine which field is active from context.
217 The foreign type specifier @code{(sb-alien:enum @var{name} &rest
218 @var{specs})} describes an enumeration type that maps between integer
219 values and symbols. If @var{name} is @code{nil}, then the type is
220 anonymous. Each element of the @var{specs} list is either a Lisp
221 symbol, or a list @code{(@var{symbol} @var{value})}. @var{value} is
222 an integer. If @var{value} is not supplied, then it defaults to one
223 greater than the value for the preceding spec (or to zero if it is the
227 The foreign type specifier @code{(sb-alien:signed &optional
228 @var{bits})} specifies a signed integer with the specified number of
229 @var{bits} precision. The upper limit on integer
230 precision is determined by the machine's word size. If
231 @var{bits} is not specified, the maximum size will be
235 The foreign type specifier @code{(integer &optional @var{bits})}
236 is equivalent to the corresponding type specifier using
237 @code{sb-alien:signed} instead of @code{integer}.
240 The foreign type specifier @code{(sb-alien:unsigned &optional
241 @var{bits})} is like corresponding type specifier using
242 @code{sb-alien:signed} except that the variable is treated as an
246 The foreign type specifier @code{(boolean &optional @var{bits})} is
247 similar to an enumeration type, but maps from Lisp @code{nil} and
248 @code{t} to C @code{0} and @code{1} respectively. @var{bits}
249 determines the amount of storage allocated to hold the truth value.
252 The foreign type specifier @code{single-float} describes a
253 floating-point number in IEEE single-precision format.
256 The foreign type specifier @code{double-float} describes a
257 floating-point number in IEEE double-precision format.
260 The foreign type specifier @code{(function @var{result-type} &rest
261 @var{arg-types})} describes a foreign function that takes arguments of
262 the specified @var{arg-types} and returns a result of type
263 @var{result-type}. Note that the only context where a foreign
264 @code{function} type is directly specified is in the argument to
265 @code{sb-alien:alien-funcall}. In all other contexts, foreign
266 functions are represented by foreign function pointer types: @code{(*
267 (function @dots{}))}.
270 The foreign type specifier @code{sb-alien:system-area-pointer}
271 describes a pointer which is represented in Lisp as a
272 @code{system-area-pointer} object. SBCL exports this type from
273 @code{sb-alien} because CMUCL did, but tentatively (as of the first
274 draft of this section of the manual, SBCL 0.7.6) it is deprecated,
275 since it doesn't seem to be required by user code.
278 The foreign type specifier @code{sb-alien:void} is used in function
279 types to declare that no useful value is returned. Using
280 @code{alien-funcall} to call a @code{void} foreign function will
284 The foreign type specifier @code{sb-alien:c-string} is similar to
285 @code{(* char)}, but is interpreted as a null-terminated string, and is
286 automatically converted into a Lisp string when accessed; or if the
287 pointer is C @code{NULL} or @code{0}, then accessing it gives Lisp
288 @code{nil}. Lisp strings of type @code{base-string} are stored with a
289 trailing NUL termination, so no copying (either by the user or the
290 implementation) is necessary when passing them to foreign code; strings
291 of type @code{(simple-array character (*))} are copied by the
292 implementation as required.
294 Assigning a Lisp string to a @code{c-string} structure field or
295 variable stores the contents of the string to the memory already
296 pointed to by that variable. When a foreign object of type @code{(*
297 char)} is assigned to a @code{c-string}, then the
298 @code{c-string} pointer is assigned to. This allows
299 @code{c-string} pointers to be initialized. For example:
302 (cl:in-package "CL-USER") ; which USEs package "SB-ALIEN"
304 (define-alien-type nil (struct foo (str c-string)))
306 (defun make-foo (str)
307 (let ((my-foo (make-alien (struct foo))))
308 (setf (slot my-foo 'str) (make-alien char (length str))
309 (slot my-foo 'str) str)
313 Storing Lisp @code{NIL} in a @code{c-string} writes C @code{NULL} to
317 @code{sb-alien} also exports translations of these C type
318 specifiers as foreign type specifiers: @code{sb-alien:char},
319 @code{sb-alien:short}, @code{sb-alien:int},
320 @code{sb-alien:long}, @code{sb-alien:unsigned-char},
321 @code{sb-alien:unsigned-short},
322 @code{sb-alien:unsigned-int},
323 @code{sb-alien:unsigned-long}, @code{sb-alien:float}, and
324 @code{sb-alien:double}.
328 @node Operations On Foreign Values
329 @comment node-name, next, previous, up
330 @section Operations On Foreign Values
331 @c AKA "Alien Operations" in the CMU CL manual
333 This section describes how to read foreign values as Lisp values, how
334 to coerce foreign values to different kinds of foreign values, and how
335 to dynamically allocate and free foreign variables.
338 * Accessing Foreign Values::
339 * Coercing Foreign Values::
340 * Foreign Dynamic Allocation::
343 @node Accessing Foreign Values
344 @comment node-name, next, previous, up
345 @subsection Accessing Foreign Values
347 @defun sb-alien:deref @var{pointer-or-array} &rest @var{indices}
350 The @code{sb-alien:deref} function returns the value pointed to by a
351 foreign pointer, or the value of a foreign array element. When
352 dereferencing a pointer, an optional single index can be specified to
353 give the equivalent of C pointer arithmetic; this index is scaled by
354 the size of the type pointed to. When dereferencing an array, the
355 number of indices must be the same as the number of dimensions in the
356 array type. @code{deref} can be set with @code{setf} to assign a new
360 @defun sb-alien:slot @var{struct-or-union} &rest @var{slot-names}
363 The @code{sb-alien:slot} function extracts the value of the slot named
364 @var{slot-name} from a foreign @code{struct} or @code{union}. If
365 @var{struct-or-union} is a pointer to a structure or union, then it is
366 automatically dereferenced. @code{sb-alien:slot} can be set with
367 @code{setf} to assign a new value. Note that @var{slot-name} is
368 evaluated, and need not be a compile-time constant (but only constant
369 slot accesses are efficiently compiled).
373 @subsubsection Untyped memory
375 As noted at the beginning of the chapter, the System Area Pointer
376 facilities allow untyped access to foreign memory. @acronym{SAP}s can
377 be converted to and from the usual typed foreign values using
378 @code{sap-alien} and @code{alien-sap} (described elsewhere), and also
379 to and from integers - raw machine addresses. They should thus be
380 used with caution; corrupting the Lisp heap or other memory with
381 @acronym{SAP}s is trivial.
383 @defun sb-sys:int-sap @var{machine-address}
386 Creates a @acronym{SAP} pointing at the virtual address
387 @var{machine-address}.
390 @defun sb-sys:sap-ref-32 @var{sap} @var{offset}
393 Access the value of the memory location at @var{offset} bytes from
394 @var{sap}. This form may also be used with @code{setf} to alter the
395 memory at that location.
398 @defun sb-sys:sap= @var{sap1} @var{sap2}
401 Compare @var{sap1} and @var{sap2} for equality.
404 Similarly named functions exist for accessing other sizes of word,
405 other comparisons, and other conversions. The reader is invited to
406 use @code{apropos} and @code{describe} for more details
409 (apropos "sap" :sb-sys)
413 @node Coercing Foreign Values
414 @comment node-name, next, previous, up
415 @subsection Coercing Foreign Values
417 @defun sb-alien:addr @var{alien-expr}
420 The @code{sb-alien:addr} macro returns a pointer to the location
421 specified by @var{alien-expr}, which must be either a foreign
422 variable, a use of @code{sb-alien:deref}, a use of
423 @code{sb-alien:slot}, or a use of @code{sb-alien:extern-alien}.
426 @defun sb-alien:cast @var{foreign-value} @var{new-type}
429 The @code{sb-alien:cast} macro converts @var{foreign-value} to a new
430 foreign value with the specified @var{new-type}. Both types, old and
431 new, must be foreign pointer, array or function types. Note that the
432 resulting Lisp foreign variable object is not @code{eq} to the
433 argument, but it does refer to the same foreign data bits.
436 @defun sb-alien:sap-alien @var{sap} @var{type}
439 The @code{sb-alien:sap-alien} function converts @var{sap} (a system
440 area pointer) to a foreign value with the specified
441 @var{type}. @var{type} is not evaluated. </para>
443 The @var{type} must be some foreign pointer, array, or record type.
446 @defun sb-alien:alien-sap @var{foreign-value} @var{type}
449 The @code{sb-alien:alien-sap} function returns the @acronym{SAP} which
450 points to @var{alien-value}'s data.
452 The @var{foreign-value} must be of some foreign pointer, array, or
457 @node Foreign Dynamic Allocation
458 @comment node-name, next, previous, up
459 @subsection Foreign Dynamic Allocation
461 Lisp code can call the C standard library functions @code{malloc} and
462 @code{free} to dynamically allocate and deallocate foreign
463 variables. The Lisp code shares the same allocator with foreign C
464 code, so it's OK for foreign code to call @code{free} on the result of
465 Lisp @code{sb-alien:make-alien}, or for Lisp code to call
466 @code{sb-alien:free-alien} on foreign objects allocated by C
469 @defmac sb-alien:make-alien @var{type} @var{size}
472 The @code{sb-alien:make-alien} macro
473 returns a dynamically allocated foreign value of the specified
474 @var{type} (which is not evaluated.) The allocated memory is not
475 initialized, and may contain arbitrary junk. If supplied,
476 @var{size} is an expression to evaluate to compute the size of the
477 allocated object. There are two major cases:
481 When @var{type} is a foreign array type, an array of that type is
482 allocated and a pointer to it is returned. Note that you must use
483 @code{deref} to change the result to an array before you can use
484 @code{deref} to read or write elements:
487 (cl:in-package "CL-USER") ; which USEs package "SB-ALIEN"
488 (defvar *foo* (make-alien (array char 10)))
489 (type-of *foo*) @result{} (alien (* (array (signed 8) 10)))
490 (setf (deref (deref foo) 0) 10) @result{} 10
493 If supplied, @var{size} is used as the first dimension for the
497 When @var{type} is any other foreign type, then an object for that
498 type is allocated, and a pointer to it is returned. So
499 @code{(make-alien int)} returns a @code{(* int)}. If @var{size} is
500 specified, then a block of that many objects is allocated, with the
501 result pointing to the first one.
507 @defun sb-alien:free-alien @var{foreign-value}
510 The @code{sb-alien:free-alien} function
511 frees the storage for @var{foreign-value},
512 which must have been allocated with Lisp @code{make-alien}
515 See also the @code{sb-alien:with-alien} macro, which allocates foreign
519 @node Foreign Variables
520 @comment node-name, next, previous, up
521 @section Foreign Variables
522 @c AKA "Alien Variables" in the CMU CL manual
524 Both local (stack allocated) and external (C global) foreign variables
528 * Local Foreign Variables::
529 * External Foreign Variables::
532 @node Local Foreign Variables
533 @comment node-name, next, previous, up
534 @subsection Local Foreign Variables
536 @defmac sb-alien:with-alien @var{var-definitions} &body @var{body}
539 The @code{with-alien} macro establishes local foreign variables with
540 the specified alien types and names. This form is analogous to
541 defining a local variable in C: additional storage is allocated, and
542 the initial value is copied. This form is less analogous to
543 @code{LET}-allocated Lisp variables, since the variables can't be
544 captured in closures: they live only for the dynamic extent of the
545 body, and referring to them outside is a gruesome error.
547 The @var{var-definitions} argument is a list of
548 variable definitions, each of the form
550 (@var{name} @var{type} &optional @var{initial-value})
553 The names of the variables are established as symbol-macros; the
554 bindings have lexical scope, and may be assigned with @code{setq} or
557 The @code{with-alien} macro also establishes a new scope for named
558 structures and unions. Any @var{type} specified for a variable may
559 contain named structure or union types with the slots specified.
560 Within the lexical scope of the binding specifiers and body, a locally
561 defined foreign structure type @var{foo} can be referenced by its name
562 using @code{(struct @var{foo})}.
565 @node External Foreign Variables
566 @comment node-name, next, previous, up
567 @subsection External Foreign Variables
569 External foreign names are strings, and Lisp names are symbols. When
570 an external foreign value is represented using a Lisp variable, there
571 must be a way to convert from one name syntax into the other. The
572 macros @code{extern-alien}, @code{define-alien-variable} and
573 @code{define-alien-routine} use this conversion heuristic:
578 Alien names are converted to Lisp names by uppercasing and replacing
579 underscores with hyphens.
582 Conversely, Lisp names are converted to alien names by lowercasing and
583 replacing hyphens with underscores.
586 Both the Lisp symbol and alien string names may be separately
587 specified by using a list of the form
590 (alien-string lisp-symbol)
595 @defmac sb-alien:define-alien-variable @var{name} @var{type}
596 @findex define-alien-variable
598 The @code{define-alien-variable} macro defines @var{name} as an
599 external foreign variable of the specified foreign @code{type}.
600 @var{name} and @code{type} are not evaluated. The Lisp name of the
601 variable (see above) becomes a global alien variable. Global alien
602 variables are effectively ``global symbol macros''; a reference to the
603 variable fetches the contents of the external variable. Similarly,
604 setting the variable stores new contents -- the new contents must be
605 of the declared @code{type}. Someday, they may well be implemented
606 using the @acronym{ANSI} @code{define-symbol-macro} mechanism, but as
607 of SBCL 0.7.5, they are still implemented using an older more-or-less
608 parallel mechanism inherited from CMUCL.
610 For example, to access a C-level counter @var{foo}, one could write
613 (define-alien-variable "foo" int)
614 ;; Now it is possible to get the value of the C variable foo simply by
615 ;; referencing that Lisp variable:
622 @defun sb-alien:get-errno
625 Since in modern C libraries, the @code{errno} ``variable'' is typically
626 no longer a variable, but some bizarre artificial construct
627 which behaves superficially like a variable within a given thread,
628 it can no longer reliably be accessed through the ordinary
629 @code{define-alien-variable} mechanism. Instead, SBCL provides
630 the operator @code{sb-alien:get-errno} to allow Lisp code to read it.
633 @defmac sb-alien:extern-alien @var{name} @var{type}
636 The @code{extern-alien} macro returns an alien with the specified
637 @var{type} which points to an externally defined value. @var{name} is
638 not evaluated, and may be either a string or a symbol. @var{type} is
639 an unevaluated alien type specifier.
642 @node Foreign Data Structure Examples
643 @comment node-name, next, previous, up
644 @section Foreign Data Structure Examples
645 @c AKA "Alien Data Structure Example" in the CMU CL manual
647 Now that we have alien types, operations and variables, we can
648 manipulate foreign data structures. This C declaration
657 can be translated into the following alien type:
660 (define-alien-type nil
663 (b (array (* (struct foo)) 100))))
666 Once the @code{foo} alien type has been defined as above, the C
674 can be translated in this way:
677 (with-alien ((f (struct foo)))
678 (slot (deref (slot f 'b) 7) 'a)
680 ;; Do something with f...
684 Or consider this example of an external C variable and some accesses:
693 extern struct c_struct *my_struct;
696 my_struct = my_struct->n;
699 which can be manipulated in Lisp like this:
702 (define-alien-type nil
710 (define-alien-variable "my_struct" (* c-struct))
711 (incf (slot my-struct 'x))
712 (setf (slot my-struct 'a) 5)
713 (setq my-struct (slot my-struct 'n))
716 @node Loading Shared Object Files
717 @comment node-name, next, previous, up
718 @section Loading Shared Object Files
720 Foreign object files can be loaded into the running Lisp process by
721 calling @code{load-shared-object}.
723 @include fun-sb-alien-load-shared-object.texinfo
725 @node Foreign Function Calls
726 @comment node-name, next, previous, up
727 @section Foreign Function Calls
729 The foreign function call interface allows a Lisp program to call
730 many functions written in languages that use the C calling convention.
732 Lisp sets up various signal handling routines and other environment
733 information when it first starts up, and expects these to be in place
734 at all times. The C functions called by Lisp should not change the
735 environment, especially the signal handlers: the signal handlers
736 installed by Lisp typically have interesting flags set (e.g to request
737 machine context information, or for signal delivery on an alternate
738 stack) which the Lisp runtime relies on for correct operation.
739 Precise details of how this works may change without notice between
740 versions; the source, or the brain of a friendly SBCL developer, is
741 the only documentation. Users of a Lisp built with the
742 @code{:sb-thread} feature should also read the section about threads,
746 * The alien-funcall Primitive::
747 * The define-alien-routine Macro::
748 * define-alien-routine Example::
749 * Calling Lisp From C::
752 @node The alien-funcall Primitive
753 @comment node-name, next, previous, up
754 @subsection The @code{alien-funcall} Primitive
756 @defun sb-alien:alien-funcall @var{alien-function} &rest @var{arguments}
757 @findex alien-funcall
759 The @code{alien-funcall} function is the foreign function call
760 primitive: @var{alien-function} is called with the supplied
761 @var{arguments} and its C return value is returned as a Lisp value.
762 The @var{alien-function} is an arbitrary run-time expression; to refer
763 to a constant function, use @code{extern-alien} or a value defined by
764 @code{define-alien-routine}.
766 The type of @code{alien-function} must be @code{(alien (function
767 ...))} or @code{(alien (* (function ...)))}. The function type is
768 used to determine how to call the function (as though it was declared
769 with a prototype.) The type need not be known at compile time, but
770 only known-type calls are efficiently compiled. Limitations:
775 Structure type return values are not implemented.
778 Passing of structures by value is not implemented.
784 Here is an example which allocates a @code{(struct foo)}, calls a
785 foreign function to initialize it, then returns a Lisp vector of all
786 the @code{(* (struct foo))} objects filled in by the foreign call:
789 ;; Allocate a foo on the stack.
790 (with-alien ((f (struct foo)))
791 ;; Call some C function to fill in foo fields.
792 (alien-funcall (extern-alien "mangle_foo" (function void (* foo)))
794 ;; Find how many foos to use by getting the A field.
795 (let* ((num (slot f 'a))
796 (result (make-array num)))
797 ;; Get a pointer to the array so that we don't have to keep extracting it:
798 (with-alien ((a (* (array (* (struct foo)) 100)) (addr (slot f 'b))))
799 ;; Loop over the first N elements and stash them in the result vector.
801 (setf (svref result i) (deref (deref a) i)))
806 @node The define-alien-routine Macro
807 @comment node-name, next, previous, up
808 @subsection The @code{define-alien-routine} Macro
810 @defmac sb-alien:define-alien-routine @var{name} @var{result-type} &rest @var{arg-specifiers}
811 @findex define-alien-routine
813 The @code{define-alien-routine} macro is a convenience for
814 automatically generating Lisp interfaces to simple foreign functions.
815 The primary feature is the parameter style specification, which
816 translates the C pass-by-reference idiom into additional return
819 @var{name} is usually a string external symbol, but may also be a
820 symbol Lisp name or a list of the foreign name and the Lisp name. If
821 only one name is specified, the other is automatically derived as for
822 @code{extern-alien}. @var{result-type} is the alien type of the
825 Each element of the @var{arg-specifiers} list
826 specifies an argument to the foreign function, and is
829 (aname atype &optional style)
832 @var{aname} is the symbol name of the argument to the constructed
833 function (for documentation). @var{atype} is the alien type of
834 corresponding foreign argument. The semantics of the actual call are
835 the same as for @code{alien-funcall}. @var{style} specifies how this
836 argument should be handled at call and return time, and should be one
842 @code{:in} specifies that the argument is passed by value. This is the
843 default. @code{:in} arguments have no corresponding return value from
847 @code{:copy} is similar to @code{:in}, but the argument is copied to a
848 pre-allocated object and a pointer to this object is passed to the
852 @code{:out} specifies a pass-by-reference output value. The type of
853 the argument must be a pointer to a fixed-sized object (such as an
854 integer or pointer). @code{:out} and @code{:in-out} style cannot be
855 used with pointers to arrays, records or functions. An object of the
856 correct size is allocated on the stack, and its address is passed to
857 the foreign function. When the function returns, the contents of this
858 location are returned as one of the values of the Lisp function (and
859 the location is automatically deallocated).
862 @code{:in-out} is a combination of @code{:copy} and @code{:out}. The
863 argument is copied to a pre-allocated object and a pointer to this
864 object is passed to the foreign routine. On return, the contents of
865 this location is returned as an additional value.
870 Note: Any efficiency-critical foreign interface function should be inline
871 expanded, which can be done by preceding the
872 @code{define-alien-routine} call with:
875 (declaim (inline lisp-name))
878 In addition to avoiding the Lisp call overhead, this allows
879 pointers, word-integers and floats to be passed using non-descriptor
880 representations, avoiding consing.)
885 @node define-alien-routine Example
886 @comment node-name, next, previous, up
887 @subsection @code{define-alien-routine} Example
889 Consider the C function @code{cfoo} with the following calling
896 char *a; /* update */
899 /* body of cfoo(...) */
903 This can be described by the following call to
904 @code{define-alien-routine}:
907 (define-alien-routine "cfoo" void
913 The Lisp function @code{cfoo} will have two arguments (@var{str} and
914 @var{a}) and two return values (@var{a} and @var{i}).
916 @node Calling Lisp From C
917 @comment node-name, next, previous, up
918 @subsection Calling Lisp From C
920 Calling Lisp functions from C is sometimes possible, but is extremely
921 hackish and poorly supported as of SBCL 0.7.5. See @code{funcall0}
922 @dots{} @code{funcall3} in the runtime system. The arguments must be
923 valid SBCL object descriptors (so that e.g. fixnums must be
924 left-shifted by 2.) As of SBCL 0.7.5, the format of object descriptors
925 is documented only by the source code and, in parts, by the old CMUCL
926 @file{INTERNALS} documentation.
928 Note that the garbage collector moves objects, and won't be
929 able to fix up any references in C variables. There are three
930 mechanisms for coping with this:
934 The @code{sb-ext:purify} moves all live Lisp
935 data into static or read-only areas such that it will never be moved
936 (or freed) again in the life of the Lisp session
939 @code{sb-sys:with-pinned-objects} is a macro which arranges for some
940 set of objects to be pinned in memory for the dynamic extent of its
941 body forms. On ports which use the generational garbage collector (as
942 of SBCL 0.8.3, only the x86) this has a page granularity - i.e. the
943 entire 4k page or pages containing the objects will be locked down. On
944 other ports it is implemented by turning off GC for the duration (so
945 could be said to have a whole-world granularity).
948 Disable GC, using the @code{without-gcing} macro or @code{gc-off}
952 @c <!-- FIXME: This is a "changebar" section from the CMU CL manual.
953 @c I (WHN 2002-07-14) am not very familiar with this content, so
954 @c I'm not immediately prepared to try to update it for SBCL, and
955 @c I'm not feeling masochistic enough to work to encourage this
956 @c kind of low-level hack anyway. However, I acknowledge that callbacks
957 @c are sometimes really really necessary, so I include the original
958 @c text in case someone is hard-core enough to benefit from it. If
959 @c anyone brings the information up to date for SBCL, it belong
960 @c either in the main manual or on a CLiki SBCL Internals page.
961 @c LaTeX \subsection{Accessing Lisp Arrays}
963 @c LaTeX Due to the way \cmucl{} manages memory, the amount of memory that can
964 @c LaTeX be dynamically allocated by \code{malloc} or \funref{make-alien} is
965 @c LaTeX limited\footnote{\cmucl{} mmaps a large piece of memory for it's own
966 @c LaTeX use and this memory is typically about 8 MB above the start of the C
967 @c LaTeX heap. Thus, only about 8 MB of memory can be dynamically
968 @c LaTeX allocated.}.
970 @c Empirically determined to be considerably >8Mb on this x86 linux
971 @c machine, but I don't know what the actual values are - dan 2003.09.01
973 @c Note that this technique is used in SB-GROVEL in the SBCL contrib
976 @c LaTeX To overcome this limitation, it is possible to access the content of
977 @c LaTeX Lisp arrays which are limited only by the amount of physical memory
978 @c LaTeX and swap space available. However, this technique is only useful if
979 @c LaTeX the foreign function takes pointers to memory instead of allocating
980 @c LaTeX memory for itself. In latter case, you will have to modify the
981 @c LaTeX foreign functions.
983 @c LaTeX This technique takes advantage of the fact that \cmucl{} has
984 @c LaTeX specialized array types (\pxlref{specialized-array-types}) that match
985 @c LaTeX a typical C array. For example, a \code{(simple-array double-float
986 @c LaTeX (100))} is stored in memory in essentially the same way as the C
987 @c LaTeX array \code{double x[100]} would be. The following function allows us
988 @c LaTeX to get the physical address of such a Lisp array:
989 @c LaTeX \begin{example}
990 @c LaTeX (defun array-data-address (array)
991 @c LaTeX "Return the physical address of where the actual data of an array is
994 @c LaTeX ARRAY must be a specialized array type in CMU Lisp. This means ARRAY
995 @c LaTeX must be an array of one of the following types:
997 @c LaTeX double-float
998 @c LaTeX single-float
999 @c LaTeX (unsigned-byte 32)
1000 @c LaTeX (unsigned-byte 16)
1001 @c LaTeX (unsigned-byte 8)
1002 @c LaTeX (signed-byte 32)
1003 @c LaTeX (signed-byte 16)
1004 @c LaTeX (signed-byte 8)
1006 @c LaTeX (declare (type (or #+signed-array (array (signed-byte 8))
1007 @c LaTeX #+signed-array (array (signed-byte 16))
1008 @c LaTeX #+signed-array (array (signed-byte 32))
1009 @c LaTeX (array (unsigned-byte 8))
1010 @c LaTeX (array (unsigned-byte 16))
1011 @c LaTeX (array (unsigned-byte 32))
1012 @c LaTeX (array single-float)
1013 @c LaTeX (array double-float))
1015 @c LaTeX (optimize (speed 3) (safety 0))
1016 @c LaTeX (ext:optimize-interface (safety 3)))
1017 @c LaTeX ;; with-array-data will get us to the actual data. However, because
1018 @c LaTeX ;; the array could have been displaced, we need to know where the
1019 @c LaTeX ;; data starts.
1020 @c LaTeX (lisp::with-array-data ((data array)
1023 @c LaTeX (declare (ignore end))
1024 @c LaTeX ;; DATA is a specialized simple-array. Memory is laid out like this:
1026 @c LaTeX ;; byte offset Value
1027 @c LaTeX ;; 0 type code (should be 70 for double-float vector)
1028 @c LaTeX ;; 4 4 * number of elements in vector
1029 @c LaTeX ;; 8 1st element of vector
1032 @c LaTeX (let ((addr (+ 8 (logandc1 7 (kernel:get-lisp-obj-address data))))
1033 @c LaTeX (type-size (let ((type (array-element-type data)))
1034 @c LaTeX (cond ((or (equal type '(signed-byte 8))
1035 @c LaTeX (equal type '(unsigned-byte 8)))
1037 @c LaTeX ((or (equal type '(signed-byte 16))
1038 @c LaTeX (equal type '(unsigned-byte 16)))
1040 @c LaTeX ((or (equal type '(signed-byte 32))
1041 @c LaTeX (equal type '(unsigned-byte 32)))
1043 @c LaTeX ((equal type 'single-float)
1045 @c LaTeX ((equal type 'double-float)
1048 @c LaTeX (error "Unknown specialized array element type"))))))
1049 @c LaTeX (declare (type (unsigned-byte 32) addr)
1050 @c LaTeX (optimize (speed 3) (safety 0) (ext:inhibit-warnings 3)))
1051 @c LaTeX (system:int-sap (the (unsigned-byte 32)
1052 @c LaTeX (+ addr (* type-size start)))))))
1053 @c LaTeX \end{example}
1055 @c LaTeX Assume we have the C function below that we wish to use:
1056 @c LaTeX \begin{example}
1057 @c LaTeX double dotprod(double* x, double* y, int n)
1060 @c LaTeX double sum = 0;
1062 @c LaTeX for (k = 0; k < n; ++k) \{
1063 @c LaTeX sum += x[k] * y[k];
1066 @c LaTeX \end{example}
1067 @c LaTeX The following example generates two large arrays in Lisp, and calls the C
1068 @c LaTeX function to do the desired computation. This would not have been
1069 @c LaTeX possible using \code{malloc} or \code{make-alien} since we need about
1070 @c LaTeX 16 MB of memory to hold the two arrays.
1071 @c LaTeX \begin{example}
1072 @c LaTeX (define-alien-routine "dotprod" double
1073 @c LaTeX (x (* double-float) :in)
1074 @c LaTeX (y (* double-float) :in)
1075 @c LaTeX (n int :in))
1077 @c LaTeX (let ((x (make-array 1000000 :element-type 'double-float))
1078 @c LaTeX (y (make-array 1000000 :element-type 'double-float)))
1079 @c LaTeX ;; Initialize X and Y somehow
1080 @c LaTeX (let ((x-addr (system:int-sap (array-data-address x)))
1081 @c LaTeX (y-addr (system:int-sap (array-data-address y))))
1082 @c LaTeX (dotprod x-addr y-addr 1000000)))
1083 @c LaTeX \end{example}
1084 @c LaTeX In this example, it may be useful to wrap the inner \code{let}
1085 @c LaTeX expression in an \code{unwind-protect} that first turns off garbage
1086 @c LaTeX collection and then turns garbage collection on afterwards. This will
1087 @c LaTeX prevent garbage collection from moving \code{x} and \code{y} after we
1088 @c LaTeX have obtained the (now erroneous) addresses but before the call to
1089 @c LaTeX \code{dotprod} is made.
1094 @node Step-By-Step Example of the Foreign Function Interface
1095 @comment node-name, next, previous, up
1096 @section Step-By-Step Example of the Foreign Function Interface
1098 This section presents a complete example of an interface to a somewhat
1099 complicated C function.
1101 Suppose you have the following C function which you want to be able to
1102 call from Lisp in the file @file{test.c}
1111 struct c_struct *c_function (i, s, r, a)
1118 struct c_struct *r2;
1120 printf("i = %d\n", i);
1121 printf("s = %s\n", s);
1122 printf("r->x = %d\n", r->x);
1123 printf("r->s = %s\n", r->s);
1124 for (j = 0; j < 10; j++) printf("a[%d] = %d.\n", j, a[j]);
1125 r2 = (struct c_struct *) malloc (sizeof(struct c_struct));
1127 r2->s = "a C string";
1132 It is possible to call this C function from Lisp using the file
1133 @file{test.lisp} containing
1136 (cl:defpackage "TEST-C-CALL" (:use "CL" "SB-ALIEN" "SB-C-CALL"))
1137 (cl:in-package "TEST-C-CALL")
1139 ;;; Define the record C-STRUCT in Lisp.
1140 (define-alien-type nil
1145 ;;; Define the Lisp function interface to the C routine. It returns a
1146 ;;; pointer to a record of type C-STRUCT. It accepts four parameters:
1147 ;;; I, an int; S, a pointer to a string; R, a pointer to a C-STRUCT
1148 ;;; record; and A, a pointer to the array of 10 ints.
1150 ;;; The INLINE declaration eliminates some efficiency notes about heap
1151 ;;; allocation of alien values.
1152 (declaim (inline c-function))
1153 (define-alien-routine c-function
1154 (* (struct c-struct))
1157 (r (* (struct c-struct)))
1160 ;;; a function which sets up the parameters to the C function and
1161 ;;; actually calls it
1163 (with-alien ((ar (array int 10))
1164 (c-struct (struct c-struct)))
1165 (dotimes (i 10) ; Fill array.
1166 (setf (deref ar i) i))
1167 (setf (slot c-struct 'x) 20)
1168 (setf (slot c-struct 's) "a Lisp string")
1170 (with-alien ((res (* (struct c-struct))
1171 (c-function 5 "another Lisp string" (addr c-struct) ar)))
1172 (format t "~&back from C function~%")
1173 (multiple-value-prog1
1174 (values (slot res 'x)
1177 ;; Deallocate result. (after we are done referring to it:
1178 ;; "Pillage, *then* burn.")
1179 (free-alien res)))))
1182 To execute the above example, it is necessary to compile the C
1183 routine, e.g.: @samp{cc -c test.c && ld -shared -o test.so test.o} (In
1184 order to enable incremental loading with some linkers, you may need to
1185 say @samp{cc -G 0 -c test.c})
1187 Once the C code has been compiled, you can start up Lisp and load it in:
1188 @samp{sbcl}. Lisp should start up with its normal prompt.
1190 Within Lisp, compile the Lisp file. (This step can be done
1191 separately. You don't have to recompile every time.)
1192 @samp{(compile-file "test.lisp")}
1194 Within Lisp, load the foreign object file to define the necessary
1195 symbols: @samp{(load-shared-object "test.so")}.
1197 Now you can load the compiled Lisp (``fasl'') file into Lisp:
1198 @samp{(load "test.fasl")}
1199 And once the Lisp file is loaded, you can call the
1200 Lisp routine that sets up the parameters and calls the C
1202 @samp{(test-c-call::call-cfun)}
1204 The C routine should print the following information to standard output:
1208 s = another Lisp string
1210 r->s = a Lisp string
1223 After return from the C function,
1224 the Lisp wrapper function should print the following output:
1227 back from C function
1230 And upon return from the Lisp wrapper function,
1231 before the next prompt is printed, the
1232 Lisp read-eval-print loop should print the following return values: