Thanks for the tips, guys.  I've got one more (really trivial) problem:  I've got a small dylib to paper over FFI issues with some c macros I need: <span class="Apple-style-span" style="font-family: Monaco; font-size: 10px; color: rgb(100, 56, 32); ">FD_ZERO, FD_ISSET</span><span class="Apple-style-span" style="font-size: 10px; color: rgb(100, 56, 32); "><font class="Apple-style-span" face="arial, helvetica, sans-serif"> <span class="Apple-style-span" style="font-size: small;"><font class="Apple-style-span" color="#000000">and family.</font></span></font></span><div>
<font class="Apple-style-span" face="arial, helvetica, sans-serif"><br></font></div><div><span class="Apple-style-span" style="font-size: 10px; color: rgb(100, 56, 32); "><span class="Apple-style-span" style="font-size: small;"><font class="Apple-style-span" color="#000000"></font></span></span><font class="Apple-style-span" face="arial, helvetica, sans-serif">Anyways-I load the dylib:</font></div>
<div><font class="Apple-style-span" face="arial, helvetica, sans-serif"><div>(open-shared-library "/Users/development/Documents/networkServer/build/Release/libnetworkServer.dylib")</div></font></div><div><font class="Apple-style-span" face="arial, helvetica, sans-serif"><br>
</font></div><div><font class="Apple-style-span" face="arial, helvetica, sans-serif">and I can call the function when I use external-call directly:</font></div><div><font class="Apple-style-span" face="arial, helvetica, sans-serif"><div>
(defparameter *fd-set* (ccl::make-gcable-record fd_set))</div><div>(external-call "mike_fd_zero" (:* (:STRUCT :FD_SET)) *fd-set* :void)</div><div><br></div></font></div><div><font class="Apple-style-span" face="arial, helvetica, sans-serif">but when I load the interface directory I've set up, it doesn't find the method:</font></div>
<div><font class="Apple-style-span" face="arial, helvetica, sans-serif"><div>(use-interface-dir :network-helper )</div><div>#<INTERFACE-DIR :NETWORK-HELPER #P"network-helper/" #x3000416D290D></div><div>CL-USER> #_?mike_fd_zero</div>
</font></div><div><font class="Apple-style-span" face="arial, helvetica, sans-serif">NIL</font></div><div><font class="Apple-style-span" face="arial, helvetica, sans-serif"><br></font></div><div><font class="Apple-style-span" face="arial, helvetica, sans-serif">Does the dylib have to be in a certain place for the runtime to pick it up or something?  Am I missing a simple step?  Could I be messing something up when generating the ffi/cdb files?  Here's the meat of my populate.sh file:</font></div>
<div><font class="Apple-style-span" face="arial, helvetica, sans-serif"><br></font></div><div><font class="Apple-style-span" face="arial, helvetica, sans-serif"><div>CFLAGS="-m64 -fobjc-abi-version=1 -Wno-endif-labels -mmacosx-version-min=10.4.8";export CFLAGS</div>
<div>/Users/development/Applications/ffigen4/bin/h-to-ffi.sh /Users/development/Applications/ccl-head/darwin-x86-headers64/network-helper/C/interface.h </div><div><br></div><div>FYI I'm running this on the x86_64 build of CCL.</div>
<div><br></div><div>Anyways, thanks for the help so far!</div><div>Mike Kohout</div><div><br></div><div><br></div></font></div><div><div><div class="gmail_quote">On Sat, Sep 19, 2009 at 2:01 AM, Gary Byers <span dir="ltr"><<a href="mailto:gb@clozure.com">gb@clozure.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Two unrelated points (maybe three.  Hmm.  Some of them may be related.<br>
Ahem.)<br>
<br>
Some points:<br>
<br>
- If a structure has a non-scalar field (e.g., an array/strucure/union),<br>
  then<br>
<br>
  (pref ptr :struct_type.non_scalar_field_name)<br>
<br>
  returns a pointer to that field; if the field is scalar, then PREF returns<br>
  its value.<br>
<br>
  It doesn't make sense to talk about the value of a non-scalar, but it<br>
  does make sense to talk about either the value or address of a scalar.<br>
  As Matt notes, there's nothing in CCL's FFI that does that for you,<br>
  but something like:<br>
<br>
  (field-address pointer accessor) ; syntax like (PREF pointer accessor)<br>
<br>
  would be useful and easy to implement (as long as the field in question<br>
  was byte-addressable - it's hard to talk about the address of a bitfield.)<br>
<br>
- a signal mask is usually of type "sigset_t"; what a "sigset_t" is is<br>
  platform-dependent (it's sometimes just a 32-bit integer, other times<br>
  a small array of integers or bytes.  Depending on whether "sigset_t"<br>
  is a scalar or aggregate type, PREF might already be doing the right<br>
  thing.<br>
<br>
- it'd take a while to explain what the issues are (they're mostly related<br>
  to the GC), but there isn't really any support for user-defined signal<br>
  handlers in CCL.  (If/when there is, you'd basically have to use that<br>
  support rather than calling "sigaction" yourself.)<br>
<br>
  Until that support exists ... well, I was going to say that you might<br>
  be able to get away with a very simple handler that ran with all signals<br>
  masked, but I'm not even sure if that handler would be able to cons<br>
  safely.<br>
<br>
  The constraints in this case don't have to do with the FFI, but with<br>
  threads, the GC, and the way that they interact.<div><div></div><div class="h5"><br>
<br>
On Sat, 19 Sep 2009, R. Matthew Emerson wrote:<br>
<br>
</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div></div><div class="h5">
<br>
On Sep 18, 2009, at 6:24 PM, Michael Kohout wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Next week I'm doing a presentation to my local lisp user group on FFI<br>
(CFFI and CCL's FFI).  My example is a simple network client and<br>
server.<br>
<br>
Anyways, the code I'm writing requires me to get the address to a<br>
field in a struct( &sa.sa_mask, where sa is a sigaction structure).<br>
<br>
Does CCL's ffi system allow me to get this without munging around<br>
with the internal layout of the structure?  If so, how?<br>
</blockquote>
<br>
I don't know if this qualifies as munging around, but maybe this<br>
example will help.<br>
<br>
;; struct sigaction sa;<br>
;; (sort of;  in ccl, sa is a macptr referencing a stack-allocated<br>
structure)<br>
(rlet ((sa (:struct sigaction)))<br>
  ;; sa.sa_mask = 999;<br>
  (setf (pref sa :sigaction.sa_mask) 999)<br>
  ;; char *p = &sa.sa_mask<br>
  (with-macptrs ((p (%inc-ptr sa (ccl::get-field-<br>
offset :sigaction.sa_mask))))<br>
    ;; return *(long *)p;<br>
    (%get-long p)))<br>
<br>
If you don't really need a pointer to the sa_mask field and just want<br>
to know what its contents are (or to set them), you can use (pref<br>
sa :sigaction.sa_mask).<br>
<br></div></div>
_______________________________________________<br>
Openmcl-devel mailing list<br>
<a href="mailto:Openmcl-devel@clozure.com" target="_blank">Openmcl-devel@clozure.com</a><br>
<a href="http://clozure.com/mailman/listinfo/openmcl-devel" target="_blank">http://clozure.com/mailman/listinfo/openmcl-devel</a><br>
<br>
<br>
</blockquote>
</blockquote></div><br></div></div>