<div>Let&#39;s take a concrete but &quot;made up&quot; case .. suppose we want to call through to pthread_create and pass the (void *) argument to pthread_create which in turn gets interpreted by the pthread that is launched. How would one populate the C struct that is passed to the launched pthread keeping in mind that this C struct is variable in length? From the FFI how would one model this C struct?</div>

<div>&nbsp;</div>
<div>Thanks, Vasili<br><br>&nbsp;</div>
<div><span class="gmail_quote">On 2/7/08, <b class="gmail_sendername">Adam Langley</b> &lt;<a href="mailto:agl@imperialviolet.org">agl@imperialviolet.org</a>&gt; wrote:</span>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">2008/2/7 Galchin Vasili &lt;<a href="mailto:vigalchin@gmail.com">vigalchin@gmail.com</a>&gt;:<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ok .. I am writing a Haskell function that will call down into the ANSI<br>
&gt; C library .. blah :: .... -&gt; Ptr Word8 ....-&gt; .... The underlying C function<br>&gt; that &quot;blah&quot; is calling has a &quot;void *&quot; so I am using &quot;Ptr Word&nbsp;&nbsp;8&quot; to model<br>&gt; the &quot;void *&quot;.<br>
<br>Depending on the context, &quot;void *&quot; is generally either taken as a Ptr<br>() (for an opaque pointer) or Ptr Word8 (for calls like memcpy).<br><br>&gt; I propose to have the callers of function &quot;blah&quot; to populate a<br>
&gt; data structure something like &quot;Ptr Buz&quot; where &quot;data Buz = { ........} and<br>&gt; then do a &quot;recast :: Ptr Word 8 -&gt; Ptr Buz&quot; when invoking function &quot;blah&quot;.<br>&gt; Does this seem reasonable? Is there a better way?<br>
<br>Generally, Ptr x is only used where x is either a shadow type or a<br>Bits type. Having a Ptr Baz where Baz is an ADT seems a little odd. If<br>you need to translate a structure from Haskell to C code, probably you<br>
are better off having callers pass in a Baz then, internal to the<br>wrapping, fill out the C structure and call the FFI function with a<br>Ptr CBaz (where CBaz is a shadow type).<br><br><br>AGL<br><br>--<br>Adam Langley&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="mailto:agl@imperialviolet.org">agl@imperialviolet.org</a><br>
<a href="http://www.imperialviolet.org">http://www.imperialviolet.org</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 650-283-9641<br></blockquote></div><br>