// The default SIGSTKSZ on linux is 8K. If we do any logging in a signal // handler or do a stack unwind, this is too small. We allocate 32K // instead of the minimum signal stack size. // TODO: We shouldn't do logging (with locks) in signal handlers. static constexpr int kHostAltSigStackSize = 32 * KB < MINSIGSTKSZ ? MINSIGSTKSZ : 32 * KB;
void Thread::SetUpAlternateSignalStack() { // Create and set an alternate signal stack. #ifdef ART_TARGET_ANDROID
LOG(FATAL) << "Invalid use of alternate signal stack on Android"; #endif
stack_t ss;
ss.ss_sp = new uint8_t[kHostAltSigStackSize];
ss.ss_size = kHostAltSigStackSize;
ss.ss_flags = 0;
CHECK(ss.ss_sp != nullptr);
SigAltStack(&ss, nullptr);
// Double-check that it worked.
ss.ss_sp = nullptr;
SigAltStack(nullptr, &ss);
VLOG(threads) << "Alternate signal stack is " << PrettySize(ss.ss_size) << " at " << ss.ss_sp;
}
void Thread::TearDownAlternateSignalStack() { // Get the pointer so we can free the memory.
stack_t ss;
SigAltStack(nullptr, &ss);
uint8_t* allocated_signal_stack = reinterpret_cast<uint8_t*>(ss.ss_sp);
// Tell the kernel to stop using it.
ss.ss_sp = nullptr;
ss.ss_flags = SS_DISABLE;
ss.ss_size = kHostAltSigStackSize; // Avoid ENOMEM failure with Mac OS' buggy libc.
SigAltStack(&ss, nullptr);
// Free it. delete[] allocated_signal_stack;
}
void Thread::MadviseAwayAlternateSignalStack() { // We do not `madvise()` away the alternate signal stack on host.
}
} // namespace art
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-06-29)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.