Allow for sig chain to be disabled.
Tools like dex2oat or patchoat don't need the sig chain or the fault
manager. This also enables building a statically link version of
dex2oat.
Change-Id: I9897728cac48acade854bb027bfde860628ebf84
diff --git a/runtime/parsed_options.cc b/runtime/parsed_options.cc
index 5e84df5..d08af71 100644
--- a/runtime/parsed_options.cc
+++ b/runtime/parsed_options.cc
@@ -257,6 +257,8 @@
.IntoKey(M::ZygoteMaxFailedBoots)
.Define("-Xno-dex-file-fallback")
.IntoKey(M::NoDexFileFallback)
+ .Define("-Xno-sig-chain")
+ .IntoKey(M::NoSigChain)
.Define("--cpu-abilist=_")
.WithType<std::string>()
.IntoKey(M::CpuAbiList)
diff --git a/runtime/runtime.cc b/runtime/runtime.cc
index 96c15ea..5fef8ae 100644
--- a/runtime/runtime.cc
+++ b/runtime/runtime.cc
@@ -191,6 +191,7 @@
implicit_null_checks_(false),
implicit_so_checks_(false),
implicit_suspend_checks_(false),
+ no_sig_chain_(false),
is_native_bridge_loaded_(false),
zygote_max_failed_boots_(0),
experimental_lambdas_(false) {
@@ -487,6 +488,8 @@
bool Runtime::Start() {
VLOG(startup) << "Runtime::Start entering";
+ CHECK(!no_sig_chain_) << "A started runtime should have sig chain enabled";
+
// Restore main thread state to kNative as expected by native code.
Thread* self = Thread::Current();
@@ -838,6 +841,8 @@
verify_ = runtime_options.GetOrDefault(Opt::Verify);
allow_dex_file_fallback_ = !runtime_options.Exists(Opt::NoDexFileFallback);
+ no_sig_chain_ = runtime_options.Exists(Opt::NoSigChain);
+
Split(runtime_options.GetOrDefault(Opt::CpuAbiList), ',', &cpu_abilist_);
if (runtime_options.GetOrDefault(Opt::Interpret)) {
@@ -933,33 +938,37 @@
break;
}
- // Always initialize the signal chain so that any calls to sigaction get
- // correctly routed to the next in the chain regardless of whether we
- // have claimed the signal or not.
- InitializeSignalChain();
+ if (!no_sig_chain_) {
+ // Dex2Oat's Runtime does not need the signal chain or the fault handler.
- if (implicit_null_checks_ || implicit_so_checks_ || implicit_suspend_checks_) {
- fault_manager.Init();
+ // Initialize the signal chain so that any calls to sigaction get
+ // correctly routed to the next in the chain regardless of whether we
+ // have claimed the signal or not.
+ InitializeSignalChain();
- // These need to be in a specific order. The null point check handler must be
- // after the suspend check and stack overflow check handlers.
- //
- // Note: the instances attach themselves to the fault manager and are handled by it. The manager
- // will delete the instance on Shutdown().
- if (implicit_suspend_checks_) {
- new SuspensionHandler(&fault_manager);
- }
+ if (implicit_null_checks_ || implicit_so_checks_ || implicit_suspend_checks_) {
+ fault_manager.Init();
- if (implicit_so_checks_) {
- new StackOverflowHandler(&fault_manager);
- }
+ // These need to be in a specific order. The null point check handler must be
+ // after the suspend check and stack overflow check handlers.
+ //
+ // Note: the instances attach themselves to the fault manager and are handled by it. The manager
+ // will delete the instance on Shutdown().
+ if (implicit_suspend_checks_) {
+ new SuspensionHandler(&fault_manager);
+ }
- if (implicit_null_checks_) {
- new NullPointerHandler(&fault_manager);
- }
+ if (implicit_so_checks_) {
+ new StackOverflowHandler(&fault_manager);
+ }
- if (kEnableJavaStackTraceHandler) {
- new JavaStackTraceHandler(&fault_manager);
+ if (implicit_null_checks_) {
+ new NullPointerHandler(&fault_manager);
+ }
+
+ if (kEnableJavaStackTraceHandler) {
+ new JavaStackTraceHandler(&fault_manager);
+ }
}
}
diff --git a/runtime/runtime.h b/runtime/runtime.h
index 3cd7404..bcc7118 100644
--- a/runtime/runtime.h
+++ b/runtime/runtime.h
@@ -715,6 +715,11 @@
bool implicit_so_checks_; // StackOverflow checks are implicit.
bool implicit_suspend_checks_; // Thread suspension checks are implicit.
+ // Whether or not the sig chain (and implicitly the fault handler) should be
+ // disabled. Tools like dex2oat or patchoat don't need them. This enables
+ // building a statically link version of dex2oat.
+ bool no_sig_chain_;
+
// Whether or not a native bridge has been loaded.
//
// The native bridge allows running native code compiled for a foreign ISA. The way it works is,
diff --git a/runtime/runtime_options.def b/runtime/runtime_options.def
index fc527b5..d5f7f97 100644
--- a/runtime/runtime_options.def
+++ b/runtime/runtime_options.def
@@ -91,6 +91,7 @@
RUNTIME_OPTIONS_KEY (BackgroundGcOption, BackgroundGc)
RUNTIME_OPTIONS_KEY (Unit, DisableExplicitGC)
+RUNTIME_OPTIONS_KEY (Unit, NoSigChain)
RUNTIME_OPTIONS_KEY (LogVerbosity, Verbose)
RUNTIME_OPTIONS_KEY (unsigned int, LockProfThreshold)
RUNTIME_OPTIONS_KEY (std::string, StackTraceFile)