I have written a tiny recursive bit of F# code to see how many levels of recursion I can fit onto the stack under .NET/Mono. It just prints the recursion depth whenever it i
An obvious explanation is that Mono will not obey the second argument of
Threadif it is too large. Does anybody please know how to convince Mono to allocate a large stack?
You are correct that Mono will limit the stack size, even if you pass in a large value. For example, on my Cent OS 64-bit test machine, the maximum stack size that Mono will allocate is 2 megabytes. The Mono C# source file Thread.cs shows us what happens when you create a Mono thread:
public Thread (ThreadStart start, int maxStackSize)
{
if (start == null)
throw new ArgumentNullException ("start");
threadstart = start;
Internal.stack_size = CheckStackSize (maxStackSize);
}
static int CheckStackSize (int maxStackSize)
{
if (maxStackSize < 0)
throw new ArgumentOutOfRangeException ("less than zero", "maxStackSize");
if (maxStackSize < 131072) // make sure stack is at least 128k big
return 131072;
int page_size = Environment.GetPageSize ();
if ((maxStackSize % page_size) != 0) // round up to a divisible of page size
maxStackSize = (maxStackSize / (page_size - 1)) * page_size;
int default_stack_size = (IntPtr.Size / 4) * 1024 * 1024; // from wthreads.c
if (maxStackSize > default_stack_size)
return default_stack_size;
return maxStackSize;
}
The code above puts a hard limit on the stack size.
You could in theory change code in one or both of the above functions (bold lines) so that a larger stack size is allocated. Once you did this you would have to build the Mono runtime and then run your function to see if the change makes a difference.
I should stress that I do not know enough about Mono to understand if allocating a larger stack will help in your specific case. I would only do this as a last resort (if neither of my other answers work).