Increase stack size on macOS as well as Linux

The code works fine on macOS, but the default stack size we attempt to
set is larger than what my system will allow (Nix attempts to set the
stack size to 67108864, but the maximum allowed is 67092480), so I've
instead used the requested stack size or the maximum allowed, whichever
is smaller.

I've also added an error message if setting the stack size fails. It
looks like this:

> Failed to increase stack size from 8372224 to 67108864 (maximum
> allowed stack size: 67092480): Invalid argument
This commit is contained in:
Rebecca Turner 2024-01-26 09:40:41 -08:00
parent 30bdee5c3b
commit 3a124d1e88
No known key found for this signature in database
2 changed files with 18 additions and 10 deletions

View File

@ -1,3 +1,6 @@
#include <algorithm>
#include <cstring>
#include "current-process.hh"
#include "namespaces.hh"
#include "util.hh"
@ -49,20 +52,27 @@ unsigned int getMaxCPU()
//////////////////////////////////////////////////////////////////////
#if __linux__
rlim_t savedStackSize = 0;
#endif
void setStackSize(size_t stackSize)
void setStackSize(rlim_t stackSize)
{
#if __linux__
struct rlimit limit;
if (getrlimit(RLIMIT_STACK, &limit) == 0 && limit.rlim_cur < stackSize) {
savedStackSize = limit.rlim_cur;
limit.rlim_cur = stackSize;
setrlimit(RLIMIT_STACK, &limit);
limit.rlim_cur = std::min(stackSize, limit.rlim_max);
if (setrlimit(RLIMIT_STACK, &limit) != 0) {
logger->log(
lvlError,
hintfmt(
"Failed to increase stack size from %1% to %2% (maximum allowed stack size: %3%): %4%",
savedStackSize,
stackSize,
limit.rlim_max,
std::strerror(errno)
).str()
);
}
}
#endif
}
void restoreProcessContext(bool restoreMounts)
@ -72,7 +82,6 @@ void restoreProcessContext(bool restoreMounts)
restoreMountNamespace();
}
#if __linux__
if (savedStackSize) {
struct rlimit limit;
if (getrlimit(RLIMIT_STACK, &limit) == 0) {
@ -80,7 +89,6 @@ void restoreProcessContext(bool restoreMounts)
setrlimit(RLIMIT_STACK, &limit);
}
}
#endif
}

View File

@ -16,7 +16,7 @@ unsigned int getMaxCPU();
/**
* Change the stack size.
*/
void setStackSize(size_t stackSize);
void setStackSize(rlim_t stackSize);
/**
* Restore the original inherited Unix process context (such as signal