Bingo thank you so much.<br clear="all">-Justin<br>
<br><br><div class="gmail_quote">On Wed, Oct 13, 2010 at 5:32 AM, Matthew Flatt <span dir="ltr">&lt;<a href="mailto:mflatt@cs.utah.edu">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;">
<div><div></div><div class="h5">At Tue, 12 Oct 2010 21:17:45 -0700, Justin Phillips wrote:<br>
&gt; I have a function that gets called by OS X&#39;s CoreMIDI framework. This<br>
&gt; function adds some data to a queue. I have registered the queue and the<br>
&gt; function with scheme_add_evt and scheme_add_evt_through_sema and even<br>
&gt; explicitly tried to block with scheme_block_until on separate occasions. In<br>
&gt; all instances, when the function gets called from CoreMIDI to add to my<br>
&gt; queue DrRacket dies because of EXC_BAD_ACCESS -- KERN_PROTECTION_FAILURE at<br>
&gt; 0x00 and the thread that crashed is the highest numbered thread (which is<br>
&gt; the DrRacket main thread no?) and it is in my function code. Am I setting<br>
&gt; something up wrong or could there be an issue with CoreMIDI? Any help would<br>
&gt; be greatly appreciated.<br>
<br>
</div></div>The lowest-numbered thread is normally the DrRacket main thread, so it<br>
sounds like a thread mismatch is the likely the problem.<br>
<br>
<br>
With a thread mismatch in 3m-cooperating code, you would get a crash<br>
almost immediately, because the thread-local table identifying the GC<br>
instance won&#39;t be there. If your callback is not using any Racket<br>
functions, then annotate the function with `XFORM_SKIP_PROC&#39;, like<br>
this:<br>
<br>
  void my_callback_in_wrong_thread(int arg)<br>
     XFORM_SKIP_PROC<br>
  {<br>
    ...<br>
  }<br>
<br>
The `XFORM_SKIP_PROC&#39; annotation tells the 3m-cooperation transformer<br>
to leave the function alone.<br>
<br>
<br>
If your callback is using Racket functions, then you have to change it<br>
so that&#39;s not the case. Although it sounds like you&#39;re not using<br>
`ffi/unsafe&#39;, you might be able to use it to help bridge threads. If<br>
you pass a callback to a foreign library where the callback will be<br>
invoked in a thread other than the main one, the `#:async-apply&#39; option<br>
of `_fun&#39; avoids the thread mismatch by sending the Racket callback<br>
back to the main thread for invocation.<br>
<br>
</blockquote></div><br>