[Mono-dev] Handling StackOverflow, OutOfMemory, ThreadAbortException
Rodrigo Kumpera
kumpera at gmail.com
Wed Feb 1 14:48:28 UTC 2012
On Wed, Feb 1, 2012 at 12:22 PM, Miguel Mudge
<michael.mudge at welchallyn.com>wrote:
> 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.
On which stack and thread is that function called? You obviously can't call
it on the overflown one.
> The requirements are that:
> - The native code is allowed to continue execution.
> - The managed code throws a StackOverflowException that executes finally
> blocks.
> - The root AppDomain continues running.
>
> 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.
>
Well, the thread abort machinery was devised to handle async exceptions
started from a foreign thread. You can definitely use the low level
machinery to implement
stack overflow on your target. I would be willing to merge changes that
improve the low level bits and stack overflow handling to enable such a
thing, but there's no
reason to butcher the thread abort specific bits just for a quick hack.
As I told you before, I can't make an informed comment until you give a
better picture of how exactly a stack overflow is handled on your RTOS.
Mono OVF code uses soft guard pages to enable native to continue once we
reach a soft limit in stack usage so we can safely finish processing and
raise a
managed exception. But once it hits the hard limit while in native code,
the only viable option is to abort.
> 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?
>
OOM is quite a different beast, it's handled synchronously since we know
exactly when we're out of managed memory. Mono doesn't handle native
allocation failures
well and this is something I would love to see patches for. Managed
allocation failures are well handled with sgen.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ximian.com/pipermail/mono-devel-list/attachments/20120201/36dc76f4/attachment.html>
More information about the Mono-devel-list
mailing list