<div dir="ltr"><div><div><div><div><div><div><div>Hello everyone,<br><br></div>I'm currently calling Haskell code from C. My goal is to apply a Haskell function to each element of some dataset that I get from outside Haskell-land. For now, before I make this fancier and more efficient, the plan is to just bring the RTS up with hs_init, call my Haskell function (exporter to C with 'foreign export ccall [...]') on the element and finally shut the RTS down, doing this for every element.<br><br></div>When running this, I realized the RTS was running into a segfault when calling the Haskell function on the second element. This led me to believe it wasn't possible to call hs_init()/hs_exit() multiple times in the same program. But then I checked the Haskell 2010 report, FFI section [1], and it says:<br><br><div style="margin-left:40px"><i>The function <span class="">hs_init()</span> initialises the Haskell system and
provides it with the available command line arguments. Upon return, the arguments solely intended for the Haskell
runtime system are removed (i.e., the values that <span class="">argc</span> and <span class="">argv</span> point to may have changed). This function must be
called during program startup before any Haskell function is invoked; otherwise, the system behaviour is undefined.
Conversely, the Haskell system is deinitialised by a call to <span class="">hs_exit()</span>. Multiple invocations of <span class="">hs_init()</span> are
permitted, provided that they are followed by an equal number of calls to <span class="">hs_exit()</span> and that the first call to
<span class="">hs_exit()</span> is after the last call to <span class="">hs_init()</span>. In addition to nested calls to <span class="">hs_init()</span>, the Haskell
system may be de-initialised with <span class="">hs_exit()</span> and be re-initialised with <span class="">hs_init()</span> at a later point in
time. This ensures that repeated initialisation due to multiple libraries being implemented in Haskell is
covered.
 </i><br></div><br></div>Which means, if I understand correctly, that what I want, while very inefficient, should work fine.<br><br></div>I've put together a minimal example that exhibits the problem, which can be found at <a href="https://github.com/alpmestan/simple-c-export">https://github.com/alpmestan/simple-c-export</a> :<br><br>- <a href="https://github.com/alpmestan/simple-c-export/blob/master/run-haskell.c">https://github.com/alpmestan/simple-c-export/blob/master/run-haskell.c</a> shows the C code that brings the RTS up and down, with some printf statements to show what's going on.<br><br>- <a href="https://github.com/alpmestan/simple-c-export/blob/master/Foo.hs">https://github.com/alpmestan/simple-c-export/blob/master/Foo.hs</a> shows the trivial Haskell function I'm exposing.<br><br>- <a href="https://github.com/alpmestan/simple-c-export/blob/master/simple-c-export.cabal">https://github.com/alpmestan/simple-c-export/blob/master/simple-c-export.cabal</a> contains the build options I'm compiling the code with<br><br></div>When running this on my machine (OS X, ghc 7.8.3 and 7.10.2), I always get:<br><br><div style="margin-left:40px">$ cabal run simple-c<br>Preprocessing executable 'simple-c' for simple-c-export-0.1...<br>Linking dist/build/simple-c/simple-c ...<br>Running simple-c...<br>#0 - Launching RTS...<br>#0 - RTS started! Calling Haskell function...<br>0<br>#0 - Killing RTS now...<br>#0 - RTS killed!<br>#1 - Launching RTS...<br>#1 - RTS started! Calling Haskell function...<br>Segmentation fault: 11<br></div><br></div>Is there something special I should do to make this work, that I'm overlooking? Or is this a bug (that I should report on Trac, I guess) ?<br><br></div>Thanks in advance for any clarification on this.<br clear="all"><div><div><div><div><div><div><div><div><br>-- <br><div class="gmail_signature">Alp Mestanogullari</div>
</div></div></div></div></div></div></div></div></div>