Yes, it's got machine exceptions.  With the help of the MMU, we are able to detect when the stack is down to the last 64K, so there is no need for an alternate stack.  We can call a function from there, somewhat akin to signals.<div>

<br></div><div>The requirements are that:</div><div>- The native code is allowed to continue execution.</div><div>- The managed code throws a StackOverflowException that executes finally blocks.</div><div>- The root AppDomain continues running.<br>

<div><br></div><div>As I understand it, the stack overflow handling in Mono only works on certain OSes and doesn't satisfy all of our requirements.  It also seems that the ThreadAbortException handling satisfies all of these requirements, so that code would be an architecturally appropriate place to handle both.</div>

<div><br></div><div>The out-of-memory exception is almost the exact same story... When memory gets low, I want to be able to do something that allows native code to continue, but OutOfMemoryException is thrown when execution returns to managed code.  I assume there is no mechanism in there for this?</div>

<div><br></div><div>- Kipp<br><br><div class="gmail_quote">On Wed, Feb 1, 2012 at 8:21 AM, Rodrigo Kumpera <span dir="ltr"><<a href="mailto:kumpera@gmail.com">kumpera@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

What kind of machinery does your RTOS support? Something akin mach exception ports?<div><br></div><div>Because you either need something like an exception port or sigaltstack to handle stack overflows as it requires stack space anyways.</div>


<div><br></div><div>The way to implement this is to do the same logic as of altstack but from a remote thread, I suppose.<div><div class="h5"><br><div><br><br><div class="gmail_quote">On Tue, Jan 31, 2012 at 12:37 PM, Miguel Mudge <span dir="ltr"><<a href="mailto:michael.mudge@welchallyn.com" target="_blank">michael.mudge@welchallyn.com</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I'm not specifically interested in the abort machinery, but looks like it's in a good position to handle low of mem/stack.  Our RTOS also doesn't support signals at all.  Are there better places to handle and recover from low mem/stack?<div>




<br></div><div>- Kipp<div><div></div><div><br><div><br><div class="gmail_quote">On Tue, Jan 31, 2012 at 9:16 AM, Rodrigo Kumpera <span dir="ltr"><<a href="mailto:kumpera@gmail.com" target="_blank">kumpera@gmail.com</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Mono already handles that in the case of stack overflow by using sigaltstack. Why do you want the abort machinery to raise anything but their<div>related abort exceptions? <br><div><div><br><div class="gmail_quote"><div>



<div>
On Mon, Jan 30, 2012 at 5:08 PM, Miguel Mudge <span dir="ltr"><<a href="mailto:michael.mudge@welchallyn.com" target="_blank">michael.mudge@welchallyn.com</a>></span> wrote:<br>
</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div>We've got a single-process RTOS running Mono and we've started to tackle what happens when a stack overflow or out of memory condition occurs.<div>





<br></div><div>We're using an AppDomain to load and unload a variety of apps that come off the external flash drive.  When things go very wrong [StackOverflow or OutOfMemory], we terminate Mono entirely so the rest of the device can continue doing its job.</div>







<div><br></div><div>We'd like to be able to more gracefully handle StackOverflow, OutOfMemory so that finally clauses execute and the root AppDomain can continue running.  As I understand it, mono_throw_exception() throws immediately, but since stack/memory runs out unexpectedly, it's best if we have some spare memory/stack so the native code can finish what it was doing before managed exception handling starts cleaning up the mess.  So - we're looking for behavior closer to ThreadAbortException.</div>







<div><br></div><div>I see that in threads.c/mono_thread_execute_interruption(), thread->interruption_requested indicates that the ThreadAbortException should be thrown at the native->managed transition [among maybe some other actions].  I'm proposing that gets changed [or amended] to throw an arbitrary exception, both for future use and for our specific case.  Native code such as signal handlers would be able to cause an exception to be thrown only after execution returns to managed.  Our goal is to have several MB of guard pages (in spare memory and on the stack) available to handle the unwind.</div>







<div><br></div><div>Comments?  Am I on the right track here?  Any forseen gotchas?</div><div><br></div><div>- Kipp</div><div><br></div>
<br></div></div>_______________________________________________<br>
Mono-devel-list mailing list<br>
<a href="mailto:Mono-devel-list@lists.ximian.com" target="_blank">Mono-devel-list@lists.ximian.com</a><br>
<a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
<br></blockquote></div><br></div></div></div>
</blockquote></div><br></div></div></div></div>
</blockquote></div><br></div></div></div></div>
</blockquote></div><br></div></div>