<div dir="ltr"><div>That explains a lot, thanks. Just found the relevant doc part:<br><a href="http://docs.racket-lang.org/foreign/intro.html?q=_string#%28part._.Pointers_and_.Manual_.Allocation%29">http://docs.racket-lang.org/foreign/intro.html?q=_string#%28part._.Pointers_and_.Manual_.Allocation%29</a><br>

</div><div>(and next subsection)<br></div><div>Maybe just adding a link to this paragraph under the doc for `_string&#39; could be useful then.<br></div><div><br></div>Laurent<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">

On Sat, Jun 15, 2013 at 5:15 PM, Matthew Flatt <span dir="ltr">&lt;<a href="mailto:mflatt@cs.utah.edu" target="_blank">mflatt@cs.utah.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

With<br>
<br>
 (fun _string -&gt; _void)<br>
<br>
keep in mind that `_string&#39; means that a Racket-level Unicode string is<br>
converted (by UTF-8 encoding) to a newly allocated array of bytes.<br>
Nothing that you do to with Racket string affects the memory management<br>
of the allocated bytes.<br>
<br>
The byte string is allocated as GCable, which means that the bytes can<br>
move or be collected. That works fine as long as the foreign function<br>
is effectively atomic (i.e., no GCs happen between the call and return<br>
of the foreign function).<br>
<br>
If the foreign function retains the pointer you give it, then you&#39;ll<br>
need to take much more control. Either use `(malloc &#39;raw ...)&#39; and<br>
`free&#39;, or use `(malloc &#39;atomic-interior ...)&#39; and ensure that the<br>
result remains reachable for as long as its referenced by the foreign<br>
function. Also, use the type<br>
<br>
  (fun _pointer -&gt; _void)<br>
<br>
for the foreign function, so that the pointer you allocate is passed<br>
through.<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
At Sat, 15 Jun 2013 08:26:39 -0400, Hendrik Boom wrote:<br>
&gt; On Sat, Jun 15, 2013 at 02:15:04PM +0200, Laurent wrote:<br>
&gt; &gt; On Sat, Jun 15, 2013 at 1:55 PM, Roman Klochkov &lt;<a href="mailto:kalimehtar@mail.ru">kalimehtar@mail.ru</a>&gt; wrote:<br>
&gt; &gt;<br>
&gt; &gt; &gt; What about<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; (define-lib foo (fun _string -&gt; _void))<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; (foo &quot;Test&quot;)<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; ?<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; Will be the pointer from string &quot;Test&quot; freed?<br>
&gt; &gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; I *think* Racket will garbage collect the &quot;Test&quot; value when it is not used<br>
&gt; &gt; anymore on the Racket side, but it won&#39;t know what happens on the ffi C<br>
&gt; &gt; side (hence the &quot;ffi/unsafe&quot;).<br>
&gt; &gt; So I think the lib may point to a freed value if you&#39;re not cautious.<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; &gt; And how to make it retain, if I need to save it on the foreign side?<br>
&gt; &gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; You can probably at least simply store it in a global variable. There may<br>
&gt; &gt; be a better way to do it though.<br>
&gt; &gt; For example (not tested) :<br>
&gt; &gt; #lang racket<br>
&gt; &gt; (define dontfreethem &#39;())<br>
&gt; &gt; (define (dontfreeme x)<br>
&gt; &gt;   (set! dontfreethem (cons x dontfreethem))<br>
&gt; &gt;   x)<br>
&gt; &gt;<br>
&gt; &gt; (foo (dontfreeme &quot;Test&quot;))<br>
&gt; &gt;<br>
&gt; &gt; Laurent<br>
&gt;<br>
&gt; But the garbage collector can still move the string when collecting, so<br>
&gt; protecting it from being freed isn&#39;t enough.<br>
&gt;<br>
&gt; Isn&#39;t there some way to declare an object immovable?<br>
&gt;<br>
&gt; -- hendrik<br>
&gt;<br>
&gt;<br>
&gt; &gt; ____________________<br>
&gt; &gt;   Racket Users list:<br>
&gt; &gt;   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
&gt;<br>
&gt; ____________________<br>
&gt;   Racket Users list:<br>
&gt;   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</div></div></blockquote></div><br></div>