On Fri, Jun 25, 2010 at 7:31 AM, Neil Baylis <span dir="ltr"><<a href="mailto:neil.baylis@gmail.com">neil.baylis@gmail.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

I'm making a program that receives messages from the iPhone App touchOSC. These messages are packaged into UPD datagrams.[....]<div>I want to make a c library that's callable from lisp. I was thinking of [...]<br>

</div>
<div></div><div>void init_osc(int port, void(*callback)(char* data));[...] <br></div></blockquote><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

<div>When liblo receives an OSC message, it will call this callback, passing it an ordinary c string representation of the message. <br></div></blockquote></div><br>Let's see, you want a function pointer that has that precise signature and which executes some lisp code. This is doable and the FFI (and also CFFI) provide methods. The problem is your precise requirement<br>

<br><blockquote style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;" class="gmail_quote">This callback will be made in the context of a thread spawned by liblo 
during the init_osc() call.<br clear="all"></blockquote><br>This thread will not be managed by ECL, which means that the garbage collector will have no information about its stack boundaries and will not be able to function properly.<br>

<br>There exist functions in ECL for registering and de-registering a thread with ECL / the garbage collector. However, this may be tricky and slow, and those functions are not available in the lisp environment -- they only work from C and would force you to first write the C wrapper, calling<br>

<br>extern ECL_API bool ecl_import_current_thread(cl_object process_name, cl_object process_binding);<br>extern ECL_API void ecl_release_current_thread(void);<br><br>before and after the C code that actually invokes the lisp code.<br>

<br>A simpler solution would be to make your callback a trivial C wrapper that communicates with a lisp thread, passing a message, something that does not cons.<br><br>Alternatively we could extend ECL to execute callbacks in fresh new threads -- they would be automatically registered with ECL because of our existing interceptions of pthread_create and similar functions --. This should not be difficult to do, but requires some knowledge of how ECL works and extending the existing code for callbacks.<br>

<br>Juanjo<br><br>-- <br>Instituto de Física Fundamental, CSIC<br>c/ Serrano, 113b, Madrid 28006 (Spain) <br><a href="http://juanjose.garciaripoll.googlepages.com">http://juanjose.garciaripoll.googlepages.com</a><br>