Home
Reading
Searching
Subscribe
Sponsors
Statistics
Posting
Contact
Spam
Lists
Links
About
Hosting
Filtering
Features Download
Marketing
Archives
FAQ
Blog
 
Gmane
From: Martin Simmons <martin <at> lispworks.com>
Subject: Re: Passing Lisp objects to through the FLI?
Newsgroups: gmane.lisp.lispworks.general
Date: Monday 17th November 2008 14:09:25 UTC (over 9 years ago)
The static arrays will be GCed, but maybe not as often as for a non-static
arrays.

You could also do it with FLI arrays (I've not tested the performance):

(defun fun-3 (array)
  (fli:with-dynamic-foreign-objects ()
    (let* ((size (array-dimension array 0))
	   (f-array (fli:allocate-dynamic-foreign-object
                     :type '(:unsigned :char)  ; assumes array elts are
(unsigned-byte 8)
                     :nelems size)))
    (fli:replace-foreign-array f-array array :end1 size)
    (fli-function f-array size))))

__Martin


>>>>> On Thu, 13 Nov 2008 14:25:49 +0800, Chun Tian (binghe) said:
> 
> Hi, Martin
> 
> I have a related question, please give me some advice:
> 
> I wrote a function which accept a array as arguments then pass it into  
> FLI functions. The array arguments usually is not "allocated in static  
> area", so I have to copy elements into another static array then pass  
> the static array to FLI functions.
> 
> I think out two way to do that: one is create the static array each  
> the function be called, the other is just create one static array  
> outside of the function on load-time, and always use it. Like  
> following sample:
> 
> (defun fun-1 (array)
>    (let* ((size (array-dimension array 0))
>           (s-array (make-array size :allocation :static)))
>      (replace s-array array)
>      (fli-function s-array size)))
> 
> (defvar *buffer* (make-array +max-size+ :allocation :static))
> (defvar *lock*   (mp:make-lock))
> 
> (defun fun-2 (array)
>    (let ((size (array-dimension array 0)))
>      (mp:with-lock (*lock*)
>        (replace *buffer* array)
>        (fli-function *buffer* size))))
> 
> Above code cannot run, just to indicate. In FUN-1, the S-ARRAY be  
> create each time, I don't know if the "static array" would be GCed  
> when program run out of the scope of FUN-1. In FUN-2, I think I have  
> to use a lock to protect the global *BUFFER* from thread-safe.
> 
> For heavily called of FUN-1/FUN-2, my test shows FUN-2's performance  
> is much better then FUN-1 because no additional array allocated, so  
> the FUN-2 is my current choice.
> 
> Is there any better solution from the view of you, a LW expert?
> 
> On 2008-11-13, at 1:19, Martin Simmons wrote:
> 
> >
> >>>>>> On Tue, 11 Nov 2008 12:59:12 -0800, massung  said:
> >>
> >> Is it possible to pass a Lisp object (not a foreign object or a  
> >> simple
> >> literal ala fixnum/string) to a foreign function and be returned  
> >> later? I
> >> assume the big concern would be the garbage collector moving (or even
> >> releasing) the memory for the Lisp object, but perhaps #'in-static- 
> >> area can
> >> help here?
> >>
> >> Basically, there are some functions I'd like to call that accept a  
> >> void*
> >> for user data. It would be incredibly convenient if I could send a  
> >> specific
> >> or class instance or struct through the user data and get it back  
> >> later via
> >> another foreign function call.
> >>
> >> Is that doable somehow? Or, if someone knows a another method, I'm  
> >> all
> >> ears. ;-)
> >
> > The only kinds of Lisp object that are safe to pass directly to C  
> > are static
> > arrays (see http://www.lispworks.com/documentation/lw51/FLI/html/fli-130.htm
> > and http://www.lispworks.com/documentation/lw51/FLI/html/fli-152.htm
 
> > for ways
> > to do that).
> >
> > For other objects, you need to pass a handle, e.g. an integer with a  
> > lookup
> > table as suggested by Luke.
> >
> > -- 
> > Martin Simmons
> > LispWorks Ltd
> > http://www.lispworks.com/
> >
> 
> --
> Chun Tian (binghe)
> NetEase.com, Inc.
> P. R. China
> 
> 
> 
> 
> 

-- 
Martin Simmons
LispWorks Ltd
http://www.lispworks.com/
 
CD: 10ms